From 32d15e116e7d81568a4ec9aa4704a059a3d17900 Mon Sep 17 00:00:00 2001 From: Akkia Date: Tue, 13 Sep 2022 04:01:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=A6=E5=8F=91=E6=8A=A5=E8=AD=A6?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E9=80=9A=E7=9F=A5=E6=94=AF=E6=8C=81=E4=BB=85?= =?UTF-8?q?=E5=8F=91=E9=80=81=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/dashboard/controller/member_api.go | 2 ++ model/alertrule.go | 6 ++++++ service/singleton/alertsentinel.go | 16 +++++++++++----- 3 files changed, 19 insertions(+), 5 deletions(-) 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",