Skip to content

Commit 8b1b5f0

Browse files
author
Cairry
committed
🚀 Refactor notice object route logic
1 parent 6b939ec commit 8b1b5f0

File tree

15 files changed

+130
-234
lines changed

15 files changed

+130
-234
lines changed

alert/consumer/subscribe.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ package consumer
22

33
import (
44
"fmt"
5-
"github.com/zeromicro/go-zero/core/logc"
65
"strings"
76
"watchAlert/internal/ctx"
87
"watchAlert/internal/models"
98
"watchAlert/pkg/sender"
109
"watchAlert/pkg/templates"
1110
"watchAlert/pkg/tools"
11+
12+
"github.com/zeromicro/go-zero/core/logc"
1213
)
1314

1415
type toUser struct {
@@ -85,7 +86,7 @@ func sendToSubscribeUser(ctx *ctx.Context, alert models.AlertCurEvent, toUsers [
8586
// 释放信号量
8687
<-sem
8788
}()
88-
emailTemp := templates.NewTemplate(ctx, alert, models.AlertNotice{NoticeType: "Email", NoticeTmplId: u.NoticeTemplateId})
89+
emailTemp := templates.NewTemplate(ctx, alert, models.Route{NoticeType: "Email", NoticeTmplId: u.NoticeTemplateId})
8990
err := sender.NewEmailSender().Send(sender.SendParams{
9091
IsRecovered: alert.IsRecovered,
9192
Email: models.Email{

alert/probe/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ func (s *ProbeService) getOrCreateWriter(datasourceId string) (MetricsWriter, er
257257
}
258258

259259
// 检查数据源是否启用
260-
if !*datasource.GetEnabled() || datasource.Write.Enabled == "Off" {
260+
if !datasource.GetEnabled() || datasource.Write.Enabled == "Off" {
261261
logc.Infof(s.ctx.Ctx, "数据源 %s 已禁用或未开启写入,跳过指标写入", datasourceId)
262262
return nil, nil
263263
}

alert/process/handle.go

Lines changed: 50 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package process
22

33
import (
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

174167
type 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
}

alert/process/process.go

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,11 @@ func IsSilencedEvent(event *models.AlertCurEvent) bool {
105105
})
106106
}
107107

108-
func GetDutyUsers(ctx *ctx.Context, noticeData models.AlertNotice) []string {
108+
func GetDutyUsers(ctx *ctx.Context, noticeData models.AlertNotice, noticeType string) []string {
109109
var us []string
110110
users, ok := ctx.DB.DutyCalendar().GetDutyUserInfo(*noticeData.GetDutyId(), time.Now().Format("2006-1-2"))
111111
if ok {
112-
switch noticeData.NoticeType {
112+
switch noticeType {
113113
case "FeiShu":
114114
for _, user := range users {
115115
us = append(us, fmt.Sprintf("<at id=%s></at>", user.DutyUserId))
@@ -120,7 +120,7 @@ func GetDutyUsers(ctx *ctx.Context, noticeData models.AlertNotice) []string {
120120
us = append(us, fmt.Sprintf("@%s", user.DutyUserId))
121121
}
122122
return us
123-
case "Email", "WeChat", "CustomHook":
123+
case "Email", "WeChat", "WebHook":
124124
for _, user := range users {
125125
us = append(us, fmt.Sprintf("@%s", user.UserName))
126126
}
@@ -136,20 +136,6 @@ func GetDutyUsers(ctx *ctx.Context, noticeData models.AlertNotice) []string {
136136
return []string{"暂无"}
137137
}
138138

139-
// GetDutyUserPhoneNumber 获取当班人员手机号
140-
func GetDutyUserPhoneNumber(ctx *ctx.Context, noticeData models.AlertNotice) []string {
141-
//user, ok := ctx.DB.DutyCalendar().GetDutyUserInfo(*noticeData.GetDutyId(), time.Now().Format("2006-1-2"))
142-
//if ok {
143-
// switch noticeData.NoticeType {
144-
// case "PhoneCall":
145-
// if len(user.DutyUserId) > 1 {
146-
// return []string{user.Phone}
147-
// }
148-
// }
149-
//}
150-
return []string{}
151-
}
152-
153139
// RecordAlertHisEvent 记录历史告警
154140
func RecordAlertHisEvent(ctx *ctx.Context, alert models.AlertCurEvent) error {
155141
hisData := models.AlertHisEvent{

api/datasource.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ func (datasourceController datasourceController) PromQuery(ctx *gin.Context) {
151151
if err != nil {
152152
return nil, err
153153
}
154+
155+
if !source.GetEnabled() {
156+
return nil, fmt.Errorf("数据源「%s」已被禁用!", source.Name)
157+
}
158+
154159
fullURL := fmt.Sprintf("%s%s?%s", source.HTTP.URL, path, params.Encode())
155160
get, err := tools.Get(tools.CreateBasicAuthHeader(source.Auth.User, source.Auth.Pass), fullURL, 10)
156161
if err != nil {
@@ -195,6 +200,11 @@ func (datasourceController datasourceController) PromQueryRange(ctx *gin.Context
195200
if err != nil {
196201
return nil, err
197202
}
203+
204+
if !source.GetEnabled() {
205+
return nil, fmt.Errorf("数据源「%s」已被禁用!", source.Name)
206+
}
207+
198208
fullURL := fmt.Sprintf("%s%s?%s", source.HTTP.URL, path, params.Encode())
199209
get, err := tools.Get(tools.CreateBasicAuthHeader(source.Auth.User, source.Auth.Pass), fullURL, 10)
200210
if err != nil {

initialization/init.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func importClientPools(ctx *ctx.Context) {
7777
g := new(errgroup.Group)
7878
for _, datasource := range list {
7979
ds := datasource
80-
if !*ds.GetEnabled() {
80+
if !ds.GetEnabled() {
8181
continue
8282
}
8383
g.Go(func() error {

internal/models/alert_current_event.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ type AlertCurEvent struct {
4242
RecoverTime int64 `json:"recover_time" gorm:"-"` // 恢复时间
4343
RecoverTimeFormat string `json:"recover_time_format" gorm:"-"`
4444
DutyUser string `json:"duty_user" gorm:"-"`
45-
DutyUserPhoneNumber []string `json:"duty_user_phone_number" gorm:"-"`
4645
EffectiveTime EffectiveTime `json:"effectiveTime" gorm:"effectiveTime;serializer:json"`
4746
FaultCenterId string `json:"faultCenterId"`
4847
FaultCenter FaultCenter `json:"faultCenter" gorm:"-"`

internal/models/datasource.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ type AWSCloudWatch struct {
6666
// Value []interface{} `json:"value"`
6767
//}
6868

69-
func (d *AlertDataSource) GetEnabled() *bool {
69+
func (d *AlertDataSource) GetEnabled() bool {
7070
if d.Enabled == nil {
7171
isOk := false
72-
return &isOk
72+
return isOk
7373
}
74-
return d.Enabled
74+
return *d.Enabled
7575
}

internal/models/notice.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
package models
22

33
type AlertNotice struct {
4-
TenantId string `json:"tenantId"`
5-
Uuid string `json:"uuid"`
6-
Name string `json:"name"`
7-
DutyId *string `json:"dutyId"`
8-
NoticeType string `json:"noticeType"`
9-
NoticeTmplId string `json:"noticeTmplId"`
10-
DefaultHook string `json:"hook" gorm:"column:hook"`
11-
DefaultSign string `json:"sign" gorm:"column:sign"`
12-
Routes []Route `json:"routes" gorm:"column:routes;serializer:json"`
13-
Email Email `json:"email" gorm:"email;serializer:json"`
14-
PhoneNumber []string `json:"phoneNumber" gorm:"phoneNumber;serializer:json"`
15-
UpdateAt int64 `json:"updateAt"`
16-
UpdateBy string `json:"updateBy"`
4+
TenantId string `json:"tenantId"`
5+
Uuid string `json:"uuid"`
6+
Name string `json:"name"`
7+
DutyId *string `json:"dutyId"`
8+
Routes []Route `json:"routes" gorm:"column:routes;serializer:json"`
9+
UpdateAt int64 `json:"updateAt"`
10+
UpdateBy string `json:"updateBy"`
1711
}
1812

1913
func (alertNotice *AlertNotice) GetDutyId() *string {
@@ -24,12 +18,18 @@ func (alertNotice *AlertNotice) GetDutyId() *string {
2418
}
2519

2620
type Route struct {
21+
// 通知类型
22+
NoticeType string `json:"noticeType"`
23+
// 通知模版 ID
24+
NoticeTmplId string `json:"noticeTmplId"`
2725
// 告警等级
28-
Severity string `json:"severity"`
26+
Severitys []string `json:"severitys"`
2927
// WebHook
3028
Hook string `json:"hook"`
3129
// 签名
3230
Sign string `json:"sign"`
31+
// 邮件主题
32+
Subject string `json:"subject"`
3333
// 收件人
3434
To []string `json:"to" gorm:"column:to;serializer:json"`
3535
// 抄送人

internal/repo/notice.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type (
2323
Update(r models.AlertNotice) error
2424
Delete(tenantId, id string) error
2525
AddRecord(r models.NoticeRecord) error
26-
ListRecord(tenantId, eventId, severity, status, query string, page models.Page) (models.ResponseNoticeRecords, error)
26+
ListRecord(tenantId, eventId, severity, status, noticeId, query string, page models.Page) (models.ResponseNoticeRecords, error)
2727
CountRecord(r models.CountRecord) (int64, error)
2828
DeleteRecord() error
2929
}
@@ -150,7 +150,7 @@ func (nr NoticeRepo) AddRecord(r models.NoticeRecord) error {
150150
return nil
151151
}
152152

153-
func (nr NoticeRepo) ListRecord(tenantId, eventId, severity, status, query string, page models.Page) (models.ResponseNoticeRecords, error) {
153+
func (nr NoticeRepo) ListRecord(tenantId, eventId, severity, status, noticeId, query string, page models.Page) (models.ResponseNoticeRecords, error) {
154154
var (
155155
records []models.NoticeRecord
156156
count int64
@@ -167,6 +167,9 @@ func (nr NoticeRepo) ListRecord(tenantId, eventId, severity, status, query strin
167167
if status != "" {
168168
db.Where("status = ?", status)
169169
}
170+
if noticeId != "" {
171+
db.Where("n_obj LIKE ?", "%"+noticeId+"%")
172+
}
170173
if query != "" {
171174
db.Where("rule_name LIKE ? OR alarm_msg LIKE ? OR err_msg LIKE ?", "%"+query+"%", "%"+query+"%", "%"+query+"%")
172175
}

0 commit comments

Comments
 (0)