diff --git a/raft_stats.go b/raft_stats.go index 7c447bae6..9c572afc9 100644 --- a/raft_stats.go +++ b/raft_stats.go @@ -8,9 +8,18 @@ import ( "github.com/coreos/go-raft" ) +const ( + queueCapacity = 200 +) + type runtimeStats struct { } +type packageStats struct { + sendingTime time.Time + size uint64 +} + type raftServerStats struct { State string StartTime time.Time @@ -21,6 +30,7 @@ type raftServerStats struct { SendAppendRequestCnt uint64 SendAppendReqeustRate uint64 sendRateQueue *list.List + recvRateQueue *list.List SendingRate float64 } @@ -90,3 +100,38 @@ func (ps *raftPeerStats) Succ(d time.Duration) { // sdv = sqrt(avg(x^2) - avg(x)^2) ps.SdvLatency = math.Sqrt(ps.avgLatencySquare - ps.AvgLatency*ps.AvgLatency) } + +type statsQueue struct { + items [queueCapacity]*packageStats + size int + front int + back int +} + +func (q *statsQueue) Len() int { + return q.size +} + +func (q *statsQueue) Front() *packageStats { + if q.size != 0 { + return q.items[q.front] + } + return nil +} + +func (q *statsQueue) Back() *packageStats { + if q.size != 0 { + return q.items[q.back] + } + return nil +} + +func (q *statsQueue) Insert(p *packageStats) { + q.back = (q.back + 1) % queueCapacity + q.items[q.back] = p + if q.size == queueCapacity { + q.front = (q.back + 1) % queueCapacity + } else { + q.size++ + } +}