Xiang Li пре 12 година
родитељ
комит
f75c309d26
2 измењених фајлова са 47 додато и 16 уклоњено
  1. 24 8
      raft_server.go
  2. 23 8
      raft_stats.go

+ 24 - 8
raft_server.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"bytes"
+	"container/list"
 	"crypto/tls"
 	"encoding/binary"
 	"encoding/json"
@@ -40,14 +41,17 @@ 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]*raftPeerStats),
-		serverStats: &raftServerStats{},
+		Server:     server,
+		version:    raftVersion,
+		name:       name,
+		url:        url,
+		tlsConf:    tlsConf,
+		tlsInfo:    tlsInfo,
+		peersStats: make(map[string]*raftPeerStats),
+		serverStats: &raftServerStats{
+			StartTime:     time.Now(),
+			sendRateQueue: list.New(),
+		},
 	}
 }
 
@@ -272,6 +276,18 @@ func joinByMachine(s *raft.Server, machine string, scheme string) error {
 }
 
 func (r *raftServer) Stats() []byte {
+
+	r.serverStats.LeaderUptime = time.Now().Sub(r.serverStats.leaderStartTime).String()
+
+	queue := r.serverStats.sendRateQueue
+
+	frontValue, _ := queue.Front().Value.(time.Time)
+	backValue, _ := queue.Back().Value.(time.Time)
+
+	sampleDuration := backValue.Sub(frontValue)
+
+	r.serverStats.SendingRate = float64(queue.Len()) / float64(sampleDuration) * float64(time.Second)
+
 	sBytes, _ := json.Marshal(r.serverStats)
 
 	pBytes, _ := json.Marshal(r.peersStats)

+ 23 - 8
raft_stats.go

@@ -1,20 +1,27 @@
 package main
 
 import (
+	"container/list"
 	"math"
 	"time"
 
 	"github.com/coreos/go-raft"
 )
 
+type runtimeStats struct {
+}
+
 type raftServerStats struct {
-	State                string
-	StartTime            time.Time
-	Leader               string
-	leaderStartTime      time.Time
-	LeaderUptime         time.Duration
-	RecvAppendRequestCnt uint64
-	SendAppendRequestCnt uint64
+	State                 string
+	StartTime             time.Time
+	Leader                string
+	leaderStartTime       time.Time
+	LeaderUptime          string
+	RecvAppendRequestCnt  uint64
+	SendAppendRequestCnt  uint64
+	SendAppendReqeustRate uint64
+	sendRateQueue         *list.List
+	SendingRate           float64
 }
 
 func (ss *raftServerStats) RecvAppendReq(leaderName string) {
@@ -28,10 +35,18 @@ func (ss *raftServerStats) RecvAppendReq(leaderName string) {
 }
 
 func (ss *raftServerStats) SendAppendReq() {
+	now := time.Now()
 	if ss.State != raft.Leader {
 		ss.State = raft.Leader
 		ss.Leader = r.Name()
-		ss.leaderStartTime = time.Now()
+		ss.leaderStartTime = now
+	}
+
+	if ss.sendRateQueue.Len() < 200 {
+		ss.sendRateQueue.PushBack(now)
+	} else {
+		ss.sendRateQueue.PushBack(now)
+		ss.sendRateQueue.Remove(ss.sendRateQueue.Front())
 	}
 
 	ss.SendAppendRequestCnt++