现象
规则引擎日志显示基线已经触发告警,数据库里也能找到相关记录,但设备状态矩阵没有变色。
这类问题最容易让人去查 WebSocket。最后发现,推送是正常的,矩阵只是“不认识”这条告警。
第一次追踪
我沿链路逐段看数据:
采集值 → 基线计算 → 规则事件 → 告警入库 → 矩阵查询 → 页面
问题不止一个。
低于基线时告警名称仍使用高于基线的描述;部分采集值带有 ℃、MPa 等单位,直接转浮点数失败;新产生的基线告警缺少矩阵筛选依赖的小类字段;不同 APP 对时间戳的单位也不完全一致。
这些问题任何一个单独出现,都可能表现为“页面没有告警”。
一个重要决定:只让一个模块负责入库
规则 APP 曾经直接写告警表,数据中心也在处理告警事件。两个入口意味着字段映射、去重和事务规则可能逐渐不同。
后来链路调整为:规则 APP 负责产生异常、故障和事件消息,数据中心统一写 alarm_log。职责集中以后,告警等级、来源和 ID 关联更容易保持一致。
修复以后
我们补齐了基线告警的小类和来源类型,支持解析带常见单位后缀的数值,修正了低基线文案,也让矩阵能够识别这种告警。
但几周后又遇到时间转换异常,之后还有故障处置与告警处置不同步的问题。告警系统很少能靠一次修复彻底完成,因为它穿过太多模块。
复盘
我现在会把告警事件当成正式契约管理:
- 每个枚举有唯一含义;
- 时间戳明确单位和时区;
- 设备身份只使用稳定 GUID;
- 事件拥有唯一 ID;
- 入库职责唯一;
- 处置动作记录操作者和时间;
- 新增告警类型必须验证所有消费端。
所谓语义一致,是同一条消息经过五个服务以后,最后一个服务理解的仍然是第一处想表达的事情。