告警疲劳不是通知问题,而是故障对象建模问题

告警疲劳的根因往往不是通知渠道太吵,而是 Event、Alert、Incident 没有分层建模。本文用故障对象模型拆解事件聚合、告警收敛、标签治理、静默、抑制、抖动检测和路由分派。

作者 快猫星云

告警疲劳与故障对象建模

核心摘要

  • 告警疲劳的根因通常不是飞书、钉钉、企业微信、短信或电话太吵,而是监控信号没有被建模成清晰的故障对象。
  • Event、Alert、Incident 是三层不同对象:Event 保留原始信号,Alert 描述某个告警生命周期,Incident 才是响应系统中需要分派、认领、升级和复盘的工作对象。
  • Event Aggregation 解决重复事件,Alert Grouping 解决相似告警,标签治理决定聚合、路由、静默和抑制是否稳定。
  • 静默、抑制、抖动检测和风暴预警分别对应不同噪声类型,不能互相替代。
  • 告警治理的验收标准不是单纯的压缩率,而是压缩后的 Incident 是否更接近真实问题:影响面清楚、责任人清楚、上下文完整、可处理、可复盘。

很多团队治理告警疲劳,第一反应是换通知方式。飞书群太吵,就改成私聊;私聊没人看,就加短信;短信还不够,就加电话;电话太扰民,再去调值班表和升级策略。工具一轮一轮换,值班人还是累,群里还是乱,真正事故还是会被淹没在重复通知里。

这不是飞书、钉钉、企业微信、短信或电话的问题。通知只是最后一公里。前面如果没有把监控系统推过来的原始信号整理成可判断、可分派、可认领、可升级的故障对象,后面换什么通知渠道都只是把噪声换一种形式送到人面前。

告警疲劳的根因,通常不是“通知太多”这么简单,而是事件、告警、故障没有分层。重复触发、恢复事件、派生告警、真实故障、维护窗口、抖动信号混在一起,最后全部以“消息”的形式打给值班人。人被迫在半夜完成一件系统本该提前做好的事:判断这些信号到底是不是同一个问题。

告警疲劳根因与对象建模方案总览

告警疲劳表现 根因对象 建模或治理方式 目标结果
同一检查项反复触发、更新、恢复 Event 没有聚合成 Alert 用 Event Aggregation 按 alert_key 聚合事件 让同一告警生命周期进入同一条 Alert
一个故障引发多条相似告警 Alert 没有收敛成 Incident 用 Alert Grouping 将相似 Alert 合入同一 Incident 让值班人处理一个更接近真实故障的问题
告警打给错误团队或大群 标签和路由语义不稳定 治理 serviceresourcecheckenvteam 等标签,并配置 Routing Rules 让故障对象进入正确 channel 和升级链路
维护窗口、已知问题仍然通知 已知噪声没有被识别 用 Silence Rules 处理计划发布、迁移、压测等场景 减少不需要立即响应的通知
根因告警存在时派生告警继续刷屏 根因和派生信号没有关系表达 用 Inhibit Rules 抑制相关次要告警 保留根因可见性,减少派生噪声
短时间内反复触发和恢复 抖动状态没有被单独识别 用 Flapping Detection 标记 flapping 并减少重复打扰 避免把短时波动变成多次人工待办

先把对象说清楚:Event、Alert、Incident

Flashduty 文档里有一个很关键的模型:

Monitoring System -> Event -> Alert -> Incident

这个模型看起来简单,但它正是告警治理的起点。

Event:监控系统推送的原始信号

Event 是监控系统推送过来的原始通知。一次触发、一次恢复、一次更新,都可以是 Event。比如 Prometheus、Zabbix、Nightingale 或云监控发现 CPU 过高,推送一次触发事件;指标恢复后,再推送一次恢复事件。

Event 是最底层的信号,它保留现场,但不应该直接等同于人要处理的工作项。如果每个 Event 都变成一次通知,值班人看到的就不是故障,而是原始信号流。

Alert:由事件形成的告警生命周期

Alert 是由 Event 自动触发出来的告警对象。同一个 alert_key 的事件,在事件聚合窗口内可以合入同一条 Alert。也就是说,触发、更新、恢复这些原始事件,不一定要各自变成一个独立处理项。它们可以共同描述同一条告警的生命周期。

Alert 的价值,是把“同一检查项、同一对象、同一问题状态”的变化整理到一起。它回答的是:这一类告警现在处于什么状态,经历过哪些触发、更新和恢复。

Incident:响应系统真正要处理的问题

Incident 才是响应系统里真正要处理的对象。Flashduty 文档里对 Incident 的定义很直接:它表示一个正在发生、需要处理的问题,通常由告警触发,也经常关联一组相似告警。没有降噪时,一个 Alert 往往就会触发一个 Incident;有了降噪后,多条相似 Alert 可以合入同一个 Incident,用于统一分派、通知和处理。

这三层如果不分清,告警治理一定会走偏。很多团队以为自己在处理故障,实际上是在处理 Event;以为自己在做响应流程,实际上只是在转发 Alert;以为自己在降噪,实际上只是把通知关小一点。

Event、Alert、Incident 三层对象模型

为什么通知太多只是对象建模失败的结果

假设一台核心服务器宕机。监控系统可能同时推送 CPU、内存、磁盘、网络、进程存活、端口探活、服务可用性、业务接口错误率等多类事件。如果每一个事件都直接变成一条独立告警,每一条告警又直接触发一个独立故障,值班人看到的就是几十甚至上百个“问题”。

但从响应角度看,这不一定是几十个问题。它可能只是一个服务器不可用,带出了一串派生信号。

Kubernetes 场景更典型。一个 Node 抖动,可能引发 Pod 重启、Deployment 副本异常、Service 延迟、Ingress 5xx、下游依赖超时、业务接口成功率下降。每条信号都是真的,但它们不一定都值得独立叫醒一个人。值班人真正需要处理的是“某个集群节点异常导致一组服务受影响”,而不是逐条确认每个派生告警。

这就是故障对象建模的价值。系统要先把原始事件聚合成 Alert,再把相似 Alert 聚合成 Incident。人处理的是 Incident,而不是每一次事件波动。

这个差别很重要。Event 保留细节,Alert 描述某个检查项或对象的告警状态,Incident 承载响应流程。Incident 上应该能看到关联了哪些 Alert,每条 Alert 又关联了哪些原始 Event。这样既不会丢证据,也不会把所有证据都变成人的待办事项。

换句话说,告警降噪不是把信息删掉,而是把信息放到合适的对象层级里:原始证据留在 Event,状态变化留在 Alert,人工响应聚焦到 Incident。

Event Aggregation 解决的是“重复事件”

第一层治理是 Event Aggregation,也就是从 Event 到 Alert 的聚合。

它解决的是同一条告警在一段时间内反复更新的问题。Flashduty 的文档里说,新 channel 默认开启 Event Aggregation,默认窗口是 24 小时,配置范围是 1 到 1440 分钟。开启后,具有相同 alert_key 的事件会在窗口内合入同一条 Alert;关闭后,每个 Event 都会创建独立 Alert。

这里的关键是 alert_key。它是告警关联和去重的标识,可能由上游集成上报,也可能由集成规则自动生成。如果 alert_key 设计得太细,同一个问题会被拆成很多 Alert;如果设计得太粗,不同问题可能被错误合并。

举个例子,同一台主机的同一检查项反复触发和恢复,通常应该进入同一条 Alert。这样值班人能看到它的状态变化,而不是被每次变化重新通知。但如果把整个集群的 CPU 告警都用同一个 alert_key,就可能把不同主机、不同原因的 CPU 异常揉成一条 Alert,后续分析反而更困难。

Event Aggregation 的目标不是让数据消失,而是把同一告警生命周期内的事件放在一起。它降低的是重复事件带来的扰动。

Alert Grouping 解决的是“相似告警”

第二层治理是 Alert Grouping,也就是从 Alert 到 Incident 的聚合。

它解决的是一个故障引发多条相似或相关 Alert 的问题。Flashduty 支持智能聚合和规则聚合两种模式。智能聚合基于标题、描述、labels.servicelabels.resource 等字段计算相似度,适合快速开始;规则聚合按指定属性或标签精确匹配,适合需要严格控制边界的场景。

这两种模式各有位置。刚开始治理告警风暴时,智能聚合能快速把明显相似的告警收敛到同一个 Incident,减少重复通知。等团队逐渐看清告警结构后,可以对高风险业务使用规则聚合,例如按 service + check + env,或者按 cluster + namespace + workload,把边界控制得更清楚。

但这里有一个常见误区:聚合不是越多越好。

如果把不相关的 Alert 聚合到同一个 Incident,值班人会以为它们是同一个故障,结果排障方向被带偏。比如支付服务错误率升高和推荐服务缓存命中率下降,时间上可能接近,严重级别也可能相似,但如果业务链路没有关系,把它们合成一个 Incident 只会制造新的混乱。

告警压缩率应该是结果指标,不是唯一目标。压缩率上升说明通知量下降了,但不能证明故障模型正确。真正要看的,是压缩后的 Incident 是否更接近人处理问题的方式:影响面清楚、责任团队清楚、关联告警合理、后续合入不重复打扰、故障关闭后能复盘。

上下文语义:标签质量决定聚合质量

很多团队一上来就调聚合规则,结果规则越来越复杂,效果仍然不稳定。根因通常不是聚合功能不够强,而是标签质量太差。

Flashduty 文档里讲得很明确:Labels 会贯穿告警处理流程,用于 Incident 过滤、路由分发、分派通知、Alert Grouping、Silence 和 Inhibition。也就是说,标签不是页面上展示给人看的附属信息,而是告警治理的基础数据。

至少要有几类稳定标签:service 表示业务服务或应用,resource 表示告警对象,check 表示检查项,env 表示环境,team 表示责任团队,clusterregion 表示集群、机房或地域。不同企业字段名可以不一样,但语义要稳定。

标签不稳定会带来三个问题。第一,路由不准,同一个服务的告警可能被送到不同 channel。第二,聚合不准,同一个故障拆成多个 Incident,或者不同故障被错误合并。第三,复盘不准,分析看板里看不出真正的高频服务、对象和检查项。

Flashduty 的 Label Enhancement 可以在告警进入系统时自动生成或修改标签,支持从标题、描述或已有标签中用正则提取,也可以组合生成新标签、通过映射表把 ID 转换为可读值,或者删除不需要的标签。更高级的场景还可以通过 API 映射查询外部系统,补充责任团队、服务等级等信息。

这类工作很工程化,也不如“AI 降噪”听起来性感,但它决定了后续治理能不能长期稳定。

静默、抑制、抖动检测,不要混着用

Event Aggregation 和 Alert Grouping 解决的是“如何把信号变成对象”。但告警疲劳还有几类典型噪声,需要用不同机制处理。

静默适合维护窗口和已知问题。比如计划发布、数据迁移、压测、硬件更换、定期重启,这些期间出现告警并不意外,继续通知只会制造干扰。Flashduty 的 Silence Rules 可以按严重程度、标题、描述、集成来源和标签匹配,行为可以选择直接丢弃,也可以保留并标记。更稳妥的做法通常是保留并标记,因为复盘时还能知道静默规则命中了什么。

抑制适合根因和派生告警。比如 Critical 级别的网络故障已经存在时,同一检查项或同一对象上的 Warning/Info 级别告警可能只是派生结果。Flashduty 的 Inhibit Rules 会在满足条件的活跃告警存在时,抑制相关的次要告警。这里要表达清楚三个东西:新的告警条件、作为抑制源的活跃告警条件、二者必须相同的属性或标签。抑制不是简单把低等级告警关掉,而是在根因存在时减少派生噪声。

抖动检测适合反复触发和恢复。网络短暂波动、依赖偶发超时、监控采集不稳定,都可能让同一个问题在短时间内不断触发和恢复。Flashduty 的 Flapping Detection 可以在同一 Incident 频繁触发和恢复时,将其标记为 flapping,并按策略减少通知干扰。

这些能力不能互相替代。把维护窗口告警用聚合处理,仍然会创建不必要的 Incident;把派生告警用静默处理,容易把真实变化也一起盖掉;把抖动问题简单调高阈值,可能漏掉临界状态恶化。正确做法是先判断噪声类型,再选择机制。

不同噪声类型对应不同治理机制

路由和分派:让 Incident 进入正确响应流程

告警疲劳还有一部分来自“打给了不该处理的人”。

如果所有告警都先进一个大群,再靠群里的人判断谁负责,响应流程一定会慢。因为每个人都看到了消息,但没有人确定自己应该接手。严重时,大家都以为别人会处理,真正事故反而无人认领。

Flashduty 的 Routing Rules 用于共享集成场景,可以基于标签、属性等条件把告警事件分发到对应 channel。路由模式包括标准路由和名称映射。标准路由适合固定映射,名称映射适合告警标签里已经带有业务标识,并且 channel 名称与标签值匹配的场景。路由规则还支持继续匹配或停止匹配,也支持默认路由兜底。

这意味着路由不是“通知渠道选择”,而是故障对象进入响应流程的第一道分类。一个好的路由策略,应该让支付服务的故障进入支付团队或核心业务 channel,让基础设施故障进入基础设施 channel,让低等级非生产告警进入弱通知通道。

但路由依赖标签,标签依赖上游数据和标签增强。这个链条断一环,最后都会表现为“通知乱”。

一个实用的故障对象建模顺序

如果你的团队现在已经有很多告警,不建议一开始就大规模删除监控规则。更稳的顺序是从响应层建模,再回到监控侧治理。

1. 接住多源告警

Prometheus、Zabbix、Nightingale、云监控、Grafana、邮件、自定义 webhook 都可以继续存在,先不要急着替换。关键是把这些信号统一接入响应平台,让团队能看到 Event、Alert、Incident 的层次关系。

2. 确认 alert_key 和标签

先找最吵的 10 类告警,看它们的 alert_key 是否合理,serviceresourcecheckenvteam 等标签是否稳定。缺失的用 Label Enhancement 补,明显错误的从上游修。

3. 开启 Event Aggregation

让同一告警生命周期里的触发、更新、恢复进入同一条 Alert,避免把状态变化变成人的重复待办。

4. 设计 Alert Grouping

先对最明确的场景做规则聚合,比如同一服务同一检查项、同一集群同一 workload、同一数据库实例同一检查项。对于字段不稳定但相似度明显的场景,可以先用智能聚合降低噪声,再逐步沉淀规则。

5. 补充静默、抑制、抖动检测和风暴预警

维护窗口用静默,派生告警用抑制,反复触发恢复用抖动检测,聚合后仍然持续合入大量 Alert 的 Incident 用 Alert Storm Warning 提醒团队升级关注。

6. 看数据而不是听感觉

至少跟踪通知次数、Incident 数量、压缩率、认领率、MTTA、MTTR、误合并反馈和漏报反馈。没有这些指标,团队很容易把“安静了”误判成“治理好了”。

从响应层建模到监控侧治理

验收标准不是压缩率,而是 Incident 可处理性

告警压缩率很有用,但它不是唯一验收标准。压缩率太低,说明重复通知仍然很多;压缩率太高,也可能说明不同故障被错误合并。真正的验收标准应该是可处理性。

一个好的 Incident,至少要满足几个条件。它代表一个相对明确的问题,而不是一堆随机告警;它能说明影响对象、严重级别、关联 Alert 和原始 Event;它能被路由到合适的 channel,并按升级规则触达正确的人;后续相似 Alert 合入时,不会反复通知;如果合入数量异常增长,系统会通过风暴预警提醒团队;事故结束后,团队能从 Incident 回看时间线、关联告警和处理动作。

这才是告警降噪的核心:不是让消息少一点,而是让每一次通知都更接近一个需要人判断和处理的真实问题。

FAQ

告警疲劳是不是只要减少通知次数就能解决?

不是。通知次数下降只能说明表面噪声减少了,不能证明故障对象建模正确。如果 Event、Alert、Incident 仍然混在一起,团队可能只是把真实问题也一起压下去了。更可靠的目标是让每个 Incident 都能对应一个相对明确、可分派、可认领、可复盘的问题。

Event Aggregation 和 Alert Grouping 有什么区别?

Event Aggregation 是从 Event 到 Alert 的聚合,主要解决同一条告警在一段时间内反复触发、更新、恢复的问题。Alert Grouping 是从 Alert 到 Incident 的聚合,主要解决一个故障引发多条相似或相关告警的问题。前者整理告警生命周期,后者整理响应对象。

为什么 alert_key 和标签会影响告警收敛?

alert_key 决定哪些 Event 可以进入同一条 Alert;标签决定 Incident 过滤、路由分发、分派通知、Alert Grouping、Silence 和 Inhibition 能不能稳定工作。如果 alert_key 太细,同一问题会被拆散;如果太粗,不同问题会被误合并。标签语义不稳定,聚合和路由都会失准。

智能聚合和规则聚合应该怎么选?

智能聚合适合快速开始,尤其是在告警风暴明显、字段还不够稳定时,用标题、描述、labels.servicelabels.resource 等字段先把相似告警收敛起来。规则聚合适合边界要求更明确的场景,例如按 service + check + envcluster + namespace + workload 精确聚合。成熟做法通常是先降低噪声,再把高价值场景沉淀成规则。

静默、抑制和抖动检测能不能互相替代?

不能。静默适合维护窗口和已知问题;抑制适合根因告警存在时减少派生告警;抖动检测适合同一 Incident 短时间内反复触发和恢复。把这些机制混着用,容易出现不必要的 Incident、真实变化被盖掉,或者临界状态恶化被漏掉。

结尾:先建模,再降噪

告警疲劳不是通知工具的问题。飞书、钉钉、短信、电话只是把结果送到人面前。真正决定值班人是否疲惫的,是前面有没有把监控信号整理成正确的对象。

如果 Event、Alert、Incident 混在一起,任何通知渠道都会变吵。如果这三层分清楚,再配合标签增强、路由、聚合、静默、抑制、抖动检测和风暴预警,告警治理才会从“凭感觉关规则”变成可验证的响应工程。

对已经被告警风暴困扰的团队,下一步可以很小:用 Flashduty 做一个 14 天试用,只接入一个最吵的告警源,先不改监控规则。看清楚 Event 如何进入 Alert,Alert 如何聚合成 Incident,再用真实数据验证通知次数、Incident 数量、压缩率、认领率和误合并情况。

你会很快知道,团队真正需要治理的是通知渠道,还是故障对象模型。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云