57 lines
1 KiB
Go
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)
|
|
}
|