mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package server
|
|
|
|
import (
|
|
"math"
|
|
"time"
|
|
)
|
|
|
|
type raftFollowersStats struct {
|
|
Leader string `json:"leader"`
|
|
Followers map[string]*raftFollowerStats `json:"followers"`
|
|
}
|
|
|
|
func NewRaftFollowersStats(name string) *raftFollowersStats {
|
|
return &raftFollowersStats{
|
|
Leader: name,
|
|
Followers: make(map[string]*raftFollowerStats),
|
|
}
|
|
}
|
|
|
|
type raftFollowerStats struct {
|
|
Latency struct {
|
|
Current float64 `json:"current"`
|
|
Average float64 `json:"average"`
|
|
averageSquare float64
|
|
StandardDeviation float64 `json:"standardDeviation"`
|
|
Minimum float64 `json:"minimum"`
|
|
Maximum float64 `json:"maximum"`
|
|
} `json:"latency"`
|
|
|
|
Counts struct {
|
|
Fail uint64 `json:"fail"`
|
|
Success uint64 `json:"success"`
|
|
} `json:"counts"`
|
|
}
|
|
|
|
// Succ function update the raftFollowerStats with a successful send
|
|
func (ps *raftFollowerStats) Succ(d time.Duration) {
|
|
total := float64(ps.Counts.Success) * ps.Latency.Average
|
|
totalSquare := float64(ps.Counts.Success) * ps.Latency.averageSquare
|
|
|
|
ps.Counts.Success++
|
|
|
|
ps.Latency.Current = float64(d) / (1000000.0)
|
|
|
|
if ps.Latency.Current > ps.Latency.Maximum {
|
|
ps.Latency.Maximum = ps.Latency.Current
|
|
}
|
|
|
|
if ps.Latency.Current < ps.Latency.Minimum {
|
|
ps.Latency.Minimum = ps.Latency.Current
|
|
}
|
|
|
|
ps.Latency.Average = (total + ps.Latency.Current) / float64(ps.Counts.Success)
|
|
ps.Latency.averageSquare = (totalSquare + ps.Latency.Current*ps.Latency.Current) / float64(ps.Counts.Success)
|
|
|
|
// sdv = sqrt(avg(x^2) - avg(x)^2)
|
|
ps.Latency.StandardDeviation = math.Sqrt(ps.Latency.averageSquare - ps.Latency.Average*ps.Latency.Average)
|
|
}
|
|
|
|
// Fail function update the raftFollowerStats with a unsuccessful send
|
|
func (ps *raftFollowerStats) Fail() {
|
|
ps.Counts.Fail++
|
|
}
|