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 }