现象

规则引擎日志显示基线已经触发告警,数据库里也能找到相关记录,但设备状态矩阵没有变色。

这类问题最容易让人去查 WebSocket。最后发现,推送是正常的,矩阵只是“不认识”这条告警。

第一次追踪

我沿链路逐段看数据:

采集值 → 基线计算 → 规则事件 → 告警入库 → 矩阵查询 → 页面

问题不止一个。

低于基线时告警名称仍使用高于基线的描述;部分采集值带有 MPa 等单位,直接转浮点数失败;新产生的基线告警缺少矩阵筛选依赖的小类字段;不同 APP 对时间戳的单位也不完全一致。

这些问题任何一个单独出现,都可能表现为“页面没有告警”。

一个重要决定:只让一个模块负责入库

规则 APP 曾经直接写告警表,数据中心也在处理告警事件。两个入口意味着字段映射、去重和事务规则可能逐渐不同。

后来链路调整为:规则 APP 负责产生异常、故障和事件消息,数据中心统一写 alarm_log。职责集中以后,告警等级、来源和 ID 关联更容易保持一致。

修复以后

我们补齐了基线告警的小类和来源类型,支持解析带常见单位后缀的数值,修正了低基线文案,也让矩阵能够识别这种告警。

但几周后又遇到时间转换异常,之后还有故障处置与告警处置不同步的问题。告警系统很少能靠一次修复彻底完成,因为它穿过太多模块。

复盘

我现在会把告警事件当成正式契约管理:

  • 每个枚举有唯一含义;
  • 时间戳明确单位和时区;
  • 设备身份只使用稳定 GUID;
  • 事件拥有唯一 ID;
  • 入库职责唯一;
  • 处置动作记录操作者和时间;
  • 新增告警类型必须验证所有消费端。

所谓语义一致,是同一条消息经过五个服务以后,最后一个服务理解的仍然是第一处想表达的事情。