123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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++
- }
|