实现忽略告警和取消忽略告警接口及功能
This commit is contained in:
@@ -3,6 +3,7 @@ package alarm
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
||||
@@ -21,6 +22,14 @@ type AlarmService interface {
|
||||
// CloseAlarm 关闭一个活跃告警,将其归档到历史记录。
|
||||
// 如果指定的告警当前不活跃,则不执行任何操作并返回 nil。
|
||||
CloseAlarm(ctx context.Context, sourceType models.AlarmSourceType, sourceID uint, alarmCode models.AlarmCode, resolveMethod string, resolvedBy *uint) error
|
||||
|
||||
// SnoozeAlarm 忽略一个活跃告警,或更新其忽略时间。
|
||||
// 如果告警不存在,将返回错误。
|
||||
SnoozeAlarm(ctx context.Context, alarmID uint, duration time.Duration) error
|
||||
|
||||
// CancelAlarmSnooze 取消对一个告警的忽略状态。
|
||||
// 如果告警不存在,或本就未被忽略,不执行任何操作并返回 nil。
|
||||
CancelAlarmSnooze(ctx context.Context, alarmID uint) error
|
||||
}
|
||||
|
||||
// alarmService 是 AlarmService 接口的具体实现。
|
||||
@@ -122,3 +131,45 @@ func (s *alarmService) CloseAlarm(ctx context.Context, sourceType models.AlarmSo
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// SnoozeAlarm 忽略一个活跃告警,或更新其忽略时间。
|
||||
func (s *alarmService) SnoozeAlarm(ctx context.Context, alarmID uint, duration time.Duration) error {
|
||||
serviceCtx, logger := logs.Trace(ctx, s.ctx, "SnoozeAlarm")
|
||||
|
||||
if duration <= 0 {
|
||||
return errors.New("忽略时长必须为正数")
|
||||
}
|
||||
|
||||
ignoredUntil := time.Now().Add(duration)
|
||||
err := s.alarmRepo.UpdateIgnoreStatus(serviceCtx, alarmID, true, &ignoredUntil)
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
logger.Warnf("尝试忽略一个不存在的告警: %d", alarmID)
|
||||
return fmt.Errorf("告警 %d 不存在", alarmID)
|
||||
}
|
||||
logger.Errorf("更新告警 %d 的忽略状态失败: %v", alarmID, err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Infof("告警 %d 已被成功忽略,持续时间: %v", alarmID, duration)
|
||||
return nil
|
||||
}
|
||||
|
||||
// CancelAlarmSnooze 取消对一个告警的忽略状态。
|
||||
func (s *alarmService) CancelAlarmSnooze(ctx context.Context, alarmID uint) error {
|
||||
serviceCtx, logger := logs.Trace(ctx, s.ctx, "CancelAlarmSnooze")
|
||||
|
||||
err := s.alarmRepo.UpdateIgnoreStatus(serviceCtx, alarmID, false, nil)
|
||||
if err != nil {
|
||||
// 如果告警本就不存在,这不是一个需要上报的错误
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
logger.Infof("尝试取消忽略一个不存在的告警: %d,无需操作", alarmID)
|
||||
return nil
|
||||
}
|
||||
logger.Errorf("取消告警 %d 的忽略状态失败: %v", alarmID, err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Infof("告警 %d 的忽略状态已被成功取消。", alarmID)
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user