【背景】
我在一家 20 人左右的数据团队做指标体系,核心看板约 40 个指标,底层是 ClickHouse + Grafana。目前所有「指标异动」都靠人肉盯盘 + 早上 9 点周报发现,平均滞后 4–12 小时。老板拍板要求做一套自动检测 + 告警,我负责算法与阈值方案,但社区和内部都还没形成共识。
【现象 / 卡点】
- 指标类型混杂:日级(DAU、次日留存、付费率)和小时级(支付成功率、接口 P99、消息队列堆积)都有,周期性和噪声结构完全不同。
- 我初步调研了三类方案,各有硬伤:
- STL 分解 + 残差 3σ:对周周期(工作日 / 周末)敏感,但残差 σ 在节假日、大促、版本发布时会突然放大,3σ 几乎失效;
- EWMA(λ=0.3):响应快,但日级指标一周才 7 个点,EWMA 还没收敛业务已经变了;
- 同比 + 环比双阈值(比如同比跌 >15% 且环比跌 >10%):实现最简单,但「环比」在指标本身有强周期时(比如周末 DAU 天然比周五低 20%)会大量误报。
- 误报与漏报的权重很难定:误报一次,值班同学要手动标「已知原因」,一个月 30+ 次告警大家就开始无视(狼来了);漏报一次,老板直接找上门。
- 还有一个隐性坑:指标树上下游联动——DAU 掉 30% 时,它的下游「任务完成率」可能因为分母变化反而上升 5%,单纯看每个指标自己的阈值会漏掉上游异常。
【已尝试的排查与结果】
- 试过 Grafana 自带 Threshold + Basic Auth 告警,日级指标基本不可用(没有动态基线);
- 试过 Python
statsmodels 的 STL + 残差 3σ 跑 90 天历史,工作日误报率约 12%(每周 1 次),节假日直接爆炸;
- 试过「同比上周同星期 ±20%」的土办法,误报降到 3% 左右,但漏报了两次真实的小幅持续下跌(每天跌 3% 连跌 4 天,同比始终在阈值内);
- 还没试过:Prophet / 贝叶斯结构变点 / 基于 LSTM 的时序预测,感觉对 40 个指标维护成本偏高。
【期望得到的答案形态】
希望有在线上实际跑过 ≥3 个月的同学分享一下:
- 你们最终用的是哪种检测算法(或组合),日级和小时级是否分开处理?
- 阈值是怎么定的:固定 σ 倍数、动态分位数(比如 P5/P95)、还是基于历史误报率反推?
- 误报率大概控制在什么水平(每月几次),漏报是怎么发现的、怎么补救的?
- 指标树上下游联动,有没有人做过「父指标异常时子指标告警降级 / 升级」之类的策略?
- 有没有踩过「检测算法本身被业务变更(版本发布、运营活动)干扰」的坑?怎么打的补丁?
不需要完整代码,方案选型 + 阈值经验值 + 踩坑清单就非常有价值。如果有内部实现(哪怕是 PPT / 文档)可以分享思路也欢迎。