github.com/songzhibin97/gkit@v1.2.13/internal/stat/rolling_counter.go (about) 1 package stat 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 // RollingCounter 滚动窗口接口 9 type RollingCounter interface { 10 Metric 11 Aggregation 12 Timespan() int 13 // Reduce 将缩减功能应用于窗口内的所有存储桶。 14 Reduce(func(Iterator) float64) float64 15 } 16 17 // rollingCounter: 实现接口 RollingCounter 18 type rollingCounter struct { 19 policy *RollingPolicy 20 } 21 22 func (r *rollingCounter) Add(val int64) { 23 if val < 0 { 24 panic(fmt.Errorf("stat/metric: cannot decrease in value. val: %d", val)) 25 } 26 r.policy.Add(float64(val)) 27 } 28 29 func (r *rollingCounter) Reduce(f func(Iterator) float64) float64 { 30 return r.policy.Reduce(f) 31 } 32 33 func (r *rollingCounter) Avg() float64 { 34 return r.policy.Reduce(Avg) 35 } 36 37 func (r *rollingCounter) Min() float64 { 38 return r.policy.Reduce(Min) 39 } 40 41 func (r *rollingCounter) Max() float64 { 42 return r.policy.Reduce(Max) 43 } 44 45 func (r *rollingCounter) Sum() float64 { 46 return r.policy.Reduce(Sum) 47 } 48 49 func (r *rollingCounter) Value() int64 { 50 return int64(r.Sum()) 51 } 52 53 func (r *rollingCounter) Timespan() int { 54 return r.policy.timespan() 55 } 56 57 // NewRollingCounter 实例化 RollingCounter 方法 58 func NewRollingCounter(size int, bucketDuration time.Duration) RollingCounter { 59 window := NewWindow(size) 60 policy := NewRollingPolicy(window, bucketDuration) 61 return &rollingCounter{ 62 policy: policy, 63 } 64 }