diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go index a91365d..b02c49e 100644 --- a/cmd/dashboard/controller/member_api.go +++ b/cmd/dashboard/controller/member_api.go @@ -600,6 +600,7 @@ type alertRuleForm struct { Name string RulesRaw string NotificationTag string + TriggerMode int Enable string } @@ -642,6 +643,7 @@ func (ma *memberAPI) addOrEditAlertRule(c *gin.Context) { r.RulesRaw = arf.RulesRaw r.NotificationTag = arf.NotificationTag enable := arf.Enable == "on" + r.TriggerMode = arf.TriggerMode r.Enable = &enable r.ID = arf.ID //保证NotificationTag不为空 diff --git a/model/alertrule.go b/model/alertrule.go index 032e616..126289a 100644 --- a/model/alertrule.go +++ b/model/alertrule.go @@ -7,6 +7,11 @@ import ( "gorm.io/gorm" ) +const ( + ModeAlwaysTrigger = 0 + ModeOnetimeTrigger = 1 +) + type CycleTransferStats struct { Name string From time.Time @@ -23,6 +28,7 @@ type AlertRule struct { Name string RulesRaw string Enable *bool + TriggerMode int `gorm:"default:0"` // 触发模式: 0-始终触发(默认) 1-单次触发 NotificationTag string // 该报警规则所在的通知组 Rules []Rule `gorm:"-" json:"-"` } diff --git a/service/singleton/alertsentinel.go b/service/singleton/alertsentinel.go index f178ae1..5d5b244 100644 --- a/service/singleton/alertsentinel.go +++ b/service/singleton/alertsentinel.go @@ -153,13 +153,19 @@ func checkStatus() { // 保存当前服务器状态信息 curServer := model.Server{} copier.Copy(&curServer, server) + + // 本次未通过检查 if !passed { - alertsPrevState[alert.ID][server.ID] = _RuleCheckFail - message := fmt.Sprintf("[%s] %s(%s) %s", Localizer.MustLocalize(&i18n.LocalizeConfig{ - MessageID: "Incident", - }), server.Name, IPDesensitize(server.Host.IP), alert.Name) - go SendNotification(alert.NotificationTag, message, true, &curServer) + // 始终触发模式或上次检查不为失败时触发报警(跳过单次触发+上次失败的情况) + if alert.TriggerMode == model.ModeAlwaysTrigger || alertsPrevState[alert.ID][server.ID] != _RuleCheckFail { + alertsPrevState[alert.ID][server.ID] = _RuleCheckFail + message := fmt.Sprintf("[%s] %s(%s) %s", Localizer.MustLocalize(&i18n.LocalizeConfig{ + MessageID: "Incident", + }), server.Name, IPDesensitize(server.Host.IP), alert.Name) + go SendNotification(alert.NotificationTag, message, true, &curServer) + } } else { + // 本次通过检查但上一次的状态为失败,则发送恢复通知 if alertsPrevState[alert.ID][server.ID] == _RuleCheckFail { message := fmt.Sprintf("[%s] %s(%s) %s", Localizer.MustLocalize(&i18n.LocalizeConfig{ MessageID: "Resolved",