1
0
Fork 0

Support expvar data

master
Philip O Toole 9 years ago
parent ac92530a6d
commit 076a996a8b

@ -31,6 +31,7 @@ const sqliteDSN = "db.sqlite"
var httpAddr string
var raftAddr string
var joinAddr string
var expvar bool
var dsn string
var inMem bool
var disRedirect bool
@ -42,6 +43,7 @@ func init() {
flag.StringVar(&httpAddr, "http", "localhost:4001", "HTTP query server bind address")
flag.StringVar(&raftAddr, "raft", "localhost:4002", "Raft communication bind address")
flag.StringVar(&joinAddr, "join", "", "host:port of leader to join")
flag.BoolVar(&expvar, "expvar", true, "Serve expvar data on HTTP server")
flag.StringVar(&dsn, "dsn", "", `SQLite DSN parameters. E.g. "cache=shared&mode=memory"`)
flag.BoolVar(&inMem, "mem", false, "Use an in-memory database")
flag.BoolVar(&disRedirect, "noredir", true, "Disable leader-redirect")
@ -104,6 +106,7 @@ func main() {
// Create the HTTP query server.
s := httpd.New(httpAddr, store)
s.DisableRedirect = disRedirect
s.Expvar = expvar
if err := s.Start(); err != nil {
log.Fatalf("failed to start HTTP server: %s", err.Error())

@ -4,6 +4,8 @@ package http
import (
"encoding/json"
"expvar"
"fmt"
"io/ioutil"
"net"
"net/http"
@ -72,6 +74,7 @@ type Service struct {
start time.Time // Start up time.
lastBackup time.Time // Time of last successful backup.
Expvar bool
DisableRedirect bool // Disable leader-redirection.
}
@ -125,6 +128,8 @@ func (s *Service) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.handleJoin(w, r)
case strings.HasPrefix(r.URL.Path, "/status"):
s.handleStatus(w, r)
case r.URL.Path == "/debug/vars" && s.Expvar:
serveExpvar(w, r)
default:
w.WriteHeader(http.StatusNotFound)
}
@ -353,6 +358,21 @@ func (s *Service) Addr() net.Addr {
return s.ln.Addr()
}
// serveExpvar serves registered expvar information over HTTP.
func serveExpvar(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
fmt.Fprintf(w, "{\n")
first := true
expvar.Do(func(kv expvar.KeyValue) {
if !first {
fmt.Fprintf(w, ",\n")
}
first = false
fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value)
})
fmt.Fprintf(w, "\n}\n")
}
func writeResponse(w http.ResponseWriter, r *http.Request, j *Response) {
var b []byte
var err error

Loading…
Cancel
Save