raft_server_stats.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package etcdserver
  2. import (
  3. "sync"
  4. "time"
  5. )
  6. type raftServerStats struct {
  7. Name string `json:"name"`
  8. State string `json:"state"`
  9. StartTime time.Time `json:"startTime"`
  10. LeaderInfo struct {
  11. Name string `json:"leader"`
  12. Uptime string `json:"uptime"`
  13. StartTime time.Time `json:"startTime"`
  14. } `json:"leaderInfo"`
  15. RecvAppendRequestCnt uint64 `json:"recvAppendRequestCnt,"`
  16. RecvingPkgRate float64 `json:"recvPkgRate,omitempty"`
  17. RecvingBandwidthRate float64 `json:"recvBandwidthRate,omitempty"`
  18. SendAppendRequestCnt uint64 `json:"sendAppendRequestCnt"`
  19. SendingPkgRate float64 `json:"sendPkgRate,omitempty"`
  20. SendingBandwidthRate float64 `json:"sendBandwidthRate,omitempty"`
  21. sendRateQueue *statsQueue
  22. recvRateQueue *statsQueue
  23. sync.Mutex
  24. }
  25. func NewRaftServerStats(name string) *raftServerStats {
  26. stats := &raftServerStats{
  27. Name: name,
  28. StartTime: time.Now(),
  29. sendRateQueue: &statsQueue{
  30. back: -1,
  31. },
  32. recvRateQueue: &statsQueue{
  33. back: -1,
  34. },
  35. }
  36. stats.LeaderInfo.StartTime = time.Now()
  37. return stats
  38. }
  39. func (ss *raftServerStats) Reset() {
  40. name := ss.Name
  41. ss = NewRaftServerStats(name)
  42. return
  43. }
  44. func (ss *raftServerStats) RecvAppendReq(leaderName string, pkgSize int) {
  45. ss.Lock()
  46. defer ss.Unlock()
  47. ss.State = stateFollower
  48. if leaderName != ss.LeaderInfo.Name {
  49. ss.LeaderInfo.Name = leaderName
  50. ss.LeaderInfo.StartTime = time.Now()
  51. }
  52. ss.recvRateQueue.Insert(NewPackageStats(time.Now(), pkgSize))
  53. ss.RecvAppendRequestCnt++
  54. }
  55. func (ss *raftServerStats) SendAppendReq(pkgSize int) {
  56. ss.Lock()
  57. defer ss.Unlock()
  58. now := time.Now()
  59. if ss.State != stateLeader {
  60. ss.State = stateLeader
  61. ss.LeaderInfo.Name = ss.Name
  62. ss.LeaderInfo.StartTime = now
  63. }
  64. ss.sendRateQueue.Insert(NewPackageStats(now, pkgSize))
  65. ss.SendAppendRequestCnt++
  66. }