告警静默与抑制:静默规则、抑制规则、持续时间设置

告警一直响,到底哪些该处理?
我记得刚接手线上运维那会儿,凌晨三点被告警轰炸是常事。后来我悟了——不是所有告警都值得你从被窝里爬起来。真正需要你关注的,是那些代表「真实故障」的信号。

这节课,我们来聊聊怎么把告警噪音降下去。核心就两个手段:静默和抑制。听起来像一回事?其实思路完全不同。

一句话总结:
静默是「我知道你要报警,但我现在不想看」。
抑制是「我知道你报警了,但上级告警已经代表了问题,你就不用再报了」。

什么是告警静默

静默,说白了就是主动屏蔽。运维人员可以提前声明:「接下来X小时,这个组件的告警我包了,你们别吵我。」

我在项目中遇到过一种场景:SRE团队要进行数据库主从切换,操作期间会短暂出现复制延迟告警。如果不去静默,全组都会收到误报。你想想看,半夜看到这种告警,心里得多慌?

静默规则一般包含这几个字段:

字段 说明 示例
匹配条件 指定哪些告警会被静默 alertname="MySQLReplicaLag"
作用域 按标签、实例、集群过滤 cluster="prod-db"
计划窗口 开始时间 + 持续时间 2025-04-10 02:00 ~ 03:00
创建人 / 原因 谁建的、为什么 zhangsan / 主从切换维护

我个人习惯给每条静默规则加上到期自动清理。否则你会发现,三个月前的维护静默还挂在系统里,新来的告警被误伤。嗯,这里要注意。


# PrometheusAlertManager 静默规则示例
silence:
  - matchers:
      - name: "alertname"
        value: "InstanceDown"
    startsAt: "2025-04-10T02:00:00Z"
    endsAt: "2025-04-10T03:00:00Z"
    createdBy: "zhangsan"
    comment: "计划内机房UPS测试,预先静默下线服务器告警"

什么是告警抑制

抑制是自动的。不需要人去创建规则,而是基于告警之间的依赖关系自动判断。

举个例子:你的核心交换机宕机了,下挂的100台服务器全部不可达。如果没有抑制,你会收到101条告警。但实际上,你只需要处理交换机那一台。其他的告警都是「因为交换机挂了才出现的」,属于衍生告警。

抑制规则的核心机制就是:如果存在一级告警(根源),则自动压制下级告警(衍生)。

实现方式主要有三种:

  • 基于依赖的抑制:预先定义依赖关系,比如A服务依赖B机器。
  • 基于主机/集群的抑制:所有归属于同一主机的告警,被主机级别告警压制。
  • 基于标签的抑制:给告警打标签,抑制时匹配标签继承关系。

我记得有一次线上出了个棘手的问题:某台物理机风扇故障,温度告警一直触发,但集群控制面还在。结果无抑制规则,温度告警和宕机告警同时往值班群刷屏……最后值班同事被冲昏头,漏掉了真正的磁盘坏道告警。

曾经踩过的坑:
抑制规则不能写得太宽泛。我见过有人把「severity=warning」全部抑制,结果业务层面容量预警被压了三天,最后直接线上事故。抑制务必保留一条永远不抑制的高危通道 —— 比如 P0 告警直接跳过所有抑制逻辑。


# PrometheusAlertManager 抑制规则示例
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['cluster', 'host']
  - source_match:
      alertname: 'NodeDown'
    target_match:
      alertname: 'NodeHighCPU'
    equal: ['node']

持续时间的设置逻辑

静默和抑制都涉及「这个压制要持续多久」的问题。设置太短,告警又冒出来;设置太长,真正的问题可能错过了。

我一般遵循这几个经验数值:

告警类型 建议静默持续时间 备注
计划内维护 维护窗口 + 15分钟缓冲 防止操作延时
突发临时操作 30分钟 短平快
已知问题临时豁免 2~4小时 需关联工单,到期自动取消
抑制(衍生告警) 直到根源告警恢复 不要设置固定时长,而是跟根源告警生命周期绑定

关于抑制的持续时间,我建议不要用固定一小时的窗口。根源故障可能持续三小时,你设一小时的抑制,后两个小时新告警又飞出来了,值班人员会疯掉。抑制必须绑定根源告警的状态 —— 根源告警恢复了,抑制才自动解除。

你想想看,如果设置成固定时长,一旦根源没恢复,产生的新衍生告警不会被压制,等于抑制失效。说白了,抑制的核心不是「压多久」,而是「根源在,压制就在」。

实战避坑

  • 不要用手动静默替代故障排查——我曾经见过同事把同一个告警静默了三次,结果第三次静默到期后组件真的挂了,后悔也晚了。
  • 抑制规则一定要测试——伪造一个根源告警,看下级告警能不能被正确压制。我见过抑制写反了,把根源告警压掉,衍生告警全爆出来的惨案。
  • 静默规则必须留痕——谁建的、什么原因、什么时候到期,这些信息必须写入监控系统。否则团队内卷,互相甩锅。
告警静默与抑制决策流程 告警产生 静默检查 匹配静默规则? 抑制检查 存在根源告警? 告警被静默 不发送通知 告警被抑制 不发送通知 未匹配 未抑制 告警发出 & 通知 静默和抑制 是「或」关系

经验之谈:
静默适合「我知道可能有告警,但我不需要处理」。
抑制适合「可能有告警,但它不是根因,我不应该看它」。
两者同时用,大概率能把告警噪音降到80%以下。但别忘了——监控系统的终极目标不是让你清净,而是在真正出事时,你能第一眼看到真正重要的那条告警。

嗯,这一块讲完了。下次遇到告警刷屏,先问问自己:这些告警里,哪些是「我主动屏蔽的」?哪些是「被其他告警压制的」?分清楚这两类,你的值班体验会好很多。