diff --git a/etcd/etcd.go b/etcd/etcd.go index 0adda95e4..7a900cab3 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -19,11 +19,12 @@ const ( defaultTickDuration = time.Millisecond * 100 - v2machineKVPrefix = "/_etcd/machines" - v2Prefix = "/v2/keys" - v2machinePrefix = "/v2/machines" - v2peersPrefix = "/v2/peers" - v2LeaderPrefix = "/v2/leader" + v2machineKVPrefix = "/_etcd/machines" + v2Prefix = "/v2/keys" + v2machinePrefix = "/v2/machines" + v2peersPrefix = "/v2/peers" + v2LeaderPrefix = "/v2/leader" + v2StoreStatsPrefix = "/v2/stats/store" raftPrefix = "/raft" ) @@ -81,6 +82,7 @@ func New(c *config.Config, id int) *Server { m.Handle(v2machinePrefix, handlerErr(s.serveMachines)) m.Handle(v2peersPrefix, handlerErr(s.serveMachines)) m.Handle(v2LeaderPrefix, handlerErr(s.serveLeader)) + m.Handle(v2StoreStatsPrefix, handlerErr(s.serveStoreStats)) s.Handler = m return s } diff --git a/etcd/v2_http.go b/etcd/v2_http.go index 9edd7421d..9d1bc43b7 100644 --- a/etcd/v2_http.go +++ b/etcd/v2_http.go @@ -54,6 +54,12 @@ func (s *Server) serveLeader(w http.ResponseWriter, r *http.Request) error { return fmt.Errorf("no leader") } +func (s *Server) serveStoreStats(w http.ResponseWriter, req *http.Request) error { + w.Header().Set("Content-Type", "application/json") + w.Write(s.Store.JsonStats()) + return nil +} + type handlerErr func(w http.ResponseWriter, r *http.Request) error func (eh handlerErr) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/etcd/v2_http_endpoint_test.go b/etcd/v2_http_endpoint_test.go index 6ed8a2966..b8381dd34 100644 --- a/etcd/v2_http_endpoint_test.go +++ b/etcd/v2_http_endpoint_test.go @@ -1,12 +1,15 @@ package etcd import ( + "encoding/json" "io/ioutil" "net/http" "reflect" "sort" "strings" "testing" + + "github.com/coreos/etcd/store" ) func TestMachinesEndPoint(t *testing.T) { @@ -82,3 +85,32 @@ func TestLeaderEndPoint(t *testing.T) { } afterTest(t) } + +func TestStoreStatsEndPoint(t *testing.T) { + es, hs := buildCluster(1) + waitCluster(t, es) + + resp, err := http.Get(hs[0].URL + v2StoreStatsPrefix) + if err != nil { + t.Errorf("%v", err) + } + stats := new(store.Stats) + d := json.NewDecoder(resp.Body) + err = d.Decode(stats) + resp.Body.Close() + if err != nil { + t.Errorf("%v", err) + } + + if stats.SetSuccess != 1 { + t.Errorf("setSuccess = %d, want 1", stats.SetSuccess) + } + + for i := range es { + es[len(es)-i-1].Stop() + } + for i := range hs { + hs[len(hs)-i-1].Close() + } + afterTest(t) +}