diff --git a/src/server/engine/mute.go b/src/server/engine/mute.go index 40e5a095d8f24bf2da9ba7d06e5768deaae3b940..9dc1208bcfa83572750015547c1afb362622ceda 100644 --- a/src/server/engine/mute.go +++ b/src/server/engine/mute.go @@ -5,14 +5,15 @@ import ( "github.com/didi/nightingale/v5/src/server/memsto" ) -func isMuted(event *models.AlertCurEvent) bool { +// 如果传入了clock这个可选参数,就表示使用这个clock表示的时间,否则就从event的字段中取TriggerTime +func isMuted(event *models.AlertCurEvent, clock ...int64) bool { mutes, has := memsto.AlertMuteCache.Gets(event.GroupId) if !has || len(mutes) == 0 { return false } for i := 0; i < len(mutes); i++ { - if matchMute(event, mutes[i]) { + if matchMute(event, mutes[i], clock...) { return true } } @@ -20,8 +21,13 @@ func isMuted(event *models.AlertCurEvent) bool { return false } -func matchMute(event *models.AlertCurEvent, mute *models.AlertMute) bool { - if event.TriggerTime < mute.Btime || event.TriggerTime > mute.Etime { +func matchMute(event *models.AlertCurEvent, mute *models.AlertMute, clock ...int64) bool { + ts := event.TriggerTime + if len(clock) > 0 { + ts = clock[0] + } + + if ts < mute.Btime || ts > mute.Etime { return false } diff --git a/src/server/engine/repeat.go b/src/server/engine/repeat.go index 5791be37c549545338d029ffd9e2b5dea8be7d8e..3e6ddfd6b6057e34ef335a95cd7b6d56eb1a0cc9 100644 --- a/src/server/engine/repeat.go +++ b/src/server/engine/repeat.go @@ -49,23 +49,16 @@ func repeat() { event.DB2Mem() // 重复通知的告警,应该用新的时间来判断是否生效和是否屏蔽, - // 不能使用TriggerTime,因为TriggerTime是触发时的时间, - // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断 - // 就还是会发,不符合预期,所以,这里伪装一下TriggerTime, - // 判断完了再卸掉伪装 - realTriggerTime := event.TriggerTime - event.TriggerTime = event.NotifyRepeatNext - - if isNoneffective(event.TriggerTime, rule) { + // 不能使用TriggerTime,因为TriggerTime是触发时的时间,是一个比较老的时间 + // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断,就还是会发,不符合预期 + if isNoneffective(event.NotifyRepeatNext, rule) { continue } - if isMuted(event) { + if isMuted(event, event.NotifyRepeatNext) { continue } - event.TriggerTime = realTriggerTime - fillUsers(event) notify(event)