@@ -2,6 +2,7 @@ package process
22
33import (
44 "fmt"
5+ "slices"
56 "strings"
67 "time"
78 "watchAlert/internal/ctx"
@@ -46,47 +47,53 @@ func HandleAlert(ctx *ctx.Context, processType string, faultCenter models.FaultC
4647 return nil
4748 }
4849
49- // 获取当前事件等级对应的 Hook 和 Sign
50- Hook , Sign := getNoticeHookUrlAndSign (noticeData , severity )
51-
50+ // 获取当前事件等级对应的路由配置
51+ routes := getNoticeRoutes (noticeData , severity )
5252 for _ , event := range events {
5353 if processType == "alarm" && ! event .IsRecovered {
5454 event .LastSendTime = curTime
5555 ctx .Redis .Alert ().PushAlertEvent (event )
5656 }
5757
58- phoneNumber := func () []string {
59- if len (event .DutyUserPhoneNumber ) > 0 {
60- return event .DutyUserPhoneNumber
58+ if len (routes ) == 0 {
59+ logc .Infof (ctx .Ctx , "没用匹配的通知策略, 告警事件名称: %s, 通知对象名称: %s" , event .RuleName , noticeData .Name )
60+ }
61+
62+ for _ , route := range routes {
63+ // 设置值班用户信息
64+ event .DutyUser = strings .Join (GetDutyUsers (ctx , noticeData , route .NoticeType ), " " )
65+
66+ // 生成告警内容
67+ content := generateAlertContent (ctx , event , noticeData , route )
68+
69+ // 构建邮件信息
70+ email := models.Email {
71+ Subject : route .Subject ,
72+ To : route .To ,
73+ CC : route .CC ,
6174 }
62- if len (noticeData .PhoneNumber ) > 0 {
63- return noticeData .PhoneNumber
75+
76+ // 发送告警
77+ err := sender .Sender (ctx , sender.SendParams {
78+ TenantId : event .TenantId ,
79+ EventId : event .EventId ,
80+ RuleName : event .RuleName ,
81+ Severity : event .Severity ,
82+ NoticeType : route .NoticeType ,
83+ NoticeId : noticeId ,
84+ NoticeName : noticeData .Name ,
85+ IsRecovered : event .IsRecovered ,
86+ Hook : route .Hook ,
87+ Email : email ,
88+ Content : content ,
89+ Sign : route .Sign ,
90+ })
91+ if err != nil {
92+ logc .Error (ctx .Ctx , fmt .Sprintf ("Failed to send alert: %v" , err ))
6493 }
65- return []string {}
66- }()
67-
68- event .DutyUser = strings .Join (GetDutyUsers (ctx , noticeData ), " " )
69- event .DutyUserPhoneNumber = GetDutyUserPhoneNumber (ctx , noticeData )
70- content := generateAlertContent (ctx , event , noticeData )
71- err := sender .Sender (ctx , sender.SendParams {
72- TenantId : event .TenantId ,
73- EventId : event .EventId ,
74- RuleName : event .RuleName ,
75- Severity : event .Severity ,
76- NoticeType : noticeData .NoticeType ,
77- NoticeId : noticeId ,
78- NoticeName : noticeData .Name ,
79- IsRecovered : event .IsRecovered ,
80- Hook : Hook ,
81- Email : getNoticeEmail (noticeData , severity ),
82- Content : content ,
83- PhoneNumber : phoneNumber ,
84- Sign : Sign ,
85- })
86- if err != nil {
87- logc .Error (ctx .Ctx , fmt .Sprintf ("Failed to send alert: %v" , err ))
8894 }
8995 }
96+
9097 return nil
9198 })
9299 }
@@ -143,32 +150,18 @@ func getNoticeData(ctx *ctx.Context, tenantId, noticeId string) (models.AlertNot
143150 return ctx .DB .Notice ().Get (tenantId , noticeId )
144151}
145152
146- // getNoticeHookUrlAndSign 获取事件等级对应的 Hook 和 Sign
147- func getNoticeHookUrlAndSign (notice models.AlertNotice , severity string ) (string , string ) {
148- if notice .Routes != nil {
149- for _ , hook := range notice .Routes {
150- if hook .Severity == severity {
151- return hook .Hook , hook .Sign
152- }
153- }
154- }
155- return notice .DefaultHook , notice .DefaultSign
156- }
157-
158- // getNoticeEmail 获取事件等级对应的 Email
159- func getNoticeEmail (notice models.AlertNotice , severity string ) models.Email {
153+ // getNoticeRoutes 获取事件等级对应的路由配置
154+ func getNoticeRoutes (notice models.AlertNotice , severity string ) []models.Route {
155+ var routes []models.Route
160156 if notice .Routes != nil {
161157 for _ , route := range notice .Routes {
162- if route .Severity == severity {
163- return models.Email {
164- Subject : notice .Email .Subject ,
165- To : route .To ,
166- CC : route .CC ,
167- }
158+ if slices .Contains (route .Severitys , severity ) {
159+ routes = append (routes , route )
168160 }
169161 }
170162 }
171- return notice .Email
163+
164+ return routes
172165}
173166
174167type WebhookContent struct {
@@ -177,8 +170,8 @@ type WebhookContent struct {
177170}
178171
179172// generateAlertContent 生成告警内容
180- func generateAlertContent (ctx * ctx.Context , alert * models.AlertCurEvent , noticeData models.AlertNotice ) string {
181- if noticeData .NoticeType == "CustomHook " {
173+ func generateAlertContent (ctx * ctx.Context , alert * models.AlertCurEvent , noticeData models.AlertNotice , route models. Route ) string {
174+ if route .NoticeType == "WebHook " {
182175 users , ok := ctx .DB .DutyCalendar ().GetDutyUserInfo (* noticeData .GetDutyId (), time .Now ().Format ("2006-1-2" ))
183176 if ! ok || len (users ) == 0 {
184177 logc .Error (ctx .Ctx , "Failed to get duty users, noticeName: " , noticeData .Name )
@@ -200,5 +193,7 @@ func generateAlertContent(ctx *ctx.Context, alert *models.AlertCurEvent, noticeD
200193
201194 return tools .JsonMarshalToString (content )
202195 }
203- return templates .NewTemplate (ctx , * alert , noticeData ).CardContentMsg
196+
197+ // 使用新的模板系统
198+ return templates .NewTemplate (ctx , * alert , route ).CardContentMsg
204199}
0 commit comments