【背景】
我负责一条 B 端 SaaS 的指标体系,核心看板里有 10+ 个比率型指标(下单转化率、支付成功率、ARPU、人均调用次数等),底层是 Kafka → Flink 实时聚合 → ClickHouse。业务方要求"核心指标实时异动 5 分钟内告警到值班群",值班同学每天 7×24 轮班。
【现象(两个方向都踩坑)】
- 该报不报:凌晨 02:00–06:00 时段付费 UV 只有白天高峰的 1/20,分母基数小,转化率天然抖动大。上周某次凌晨支付网关限流导致支付成功率从 97% 掉到 89%(绝对跌 8pp),但因为分子分母同时很小,按"环比跌幅 > 10%"的规则没触发告警,直到早上 8 点业务方来问才发现,损失了一个早高峰。
- 不该报乱报:把阈值调到"环比跌幅 > 5%"后,工作日周一/周五的基线本身就和周二~周四差 3~5pp(B 端用户行为有明显的 weekday 周期性),加上 7 天滑动基线里混入了上周一次真实事故的数据,导致连续 3 天每天 2~3 条误报,值班同学已经开始"选择性忽略"告警,比不告警更危险。
【已尝试的排查与结果】
- 试过固定阈值(环比 ±10%):凌晨小样本漏报、工作日周期性误报,两头不讨好。
- 试过"7 天同时段均值 ± 2σ":σ 本身被历史事故拉大(比如基线 4.7% 的转化率,σ 算出来 0.9pp,阈值宽到 2.9% 才告警),等于把真实异动也吞掉了。
- 试过把比率拆成分子/分母分别告警:分母(UV/调用量)的告警倒是准了,但分子(订单数/支付数)的波动经常和业务无关(比如运营活动拉量),拆开后反而更难判断"哪个才是真正的问题"。
- 没有试过:基于分位数/中位数的基线、贝叶斯动态阈值、或者按分母大小分档设置不同灵敏度。
【期望得到的答案形态】
- 基线怎么取:比率型指标的基线用"同时段 7 天均值"还是"中位数 + MAD"还是别的?分母基数小时(比如 < 200)该怎么处理——是降灵敏度、还是改用绝对量告警、还是直接不告警只记录?
- 阈值怎么定:有没有一套可复现的公式或决策树(输入:指标类型、分母量级、weekday 周期性强度、可接受误报率/漏报率),输出:告警阈值?最好能给出一个具体的 SQL/Python 片段。
- 误报治理:值班同学对告警"选择性忽略"之后,怎么量化"告警疲劳度"并做收敛?有没有"告警分级(P0 必须响应 / P1 关注 / P2 只记录)"的实操经验?
我手头有 6 个月的历史数据(分钟级粒度),可以跑实验验证,所以更想要"可复现的方法 + 参数选择依据",而不是"用 AI 大模型自动判断"这类方向。
【参考】
- 站内已有"结构效应 vs 率效应"的分解方法(id=443),我理解那套公式适合事后归因,但事前告警的阈值定法还是缺位。
- 转化率聚合口径的讨论(id=677)提醒我"简单平均 vs 先汇总再除"在告警基线里也会影响 σ 的计算,但没展开讲告警场景。