Browse Source

etcd: support v2 store stats endpoint

Xiang Li 11 years ago
parent
commit
10b2f88b83
3 changed files with 45 additions and 5 deletions
  1. 7 5
      etcd/etcd.go
  2. 6 0
      etcd/v2_http.go
  3. 32 0
      etcd/v2_http_endpoint_test.go

+ 7 - 5
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
 }

+ 6 - 0
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) {

+ 32 - 0
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)
+}