raft_stats.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package main
  2. import (
  3. "container/list"
  4. "math"
  5. "time"
  6. "github.com/coreos/go-raft"
  7. )
  8. const (
  9. queueCapacity = 200
  10. )
  11. type runtimeStats struct {
  12. }
  13. type packageStats struct {
  14. sendingTime time.Time
  15. size uint64
  16. }
  17. type raftServerStats struct {
  18. State string
  19. StartTime time.Time
  20. Leader string
  21. leaderStartTime time.Time
  22. LeaderUptime string
  23. RecvAppendRequestCnt uint64
  24. SendAppendRequestCnt uint64
  25. SendAppendReqeustRate uint64
  26. sendRateQueue *list.List
  27. recvRateQueue *list.List
  28. SendingRate float64
  29. }
  30. func (ss *raftServerStats) RecvAppendReq(leaderName string) {
  31. ss.State = raft.Follower
  32. if leaderName != ss.Leader {
  33. ss.Leader = leaderName
  34. ss.leaderStartTime = time.Now()
  35. }
  36. ss.RecvAppendRequestCnt++
  37. }
  38. func (ss *raftServerStats) SendAppendReq() {
  39. now := time.Now()
  40. if ss.State != raft.Leader {
  41. ss.State = raft.Leader
  42. ss.Leader = r.Name()
  43. ss.leaderStartTime = now
  44. }
  45. if ss.sendRateQueue.Len() < 200 {
  46. ss.sendRateQueue.PushBack(now)
  47. } else {
  48. ss.sendRateQueue.PushBack(now)
  49. ss.sendRateQueue.Remove(ss.sendRateQueue.Front())
  50. }
  51. ss.SendAppendRequestCnt++
  52. }
  53. type raftPeerStats struct {
  54. Latency float64 `json:"latency"`
  55. AvgLatency float64 `json:"averageLatency"`
  56. avgLatencySquare float64
  57. SdvLatency float64 `json:"sdvLatency"`
  58. MinLatency float64 `json:"minLatency"`
  59. MaxLatency float64 `json:"maxLatency"`
  60. FailCnt uint64 `json:"failsCount"`
  61. SuccCnt uint64 `json:"successCount"`
  62. }
  63. func (ps *raftPeerStats) Fail() {
  64. ps.FailCnt++
  65. }
  66. func (ps *raftPeerStats) Succ(d time.Duration) {
  67. total := float64(ps.SuccCnt) * ps.AvgLatency
  68. totalSquare := float64(ps.SuccCnt) * ps.avgLatencySquare
  69. ps.SuccCnt++
  70. ps.Latency = float64(d) / (1000000.0)
  71. if ps.Latency > ps.MaxLatency {
  72. ps.MaxLatency = ps.Latency
  73. }
  74. if ps.Latency < ps.MinLatency {
  75. ps.MinLatency = ps.Latency
  76. }
  77. ps.AvgLatency = (total + ps.Latency) / float64(ps.SuccCnt)
  78. ps.avgLatencySquare = (totalSquare + ps.Latency*ps.Latency) / float64(ps.SuccCnt)
  79. // sdv = sqrt(avg(x^2) - avg(x)^2)
  80. ps.SdvLatency = math.Sqrt(ps.avgLatencySquare - ps.AvgLatency*ps.AvgLatency)
  81. }
  82. type statsQueue struct {
  83. items [queueCapacity]*packageStats
  84. size int
  85. front int
  86. back int
  87. }
  88. func (q *statsQueue) Len() int {
  89. return q.size
  90. }
  91. func (q *statsQueue) Front() *packageStats {
  92. if q.size != 0 {
  93. return q.items[q.front]
  94. }
  95. return nil
  96. }
  97. func (q *statsQueue) Back() *packageStats {
  98. if q.size != 0 {
  99. return q.items[q.back]
  100. }
  101. return nil
  102. }
  103. func (q *statsQueue) Insert(p *packageStats) {
  104. q.back = (q.back + 1) % queueCapacity
  105. q.items[q.back] = p
  106. if q.size == queueCapacity {
  107. q.front = (q.back + 1) % queueCapacity
  108. } else {
  109. q.size++
  110. }
  111. }