Skip to content

Commit b46e7d3

Browse files
author
Cairry
committed
🚀 Optimized alarm cache get method and add eventId for notice record
1 parent c5ff687 commit b46e7d3

File tree

12 files changed

+78
-106
lines changed

12 files changed

+78
-106
lines changed

alert/process/handle.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ package process
22

33
import (
44
"fmt"
5-
"github.com/zeromicro/go-zero/core/logc"
6-
"golang.org/x/sync/errgroup"
75
"strings"
86
"time"
97
"watchAlert/internal/ctx"
108
"watchAlert/internal/models"
119
"watchAlert/pkg/sender"
1210
"watchAlert/pkg/templates"
1311
"watchAlert/pkg/tools"
12+
13+
"github.com/zeromicro/go-zero/core/logc"
14+
"golang.org/x/sync/errgroup"
1415
)
1516

1617
// HandleAlert 处理告警逻辑
@@ -61,8 +62,9 @@ func HandleAlert(ctx *ctx.Context, faultCenter models.FaultCenter, noticeId stri
6162
event.DutyUser = strings.Join(GetDutyUsers(ctx, noticeData), " ")
6263
event.DutyUserPhoneNumber = GetDutyUserPhoneNumber(ctx, noticeData)
6364
content := generateAlertContent(ctx, event, noticeData)
64-
return sender.Sender(ctx, sender.SendParams{
65+
err := sender.Sender(ctx, sender.SendParams{
6566
TenantId: event.TenantId,
67+
EventId: event.EventId,
6668
RuleName: event.RuleName,
6769
Severity: event.Severity,
6870
NoticeType: noticeData.NoticeType,
@@ -75,6 +77,9 @@ func HandleAlert(ctx *ctx.Context, faultCenter models.FaultCenter, noticeId stri
7577
PhoneNumber: phoneNumber,
7678
Sign: Sign,
7779
})
80+
if err != nil {
81+
logc.Error(ctx.Ctx, fmt.Sprintf("Failed to send alert: %v", err))
82+
}
7883
}
7984
return nil
8085
})

alert/process/process.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,18 @@ func PushEventToFaultCenter(ctx *ctx.Context, event *models.AlertCurEvent) {
3939
}
4040

4141
cache := ctx.Redis
42+
cacheEvent, _ := cache.Alert().GetEventFromCache(event.TenantId, event.FaultCenterId, event.Fingerprint)
4243

4344
// 获取基础信息
44-
event.FirstTriggerTime = cache.Alert().GetFirstTime(event.TenantId, event.FaultCenterId, event.Fingerprint)
45-
event.LastEvalTime = cache.Alert().GetLastEvalTime()
46-
event.LastSendTime = cache.Alert().GetLastSendTime(event.TenantId, event.FaultCenterId, event.Fingerprint)
47-
event.ConfirmState = cache.Alert().GetLastConfirmState(event.TenantId, event.FaultCenterId, event.Fingerprint)
45+
event.FirstTriggerTime = cacheEvent.GetFirstTime()
46+
event.LastEvalTime = cacheEvent.GetLastEvalTime()
47+
event.LastSendTime = cacheEvent.GetLastSendTime()
48+
event.ConfirmState = cacheEvent.GetLastConfirmState()
49+
event.EventId = cacheEvent.GetEventId()
4850
event.FaultCenter = cache.FaultCenter().GetFaultCenterInfo(models.BuildFaultCenterInfoCacheKey(event.TenantId, event.FaultCenterId))
4951

5052
// 获取当前缓存中的状态
51-
currentStatus := cache.Alert().GetEventStatus(event.TenantId, event.FaultCenterId, event.Fingerprint)
53+
currentStatus := cacheEvent.GetEventStatus()
5254

5355
// 如果是新的告警事件,设置为 StatePreAlert
5456
if currentStatus == "" {
@@ -152,6 +154,7 @@ func GetDutyUserPhoneNumber(ctx *ctx.Context, noticeData models.AlertNotice) []s
152154
func RecordAlertHisEvent(ctx *ctx.Context, alert models.AlertCurEvent) error {
153155
hisData := models.AlertHisEvent{
154156
TenantId: alert.TenantId,
157+
EventId: alert.EventId,
155158
DatasourceType: alert.DatasourceType,
156159
DatasourceId: alert.DatasourceId,
157160
Fingerprint: alert.Fingerprint,

api/notice.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -127,18 +127,6 @@ func (noticeController noticeController) Get(ctx *gin.Context) {
127127

128128
}
129129

130-
func (noticeController noticeController) Check(ctx *gin.Context) {
131-
r := new(types.RequestNoticeQuery)
132-
BindQuery(ctx, r)
133-
134-
tid, _ := ctx.Get("TenantID")
135-
r.TenantId = tid.(string)
136-
137-
Service(ctx, func() (interface{}, interface{}) {
138-
return services.NoticeService.Check(r)
139-
})
140-
}
141-
142130
func (noticeController noticeController) ListRecord(ctx *gin.Context) {
143131
r := new(types.RequestNoticeQuery)
144132
BindQuery(ctx, r)

internal/cache/alert.go

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"sync"
7-
"time"
87
"watchAlert/internal/models"
98
"watchAlert/pkg/tools"
109

@@ -26,13 +25,7 @@ type (
2625
RemoveAlertEvent(tenantId, faultCenterId, fingerprint string)
2726
GetFingerprintsByRuleId(tenantId, faultCenterId, ruleId string) []string
2827
GetAllEvents(key models.AlertEventCacheKey) (map[string]*models.AlertCurEvent, error)
29-
GetFirstTime(tenantId, faultCenterId, fingerprint string) int64
30-
GetLastEvalTime() int64
31-
GetLastSendTime(tenantId, faultCenterId, fingerprint string) int64
32-
GetEventStatus(tenantId, faultCenterId, fingerprint string) models.AlertStatus
33-
GetLastFiringValue(tenantId, faultCenterId, fingerprint string) float64
3428
GetEventFromCache(tenantId, faultCenterId, fingerprint string) (models.AlertCurEvent, error)
35-
GetLastConfirmState(tenantId, faultCenterId, fingerprint string) models.ConfirmState
3629
}
3730
)
3831

@@ -112,67 +105,6 @@ func (a *AlertCache) GetEventFromCache(tenantId, faultCenterId, fingerprint stri
112105
return event, nil
113106
}
114107

115-
// GetFirstTime 获取故障中心事件的首次触发时间
116-
func (a *AlertCache) GetFirstTime(tenantId, faultCenterId, fingerprint string) int64 {
117-
event, err := a.GetEventFromCache(tenantId, faultCenterId, fingerprint)
118-
if err != nil || event.FirstTriggerTime == 0 {
119-
return time.Now().Unix()
120-
}
121-
return event.FirstTriggerTime
122-
}
123-
124-
// GetLastEvalTime 获取故障中心事件的最后评估时间
125-
func (a *AlertCache) GetLastEvalTime() int64 {
126-
return time.Now().Unix()
127-
}
128-
129-
// GetLastSendTime 获取故障中心事件的最后发送时间
130-
func (a *AlertCache) GetLastSendTime(tenantId, faultCenterId, fingerprint string) int64 {
131-
event, err := a.GetEventFromCache(tenantId, faultCenterId, fingerprint)
132-
if err != nil {
133-
return 0
134-
}
135-
return event.LastSendTime
136-
}
137-
138-
// GetEventStatus 获取事件状态
139-
func (a *AlertCache) GetEventStatus(tenantId, faultCenterId, fingerprint string) models.AlertStatus {
140-
event, err := a.GetEventFromCache(tenantId, faultCenterId, fingerprint)
141-
if err != nil {
142-
return models.StatePreAlert
143-
}
144-
145-
if event.Status == "" {
146-
return models.StatePreAlert
147-
}
148-
149-
return event.Status
150-
}
151-
152-
// GetLastFiringValue 获取故障中心事件的最新告警值
153-
func (a *AlertCache) GetLastFiringValue(tenantId, faultCenterId, fingerprint string) float64 {
154-
event, err := a.GetEventFromCache(tenantId, faultCenterId, fingerprint)
155-
if err != nil {
156-
return 0
157-
}
158-
159-
v, ok := event.Labels["value"]
160-
if !ok {
161-
return 0
162-
}
163-
164-
return v.(float64)
165-
}
166-
167-
// GetLastConfirmState 获取最新告警升级认领状态
168-
func (a *AlertCache) GetLastConfirmState(tenantId, faultCenterId, fingerprint string) models.ConfirmState {
169-
event, err := a.GetEventFromCache(tenantId, faultCenterId, fingerprint)
170-
if err != nil {
171-
return models.ConfirmState{}
172-
}
173-
return event.ConfirmState
174-
}
175-
176108
// 封装 Redis 操作
177109
func (a *AlertCache) setEventCacheHash(key models.AlertEventCacheKey, field, value string) {
178110
a.rc.HSet(string(key), field, value)

internal/models/alert_current_event.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package models
33
import (
44
"fmt"
55
"time"
6+
"watchAlert/pkg/tools"
67
)
78

89
// AlertStatus 定义状态类型
@@ -19,6 +20,7 @@ const (
1920

2021
type AlertCurEvent struct {
2122
TenantId string `json:"tenantId"`
23+
EventId string `json:"eventId"`
2224
RuleGroupId string `json:"rule_group_id"`
2325
RuleId string `json:"rule_id"`
2426
RuleName string `json:"rule_name"`
@@ -153,3 +155,42 @@ func (e StateTransitionError) Error() string {
153155
func (alert *AlertCurEvent) IsArriveForDuration() bool {
154156
return alert.LastEvalTime-alert.FirstTriggerTime > alert.ForDuration
155157
}
158+
159+
// GetLastSendTime 获取故障中心事件的最后发送时间
160+
func (alert *AlertCurEvent) GetLastSendTime() int64 {
161+
return alert.LastSendTime
162+
}
163+
164+
// GetLastEvalTime 获取故障中心事件的最后评估时间
165+
func (alert *AlertCurEvent) GetLastEvalTime() int64 {
166+
return time.Now().Unix()
167+
}
168+
169+
// GetFirstTime 获取故障中心事件的首次触发时间
170+
func (alert *AlertCurEvent) GetFirstTime() int64 {
171+
if alert.FirstTriggerTime == 0 {
172+
return time.Now().Unix()
173+
}
174+
return alert.FirstTriggerTime
175+
}
176+
177+
// GetLastConfirmState 获取最新告警升级认领状态
178+
func (alert *AlertCurEvent) GetLastConfirmState() ConfirmState {
179+
return alert.ConfirmState
180+
}
181+
182+
// GetEventStatus 获取事件状态
183+
func (alert *AlertCurEvent) GetEventStatus() AlertStatus {
184+
if alert.Status == "" {
185+
return StatePreAlert
186+
}
187+
return alert.Status
188+
}
189+
190+
// GetEventId 获取告警事件ID
191+
func (alert *AlertCurEvent) GetEventId() string {
192+
if alert.EventId == "" {
193+
return tools.RandId()
194+
}
195+
return alert.EventId
196+
}

internal/models/alert_history_event.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package models
22

33
type AlertHisEvent struct {
44
TenantId string `json:"tenantId"`
5+
EventId string `json:"eventId"`
56
DatasourceId string `json:"datasource_id" gorm:"datasource_id"`
67
DatasourceType string `json:"datasource_type"`
78
Fingerprint string `json:"fingerprint"`

internal/models/notice.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type Email struct {
4343
}
4444

4545
type NoticeRecord struct {
46+
EventId string `json:"eventId"` // 事件ID
4647
Date string `json:"date"` // 记录日期
4748
CreateAt int64 `json:"createAt"` // 记录时间
4849
TenantId string `json:"tenantId"` // 租户

internal/repo/notice.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package repo
33
import (
44
"context"
55
"fmt"
6-
"github.com/zeromicro/go-zero/core/logc"
7-
"gorm.io/gorm"
86
"time"
97
"watchAlert/internal/models"
8+
9+
"github.com/zeromicro/go-zero/core/logc"
10+
"gorm.io/gorm"
1011
)
1112

1213
type (
@@ -22,7 +23,7 @@ type (
2223
Update(r models.AlertNotice) error
2324
Delete(tenantId, id string) error
2425
AddRecord(r models.NoticeRecord) error
25-
ListRecord(tenantId, severity, status, query string, page models.Page) (models.ResponseNoticeRecords, error)
26+
ListRecord(tenantId, eventId, severity, status, query string, page models.Page) (models.ResponseNoticeRecords, error)
2627
CountRecord(r models.CountRecord) (int64, error)
2728
DeleteRecord() error
2829
}
@@ -149,14 +150,17 @@ func (nr NoticeRepo) AddRecord(r models.NoticeRecord) error {
149150
return nil
150151
}
151152

152-
func (nr NoticeRepo) ListRecord(tenantId, severity, status, query string, page models.Page) (models.ResponseNoticeRecords, error) {
153+
func (nr NoticeRepo) ListRecord(tenantId, eventId, severity, status, query string, page models.Page) (models.ResponseNoticeRecords, error) {
153154
var (
154155
records []models.NoticeRecord
155156
count int64
156157
db = nr.db.Model(&models.NoticeRecord{})
157158
)
158159

159160
db.Where("tenant_id = ?", tenantId)
161+
if eventId != "" {
162+
db.Where("event_id = ?", eventId)
163+
}
160164
if severity != "" {
161165
db.Where("severity = ?", severity)
162166
}

internal/routers/v1/api.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package v1
22

33
import (
4-
"github.com/gin-gonic/gin"
54
"watchAlert/api"
5+
6+
"github.com/gin-gonic/gin"
67
)
78

89
func Router(engine *gin.Engine) {
@@ -14,7 +15,6 @@ func Router(engine *gin.Engine) {
1415
system.POST("register", api.UserController.Register)
1516
system.POST("login", api.UserController.Login)
1617
system.GET("checkUser", api.UserController.CheckUser)
17-
system.GET("checkNoticeStatus", api.NoticeController.Check)
1818
system.GET("userInfo", api.UserController.GetUserInfo)
1919
}
2020

internal/services/notice.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ type InterNoticeService interface {
2323
Update(req interface{}) (interface{}, interface{})
2424
Delete(req interface{}) (interface{}, interface{})
2525
Get(req interface{}) (interface{}, interface{})
26-
Check(req interface{}) (interface{}, interface{})
2726
ListRecord(req interface{}) (interface{}, interface{})
2827
GetRecordMetric(req interface{}) (interface{}, interface{})
2928
DeleteRecord(req interface{}) (interface{}, interface{})
@@ -115,16 +114,9 @@ func (n noticeService) Get(req interface{}) (interface{}, interface{}) {
115114
return data, nil
116115
}
117116

118-
func (n noticeService) Check(req interface{}) (interface{}, interface{}) {
119-
120-
// ToDo
121-
122-
return nil, nil
123-
}
124-
125117
func (n noticeService) ListRecord(req interface{}) (interface{}, interface{}) {
126118
r := req.(*types.RequestNoticeQuery)
127-
data, err := n.ctx.DB.Notice().ListRecord(r.TenantId, r.Severity, r.Status, r.Query, r.Page)
119+
data, err := n.ctx.DB.Notice().ListRecord(r.TenantId, r.EventId, r.Severity, r.Status, r.Query, r.Page)
128120
if err != nil {
129121
return nil, err
130122
}

0 commit comments

Comments
 (0)