Browse Source

add serverStats

Xiang Li 12 years ago
parent
commit
896c944c7e
5 changed files with 64 additions and 19 deletions
  1. 1 1
      command.go
  2. 3 0
      raft_handlers.go
  3. 22 15
      raft_server.go
  4. 35 3
      raft_stats.go
  5. 3 0
      transporter.go

+ 1 - 1
command.go

@@ -171,7 +171,7 @@ func (c *JoinCommand) Apply(raftServer *raft.Server) (interface{}, error) {
 	etcdStore.Set(key, value, time.Unix(0, 0), raftServer.CommitIndex())
 
 	if c.Name != r.Name() {
-		r.peersStats[c.Name] = &peerStats{MinLatency: 1 << 63}
+		r.peersStats[c.Name] = &raftPeerStats{MinLatency: 1 << 63}
 	}
 
 	return b, err

+ 3 - 0
raft_handlers.go

@@ -42,6 +42,9 @@ func AppendEntriesHttpHandler(w http.ResponseWriter, req *http.Request) {
 
 	if err == nil {
 		debugf("[recv] POST %s/log/append [%d]", r.url, len(aereq.Entries))
+
+		r.serverStats.RecvAppendReq(aereq.LeaderName)
+
 		if resp := r.AppendEntries(aereq); resp != nil {
 			w.WriteHeader(http.StatusOK)
 			json.NewEncoder(w).Encode(resp)

+ 22 - 15
raft_server.go

@@ -17,13 +17,14 @@ import (
 
 type raftServer struct {
 	*raft.Server
-	version    string
-	joinIndex  uint64
-	name       string
-	url        string
-	tlsConf    *TLSConfig
-	tlsInfo    *TLSInfo
-	peersStats map[string]*peerStats
+	version     string
+	joinIndex   uint64
+	name        string
+	url         string
+	tlsConf     *TLSConfig
+	tlsInfo     *TLSInfo
+	peersStats  map[string]*raftPeerStats
+	serverStats *raftServerStats
 }
 
 var r *raftServer
@@ -39,13 +40,14 @@ func newRaftServer(name string, url string, tlsConf *TLSConfig, tlsInfo *TLSInfo
 	check(err)
 
 	return &raftServer{
-		Server:     server,
-		version:    raftVersion,
-		name:       name,
-		url:        url,
-		tlsConf:    tlsConf,
-		tlsInfo:    tlsInfo,
-		peersStats: make(map[string]*peerStats),
+		Server:      server,
+		version:     raftVersion,
+		name:        name,
+		url:         url,
+		tlsConf:     tlsConf,
+		tlsInfo:     tlsInfo,
+		peersStats:  make(map[string]*raftPeerStats),
+		serverStats: &raftServerStats{},
 	}
 }
 
@@ -270,7 +272,12 @@ func joinByMachine(s *raft.Server, machine string, scheme string) error {
 }
 
 func (r *raftServer) Stats() []byte {
-	b, _ := json.Marshal(r.peersStats)
+	sBytes, _ := json.Marshal(r.serverStats)
+
+	pBytes, _ := json.Marshal(r.peersStats)
+
+	b := append(sBytes, pBytes...)
+
 	return b
 }
 

+ 35 - 3
raft_stats.go

@@ -3,9 +3,41 @@ package main
 import (
 	"math"
 	"time"
+
+	"github.com/coreos/go-raft"
 )
 
-type peerStats struct {
+type raftServerStats struct {
+	State                string
+	StartTime            time.Time
+	Leader               string
+	leaderStartTime      time.Time
+	LeaderUptime         time.Duration
+	RecvAppendRequestCnt uint64
+	SendAppendRequestCnt uint64
+}
+
+func (ss *raftServerStats) RecvAppendReq(leaderName string) {
+	ss.State = raft.Follower
+	if leaderName != ss.Leader {
+		ss.Leader = leaderName
+		ss.leaderStartTime = time.Now()
+	}
+
+	ss.RecvAppendRequestCnt++
+}
+
+func (ss *raftServerStats) SendAppendReq() {
+	if ss.State != raft.Leader {
+		ss.State = raft.Leader
+		ss.Leader = r.Name()
+		ss.leaderStartTime = time.Now()
+	}
+
+	ss.SendAppendRequestCnt++
+}
+
+type raftPeerStats struct {
 	Latency          float64 `json:"latency"`
 	AvgLatency       float64 `json:"averageLatency"`
 	avgLatencySquare float64
@@ -16,11 +48,11 @@ type peerStats struct {
 	SuccCnt          uint64  `json:"successCount"`
 }
 
-func (ps *peerStats) Fail() {
+func (ps *raftPeerStats) Fail() {
 	ps.FailCnt++
 }
 
-func (ps *peerStats) Succ(d time.Duration) {
+func (ps *raftPeerStats) Succ(d time.Duration) {
 
 	total := float64(ps.SuccCnt) * ps.AvgLatency
 	totalSquare := float64(ps.SuccCnt) * ps.avgLatencySquare

+ 3 - 0
transporter.go

@@ -47,6 +47,9 @@ func dialTimeout(network, addr string) (net.Conn, error) {
 func (t transporter) SendAppendEntriesRequest(server *raft.Server, peer *raft.Peer, req *raft.AppendEntriesRequest) *raft.AppendEntriesResponse {
 	var aersp *raft.AppendEntriesResponse
 	var b bytes.Buffer
+
+	r.serverStats.SendAppendReq()
+
 	json.NewEncoder(&b).Encode(req)
 
 	u, _ := nameToRaftURL(peer.Name)