背景
做了 8 年算法,近两年主做指标体系与异动归因。一条 B 端 SaaS 业务线,核心看板 40+ 指标(订单量、支付成功率、API 成功率、DAU、人均会话等),底层 Kafka → Flink 实时聚合 → ClickHouse,7×24 值班。
阈值方案站内已经讨论得比较充分(动态基线 + 最小样本量 + Wilson 置信区间,见引用 1502),单指标的「该不该告」基本收敛了。但我现在卡在执行层:真实故障里,一个根因往往同时打中 5–10 个指标。上次网关超时阈值被误调,一个早上值班群里 14 条告警同时炸开(支付成功率、下单转化率、API P99、会话成功率、DAU 小时环比……),值班同学第一反应是「分不清哪条是源头、哪条是连带」,花了 40 分钟才对齐到网关配置变更。
现象
- 告警风暴时,值班平均定位「源头指标」耗时 30+ 分钟,且经常先处理了连带指标(比如去查支付链路,实际是上游网关)。
- 我们试过最简单的手动方案:在告警配置里给指标标「主/从」,从指标告警时若主指标同窗口也在告就抑制。但两周就出了一次误抑制——主指标因为分母太小没触发(小样本被 Wilson 区间拦掉了),从指标却被压了 30 分钟没响(引用 1582 讨论的正是这个盲区)。
- 站内 1688 那题讨论的是「判断是不是一个根因」,我的问题是更下游一步:判定之后,告警通道里留哪条、压哪条,这个层级规则怎么定?
已尝试的排查与结果
- 方案 A:静态指标树(人工维护「X 是 Y 的上游」,告警时按树抑制下游)。优点:可解释、好审计。缺点:维护成本高,40+ 指标里跨业务线的隐性依赖(比如埋点服务同时影响 DAU 和会话指标)根本画不全,两周新增 3 个指标就漏画了 2 条边。
- 方案 B:动态相关窗口(告警触发后回看前 N 分钟,找与当前指标相关系数最高、且时间上最先越线的「源头」,抑制其余)。优点:不用人工维护。缺点:相关≠因果(站内 1353 的讨论我认同这个担忧),且两个独立故障碰巧同窗口时会误判;另外「谁先越线」依赖阈值灵敏度,阈值松的指标总是「后越线」,会被系统性当成连带方。
- 方案 C:不做抑制,只做聚合(把同窗口的 N 条告警合并成一条事件卡片,附上按「时间序 + 业务层级」排的指标列表,让值班自己挑)。效果:值班抱怨从「告警太多」变成「卡片里还是看不出源头」。
期望得到的答案形态
- 大家在生产里实际跑的是 A / B / C 哪一种,或者混合方案?混合的话边界怎么切(哪些指标进静态树、哪些走动态相关)?
- 动态判「源头」时,你们用什么信号比「相关系数 + 时间序」更可靠(比如依赖拓扑、事件日志关联、Granger 因果)?有没有踩过「阈值灵敏度不同导致源头判断系统性偏差」的坑,怎么解?
- 误抑制的兜底机制:被压的从指标满足什么条件时仍然要单独响(比如压制时长 > X 分钟、压制期间偏差继续扩大)?
- 有没有可复现的验证方法——比如用历史故障窗口回放,量化「抑制策略下首条正确告警的触达时间」和「误抑制率」这两个指标?