old_console/correlator/stat/stat.go
2024-11-02 14:12:45 +03:00

57 lines
1 KiB
Go

package stat
import (
"encoding/json"
"fmt"
"time"
)
// How many values we store to calculate average time
const avgCount = 10
// AvgTime Structure for average time calculations
type AvgTime struct {
Value time.Duration `json:"value"`
index uint64
duration [avgCount]time.Duration
}
// Add time
func (stat *AvgTime) Add(d time.Duration) {
if stat.index%avgCount == 0 {
stat.Value = 0
for _, cur := range stat.duration {
stat.Value += cur
}
stat.Value = stat.Value / avgCount
}
stat.duration[stat.index%avgCount] = d
stat.index++
}
// AddStat sum current average time with other
func (stat *AvgTime) AddStat(newStat *AvgTime) {
for _, cur := range newStat.duration {
stat.Add(cur)
}
}
func (stat AvgTime) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Value string `json:"value"`
}{
Value: fmt.Sprintf("%v", stat.Value),
})
}
func (stat AvgTime) String() string {
bytes, err := json.Marshal(stat)
if err != nil {
return fmt.Sprintf("Can't serialize: %v", err)
}
return string(bytes)
}