raft_follower_stats.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package etcdserver
  2. import (
  3. "math"
  4. "time"
  5. )
  6. type raftFollowersStats struct {
  7. Leader string `json:"leader"`
  8. Followers map[string]*raftFollowerStats `json:"followers"`
  9. }
  10. func NewRaftFollowersStats(name string) *raftFollowersStats {
  11. return &raftFollowersStats{
  12. Leader: name,
  13. Followers: make(map[string]*raftFollowerStats),
  14. }
  15. }
  16. func (fs *raftFollowersStats) Follower(name string) *raftFollowerStats {
  17. follower, ok := fs.Followers[name]
  18. if !ok {
  19. follower = &raftFollowerStats{}
  20. follower.Latency.Minimum = 1 << 63
  21. fs.Followers[name] = follower
  22. }
  23. return follower
  24. }
  25. func (fs *raftFollowersStats) Reset() {
  26. fs.Followers = make(map[string]*raftFollowerStats)
  27. }
  28. type raftFollowerStats struct {
  29. Latency struct {
  30. Current float64 `json:"current"`
  31. Average float64 `json:"average"`
  32. averageSquare float64
  33. StandardDeviation float64 `json:"standardDeviation"`
  34. Minimum float64 `json:"minimum"`
  35. Maximum float64 `json:"maximum"`
  36. } `json:"latency"`
  37. Counts struct {
  38. Fail uint64 `json:"fail"`
  39. Success uint64 `json:"success"`
  40. } `json:"counts"`
  41. }
  42. // Succ function update the raftFollowerStats with a successful send
  43. func (ps *raftFollowerStats) Succ(d time.Duration) {
  44. total := float64(ps.Counts.Success) * ps.Latency.Average
  45. totalSquare := float64(ps.Counts.Success) * ps.Latency.averageSquare
  46. ps.Counts.Success++
  47. ps.Latency.Current = float64(d) / (1000000.0)
  48. if ps.Latency.Current > ps.Latency.Maximum {
  49. ps.Latency.Maximum = ps.Latency.Current
  50. }
  51. if ps.Latency.Current < ps.Latency.Minimum {
  52. ps.Latency.Minimum = ps.Latency.Current
  53. }
  54. ps.Latency.Average = (total + ps.Latency.Current) / float64(ps.Counts.Success)
  55. ps.Latency.averageSquare = (totalSquare + ps.Latency.Current*ps.Latency.Current) / float64(ps.Counts.Success)
  56. // sdv = sqrt(avg(x^2) - avg(x)^2)
  57. ps.Latency.StandardDeviation = math.Sqrt(ps.Latency.averageSquare - ps.Latency.Average*ps.Latency.Average)
  58. }
  59. // Fail function update the raftFollowerStats with a unsuccessful send
  60. func (ps *raftFollowerStats) Fail() {
  61. ps.Counts.Fail++
  62. }