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  }