61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
|
|
package counter_util
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// CounterUtil
|
|||
|
|
// @description: 固定窗口计数器辅助类
|
|||
|
|
type CounterUtil struct {
|
|||
|
|
tag string // tag counter标识
|
|||
|
|
num int // num 当前计数
|
|||
|
|
warnNum int // warnNum 警告数量
|
|||
|
|
windowsTime time.Time // windowsTime 窗口时间
|
|||
|
|
checkSameWindowsFun func(t1, t2 time.Time) bool // checkSameWindowsFun 比较是否同一个时间窗口
|
|||
|
|
warnAction func(tag string, num int, t time.Time) // warnAction 监控回调方法
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewCounterUtil
|
|||
|
|
// @description: 构造计数器
|
|||
|
|
// parameter:
|
|||
|
|
// @_tag:tag标识,会在WarnAction中传递回来
|
|||
|
|
// @_warnNum:告警数量
|
|||
|
|
// @_checkWindowFun:比较是否同一个时间窗口
|
|||
|
|
// @_warnAction:指定数量触发回调
|
|||
|
|
// return:
|
|||
|
|
// @*CounterUtil:固定窗口计数器辅助类
|
|||
|
|
func NewCounterUtil(_tag string, _warnNum int, _checkWindowFun func(t1, t2 time.Time) bool, _warnAction func(tag string, num int, t time.Time)) *CounterUtil {
|
|||
|
|
r := &CounterUtil{
|
|||
|
|
tag: _tag,
|
|||
|
|
warnNum: _warnNum,
|
|||
|
|
windowsTime: time.Now(),
|
|||
|
|
checkSameWindowsFun: _checkWindowFun,
|
|||
|
|
warnAction: _warnAction,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return r
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AddNum
|
|||
|
|
// @description: 添加数量
|
|||
|
|
// parameter:
|
|||
|
|
// @receiver c:计数器
|
|||
|
|
// @n:增加的数量
|
|||
|
|
// return:
|
|||
|
|
// @int:计数器当前的数量
|
|||
|
|
func (c *CounterUtil) AddNum(n int) int {
|
|||
|
|
if !c.checkSameWindowsFun(c.windowsTime, time.Now()) {
|
|||
|
|
c.num = 0
|
|||
|
|
c.windowsTime = time.Now()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 增加次数
|
|||
|
|
c.num += n
|
|||
|
|
if c.num >= c.warnNum {
|
|||
|
|
c.warnAction(c.tag, c.num, time.Now())
|
|||
|
|
c.num = 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return c.num
|
|||
|
|
}
|