From 076a996a8b4c46e0c17418fe1394e9c3c39b305f Mon Sep 17 00:00:00 2001 From: Philip O Toole Date: Mon, 4 Apr 2016 18:43:49 -0700 Subject: [PATCH] Support expvar data --- cmd/rqlited/main.go | 3 +++ http/service.go | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/cmd/rqlited/main.go b/cmd/rqlited/main.go index 39c15abc..a3450859 100644 --- a/cmd/rqlited/main.go +++ b/cmd/rqlited/main.go @@ -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()) diff --git a/http/service.go b/http/service.go index 3509df2f..2ea94668 100644 --- a/http/service.go +++ b/http/service.go @@ -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