From 1228f5ea5b17cdedad9dfefccd2328ee01c25856 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 23 May 2025 11:45:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E6=AC=A1=E6=95=B0=E8=AE=B0=E5=BD=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E4=BD=BF=E7=94=A8sync.Map=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E6=97=B6=E9=97=B4=EF=BC=8C=E6=B8=85=E7=90=86?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ne_alarm_state_check_cmd.go | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go index 12d38e85..6a622081 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go @@ -7,6 +7,7 @@ import ( "sort" "strconv" "strings" + "sync" "time" "be.ems/src/framework/constants" @@ -20,6 +21,12 @@ import ( wsService "be.ems/src/modules/ws/service" ) +var ( + triggerMax int64 = 3 // 阈值:连续触发次数大于该值才会产生告警 + triggerCount sync.Map // 阈值连续触发次数,存储每个事件的触发记录 + triggerWindow time.Duration = 5 * time.Second // 事件触发的时间窗口 +) + var NewProcessor = &NeAlarmStateCheckCMDProcessor{ neConfigBackupService: neService.NewNeConfigBackup, neInfoService: neService.NewNeInfo, @@ -27,8 +34,6 @@ var NewProcessor = &NeAlarmStateCheckCMDProcessor{ alarmService: neDataService.NewAlarm, wsSendService: wsService.NewWSSend, count: 0, - triggerMax: 4, - triggerCount: 0, } // NeAlarmStateCheckCMDProcessor 网元告警内存/CPU/磁盘检查 @@ -39,8 +44,6 @@ type NeAlarmStateCheckCMDProcessor struct { alarmService *neDataService.Alarm // 告警信息服务 wsSendService *wsService.WSSend // ws发送服务 count int // 执行次数 - triggerMax int // 阈值连续触发次数大于才会产生告警 - triggerCount int // 阈值连续触发次数 } // alarmParams 告警参数 @@ -142,7 +145,7 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) { // 进行新增 newAlarm, err := s.alarmNew(neInfo, params) params.AddInfo = addInfo // 恢复附加信息 - s.triggerCount = 0 // 重置连续触发次数 + triggerCount.Clear() // 重置连续触发次数 if err != nil { result[neTypeAndId] = err.Error() continue @@ -233,8 +236,25 @@ func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any, cpuUseG warnMsg = append(warnMsg, fmt.Sprintf("disk usage %.2f%%", sysDiskUsage)) } if len(warnMsg) > 0 { - s.triggerCount++ - if s.triggerCount > s.triggerMax { + currentTime := time.Now() + neTypeAndId := fmt.Sprintf("%s_%s", neState.NeType, neState.NeId) + validTimes := []time.Time{} + if v, ok := triggerCount.Load(neTypeAndId); ok { + times := v.([]time.Time) + // 清理过期的记录:10秒前的触发记录不再计入 + for _, t := range times { + if currentTime.Sub(t) <= triggerWindow { + validTimes = append(validTimes, t) + } + } + validTimes = append(validTimes, currentTime) + triggerCount.Store(neTypeAndId, validTimes) + } else { + // 事件第一次触发,初始化记录 + validTimes = append(validTimes, currentTime) + triggerCount.Store(neTypeAndId, validTimes) + } + if int64(len(validTimes)) >= triggerMax { return fmt.Errorf("greater than %s", strings.Join(warnMsg, ", ")) } }