goProject/trunk/goutil/counter-util/counter.go
皮蛋13361098506 1b77f62820 初始化项目
2025-01-06 16:01:02 +08:00

61 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}