← 返回文章列表
产品动态 4 分钟阅读 炬鲸团队

告警风暴治理:分组、去重、分级,让告警重新可行动

告警太多和没告警一样危险。本文介绍炬鲸 OBSERVE 如何通过分组、去重、分级、值班轮换和静默窗口,把每天几千条告警收敛成几十条可行动事件,并给出可直接套用的配置示例与落地建议。

为什么告警多了反而没人看

运维最怕的不是没告警,而是告警太多。一个数据库节点抖动,可能同时命中连接池、慢查询、磁盘 IO、服务可用性四条规则,几秒内刷出几十条消息。值班同学看着满屏红点,既分不清哪个是根因,也不敢随便关。日子一久,告警变成「狼来了」,真出事反而被淹没。

这不是危言耸听。我们统计过一批客户的历史数据:一个中型团队每天的原始告警普遍在 2000 到 5000 条之间,但真正需要人介入的往往不超过 30 条。剩下的 99% 是重复、抖动和低价值提醒,它们唯一的作用是消耗值班人的耐心,让他在凌晨三点把手机静音。

炬鲸 OBSERVE 的告警引擎把主要精力放在两件事上:先把海量原始告警收敛成少量可行动的事件,再把每个事件准确送到该处理的人手里。收敛靠分组和去重,送达靠分级和路由。

分组与去重:把 3000 条收敛成 30 条

分组基于标签维度自动聚类。同一服务、同一主机、同一指标在一个时间窗口内触发的告警,会被合并成一条聚合事件,事件里保留触发次数和峰值,而不是逐条推送。配置很短:

group_by: [service, host, alertname]
group_wait: 30s
group_interval: 5m
repeat_interval: 4h

三个参数各管一段:

  • group_wait:首次告警后等 30 秒再发,让同一波抖动归并成一条
  • group_interval:同一分组内新增告警,最多 5 分钟提醒一次
  • repeat_interval:未恢复的告警 4 小时才重复提醒,避免整夜刷屏

去重解决的是「同一条告警反复发」的问题,分组解决的是「一批告警其实是同一件事」的问题。两者叠加,效果才明显。比如一次网络分区可能让 40 台主机同时报「心跳丢失」,去重后仍是 40 条;但如果按「故障域」分组,这 40 条会被合并成一条「机房 X 网络异常」,值班人一眼就知道该找谁。

效果好坏取决于标签设计的质量。粒度太粗(只按 service 分组),不同主机的故障会被错误合并;太细则收敛不下来。建议从 service + host 两级起步,跑一周看数据,再根据「哪些告警总是同时出现」来补标签。

分级与路由:让对的人收到对的告警

按严重程度分 P0-P3,配不同的通知渠道和接收人:

  • P0(服务不可用):电话 + 短信 + 值班群,1 分钟内响应
  • P1(核心功能降级):企业微信 / 钉钉,15 分钟响应
  • P2(单实例异常):邮件,1 小时内处理
  • P3(提醒类):只进事件中心,不打扰人

分级的依据不是「你觉得重不重要」,而是「出事后谁在什么时候必须知道」。一个判断标准:如果这条告警半夜打给你,你愿意起来处理吗?不愿意,就降级或改成仅记录。

路由的另一个关键是值班表。告警应该打到当班人,而不是全员。炬鲸 OBSERVE 支持轮值排班,交接自动切换接收人,避免告警打到已下班的同事手机上。跨团队场景还可以按服务路由:支付系统的告警进支付团队的值班群,订单系统的告警进订单团队,互不打扰。

静默窗口与维护期

发布窗口、压测、已知故障期间,把相关告警静默,避免误导。支持按服务、主机、时间段配置静默窗口,到期自动恢复。比如凌晨 2 点的例行备份,可以把对应的磁盘 IO 告警静默 30 分钟,而不是每晚叫人起来看一条本来就没问题的告警。

一个常被忽略的细节:静默窗口最好和变更管理联动。发布时自动开启静默,发布结束自动关闭,而不是靠人记着去开、去关。手动静默最大的风险是「忘了关」,导致之后真故障被静默掉。

落地建议

  1. 先统计现有告警的分组,找出重复率最高的三类,优先治理,别一上来就全量重构
  2. 告警文案写清「发生了什么、影响什么、怎么处理」,而不是只丢一条报错堆栈
  3. 每月复盘一次:误报、没价值的直接删规则,规则越少越可靠
  4. 用「每个值班周期被叫醒的次数」和「告警到处理人的平均时延」两个指标衡量治理效果,而不是看告警总数