固定阈值对随流量波动的业务指标永远顾此失彼,导致告警疲劳。炬鲸 OBSERVE 用动态基线自动学习指标正常区间,只在明显偏离时才告警,并给出何时该保留固定阈值的建议。
设告警阈值是运维里最尴尬的活。设高了,真出问题收不到通知;设低了,凌晨三点被误报叫醒。更麻烦的是,很多业务指标天生随时间波动——白天 QPS 高、凌晨低,工作日高、周末低,大促期间直接翻几倍。一个固定阈值,永远只能覆盖真实曲线里的一小段。
举个真实例子:某订单服务的 QPS 平时在 500 上下,大促当天冲到 3000。如果你把阈值设成 800,平时没问题,但大促一开场就“告警刷屏”;如果设成 5000,大促是安静了,可平时服务挂掉一半你都收不到通知。这就是固定阈值的结构性缺陷:它假设指标是平的,而业务指标从来不是平的。
后果通常有两条:要么告警疲劳,团队把告警群静音,真故障也看不见;要么干脆不设告警,靠用户投诉才发现问题。
炬鲸 OBSERVE 的做法是用动态基线代替固定阈值:系统根据指标的历史分布自动学习“正常区间”,只有当前值明显偏离正常时才触发告警。
动态基线不是简单的滑动平均——滑动平均只能平滑曲线,学不会“什么算正常”。我们把一条指标拆成三层来学:
三层叠加,得到的是一个随时间和星期变化的“带宽”,而不是一条死线。回到上面的订单服务:大促当天,系统会参考“去年同期大促”和“最近流量爬坡”自动抬高带宽上界,QPS 冲到 3000 也算正常,不会误报;而如果某个凌晨 QPS 突然比历史同时刻高出三倍,即使绝对值不高,也会触发告警——因为“凌晨不该这么忙”本身就是异常信号。
只有当前值连续 N 个采样点都越界,才会触发告警——这个 N 可以配置,用来过滤瞬时毛刺。
alert:
name: "订单服务 QPS 异常"
metric: order_service_qps
type: dynamic_baseline
sensitivity: medium # low/medium/high
consecutive: 3 # 连续越界次数
cooldown: 30m # 冷却时间,避免告警风暴
notify: ["email", "wecom"]
灵敏度决定带宽的松紧:high 意味着带宽更窄,对小幅偏离更敏感,适合延迟这类本身噪声小的指标;low 则更宽容,适合 QPS 这类天然抖动大的指标。拿不准就先 medium,观察一周再调。
动态基线不是万能药,有几种情况更适合保留固定阈值:
我们的建议:容量类指标用固定上限,流量、延迟、错误率这类“会呼吸”的指标用动态基线,两者可以叠加在同一个服务上——比如“连接数超过 2000 立即告警”和“QPS 偏离基线 3 个采样点告警”同时生效,各管各的。
从最容易误报的指标开始迁移。按我们的经验,RPC 延迟、消息队列积压、GC 次数这三类指标是固定阈值误报的重灾区,先把它们切到动态基线,告警量通常能降一半以上。
切换后留一周观察期:如果某天告警明显偏多,先确认是不是真有异常(比如一次灰度发布),而不是急着调灵敏度。等团队对“这个平台懂我的业务曲线”建立信任后,再逐步把更多指标迁过来。
动态基线的价值不在于少几条告警,而在于让剩下的每条告警都值得点开看。当团队不再半夜被“狼来了”叫醒,白天的真故障才不会被淹没在静音里。