告警太多,通常不是一个“通知太多”的问题。
它更像是一个系统性问题:监控规则、告警语义、通知路由、值班机制、降噪策略、响应闭环和治理指标,都没有被放在一套体系里。
所以很多团队一开始会走错方向。
告警太多,就删规则。
夜里被吵醒,就调高阈值。
群里消息太多,就换个机器人。
没人响应,就再拉更多人进群。
重复告警太多,就让研发“自己优化一下”。
这些动作不是完全没用。
但它们只能缓解一部分症状,解决不了根因。
真正要治理告警,需要从两端同时下手:前面治理告警规则,后面建设告警响应平台。
只做前者,告警会更少一点,但关键故障仍然可能没人处理。
只做后者,响应流程更完整,但垃圾告警仍然会持续消耗值班人。
成熟的告警治理,一定是规则治理和响应治理一起做。
先承认一个事实:告警多不等于系统更安全
很多团队早期有一种朴素想法:多配点告警总比漏掉故障好。
这句话只对一半。
关键故障不能漏,这当然对。但如果所有小波动、低优先级异常、重复事件、瞬时抖动都变成告警,系统并不会更安全。
相反,它会更危险。
因为值班人会逐渐不信任告警。
一开始,群里来一条告警,大家还会看。后来一天几百条,大家开始扫一眼。再后来,告警成了背景噪音。真正严重的问题混在里面,也没人第一时间处理。
这就是告警疲劳。
告警疲劳最可怕的地方,不是人被吵得烦,而是组织对告警失去敬畏。
当团队默认“告警大概率没事”,关键故障就会被一起忽略。
所以,告警治理的目标不是让告警数量越少越好,也不是让告警覆盖越多越好。
目标应该是:让每一条需要打扰人的告警,都值得被处理。
第一步:先区分“事件、告警、故障”
很多团队告警混乱,是因为概念没有分清。
不是所有异常信号都应该直接通知人。
一个指标超阈值,是事件。
一个日志里出现错误关键字,是事件。
一个服务短暂重启,是事件。
一批相关事件满足触发条件,才应该形成告警。
一组需要人处理、影响服务稳定性的告警,才应该进入故障响应流程。
如果所有事件都直接打到群里,团队一定会被淹没。
成熟的告警体系,应该有分层。
底层是监控事件,尽量完整记录。
中间是告警,经过规则判断、标签增强、去重、聚合和分级。
上层是故障,需要分派、认领、升级、协同、关闭和复盘。
这也是为什么只靠 Prometheus、Zabbix、云监控、Grafana 机器人通知很难做完整治理。
它们可以很好地产生事件和告警,但未必能完整承接后面的响应流程。
Flashduty 这类 On-call 平台的价值,就在于把告警进一步变成可处理的故障。
第二步:治理告警源头
告警太多,第一件事不是上平台,而是先看告警源头是不是已经失控。
源头治理主要看四件事。
指标是否真的代表用户影响
很多告警来自底层资源指标。
CPU 高。
内存高。
磁盘高。
连接数高。
线程数高。
这些指标有价值,但不应该每次波动都直接变成高优先级告警。
一个服务 CPU 到 90%,但业务成功率正常、延迟正常、实例可以自动扩容,这不一定需要半夜叫人。
反过来,一个核心支付接口成功率从 99.9% 掉到 98%,CPU 可能完全正常,但这是需要立即响应的业务故障。
所以,告警规则要尽量靠近用户影响。
资源指标适合做容量预警、趋势分析和辅助判断。
业务成功率、错误率、延迟、可用性、数据延迟、任务积压,更适合作为关键告警。
不是底层指标不能告警,而是要分清级别。
阈值是否合理
阈值不合理,是告警噪音的常见来源。
有些阈值太敏感,轻微波动就告警。
有些阈值多年没改,早已不适合当前流量。
有些阈值对所有服务统一配置,但不同服务的流量和波动完全不同。
有些阈值没有持续时间,瞬时抖动也会通知人。
一个简单原则是:告警应该关注持续异常,而不是单点噪声。
比如 CPU 超 90% 持续 1 分钟,和持续 15 分钟,是完全不同的信号。接口错误率瞬间抖一下,和连续 5 分钟异常,也不是同一个问题。
很多告警不需要删除,只需要增加持续时间、调整阈值、按服务分级,噪音就会少很多。
严重级别是否清晰
很多团队的告警分级只有两个状态:告警和恢复。
这不够。
告警应该至少能区分:
Critical:正在影响核心服务,需要立即处理。
Warning:有风险或局部影响,需要关注但不一定立即打断。
Info:记录事件,用于排查上下文,不主动打扰人。
如果所有告警都按 Critical 发出来,最后等于没有级别。
值班人必须知道:哪些告警必须立刻响应,哪些可以工作时间处理,哪些只需要记录。
这件事不能只靠通知文案。
它要进入路由、分派、升级和报表。
标签是否足够完整
告警没有标签,就很难治理。
至少应该包含这些信息:
服务名。
环境。
集群。
实例。
团队。
严重级别。
告警类型。
业务线。
没有这些标签,后续就无法聚合、路由、抑制、统计,也无法知道该通知谁。
很多团队说告警平台不好用,最后发现根因是告警标签太差。
标题里写了一堆自然语言,但没有结构化字段。人能勉强看懂,系统没法处理。
告警治理的第一步,往往不是配置复杂策略,而是把标签补齐。
第三步:不要让所有告警直接通知人
源头治理之后,仍然会有大量告警。
这时候不能简单地把它们全部发到群里。
必须经过响应侧处理。
这里面最重要的是四类能力:聚合、抑制、静默、延迟。
聚合:把重复告警变成一个故障
一个服务异常,可能触发多条告警。
接口错误率升高。
P99 延迟升高。
实例重启。
下游调用失败。
日志错误增多。
如果这些告警分别通知,值班人会被刷屏。
更合理的做法,是把相似告警聚合成一个故障。
同一个服务、同一个实例、同一个检查项、同一个业务线,在一定时间窗口内触发的告警,可以合并到同一个故障里。
值班人处理的是故障,而不是一条条原始告警。
这能显著降低认知负担。
Flashduty 的聚合能力,就是为这个场景设计的。事件进入后形成告警,相似告警再合并为故障,后续告警进入同一故障时间线,而不是反复打扰。
抑制:根因存在时,屏蔽次生告警
抑制解决的是依赖关系问题。
比如一台数据库宕机,上游十几个服务都报错。真正需要优先处理的是数据库故障,而不是每个上游服务的错误率告警。
如果 Critical 级别根因告警已经存在,同一对象或同一检查项下的 Warning 告警可以暂时抑制。
再比如网络链路故障时,大量主机不可达告警可能都是次生现象。此时如果每台机器都通知一次,只会制造混乱。
抑制的关键是:不要让结果告警淹没根因告警。
这需要告警之间有标签和关系,否则系统无法判断哪些应该被抑制。
静默:计划内变化不要打扰人
很多告警来自计划内操作。
发布。
维护。
扩容。
数据库切换。
压测。
机房演练。
如果这些动作本来就是计划内的,还不停触发告警,值班人很快会失去耐心。
静默不是忽略问题,而是对已知、计划内、可接受的异常做管理。
好的静默应该有条件、有时间范围、有负责人、有记录。
不要用长期静默掩盖问题,也不要靠手工临时关规则。
静默最好保留标记,方便事后查看哪些告警被静默过。
延迟:给短暂自愈留窗口
有些告警会自动恢复。
比如短暂网络抖动、实例重启、瞬时 CPU 抖动、临时连接数升高。
如果一触发就通知人,很多通知其实没有必要。
延迟通知可以给这类告警一个观察窗口。
如果窗口内恢复,就不打扰人。
如果持续异常,再进入分派和升级。
这对减少夜间打扰非常有用。
但延迟不能滥用。核心交易链路的 Critical 告警,不应该随便延迟太久。
关键还是分级。
第四步:把通知变成响应流程
很多团队把告警治理停留在“发给谁”。
但 On-call 真正要解决的不是通知,而是响应。
通知只是开始。
一个告警发出后,还要回答:
谁负责?
有没有认领?
多久没响应需要升级?
处理过程在哪里记录?
是否需要拉群协同?
恢复后如何关闭?
事后是否需要复盘?
如果这些问题没有机制,告警仍然可能没人处理。
群消息最大的问题,就是缺少状态。
它能告诉大家“发生了什么”,但不能稳定管理“谁在处理、处理到哪一步、是否超时、是否升级、是否关闭”。
专业 On-call 平台应该把告警变成故障生命周期。
触发。
分派。
通知。
认领。
处理。
升级。
关闭。
复盘。
每一步都应该有记录。
这也是 Flashduty 和普通通知机器人的核心区别。
第五步:用数据衡量治理效果
告警治理不能只靠感觉。
很多团队说“最近告警少了”,但到底是系统更稳定了,还是规则被关掉了?
说“响应快了”,但 MTTA、MTTR 有没有变好?
说“噪音少了”,但压缩率、夜间打扰次数、重复告警 Top 有没有下降?
这些都需要数据。
至少应该看几个指标。
告警总量:进入系统的原始告警有多少。
故障数量:真正需要处理的故障有多少。
压缩率:原始告警被聚合、抑制、静默后减少了多少打扰。
MTTA:从故障触发到首次认领用了多久。
MTTR:从故障触发到恢复关闭用了多久。
认领率:有多少故障被明确认领。
升级次数:有多少故障因为无人响应或超时被升级。
夜间打扰次数:休息时间有多少通知打断人。
高频告警 Top:哪些规则、服务、对象最吵。
这些指标能让告警治理从“大家感觉很累”变成可管理问题。
管理者也能据此推动规则优化、服务治理和值班机制调整。
一套完整的治理路径
如果从零开始治理告警,我建议按这个顺序做。
第一,盘点告警源。
列出 Prometheus、Zabbix、Nightingale、Grafana、云监控、自研系统、日志告警等所有来源。先知道告警从哪里来。
第二,统一接入。
不要让每个系统各发各的通知。先把告警统一接入一个响应平台,至少让后续治理有统一入口。
第三,补标签。
服务、环境、团队、严重级别、业务线、实例、集群这些标签要尽量标准化。没有标签,后面很多策略都做不好。
第四,做分级。
区分 Critical、Warning、Info,不同级别采用不同通知和升级策略。不要所有告警都电话叫人。
第五,做聚合。
先处理重复告警和同源告警,把多条告警压缩成一个故障。
第六,做静默和抑制。
把计划内维护、低价值次生告警、已知根因下的重复告警治理掉。
第七,配置值班和升级。
明确每类故障通知谁、多久未认领升级、工作时间和非工作时间是否不同。
第八,建立报表。
定期看告警量、故障量、压缩率、MTTA、MTTR、高频告警 Top,用数据驱动下一轮治理。
这套路径比“删规则”慢一点,但更稳。
因为它不是单点止痛,而是在重建告警响应体系。
哪些告警应该保留,哪些应该降级
告警治理不是一味减少。
有些告警必须保留,而且要更强触达。
比如核心业务不可用、支付成功率下降、订单创建失败、用户登录大面积失败、关键队列严重堆积、数据库主库不可用、核心依赖超时。
这些告警应该明确进入 Critical 流程,通知值班人,超时升级,必要时电话触达。
另一些告警应该降级。
比如单实例 CPU 短暂升高、非核心服务轻微错误率波动、短时间自动恢复的连接数异常、计划内维护引发的服务重启。
它们可以记录为 Warning 或 Info,可以进入日报或周报,但不一定需要马上打断人。
还有一些告警应该删除或改造。
比如长期无动作的告警、没人负责的告警、触发后没有处理手段的告警、重复表达同一问题的多条规则。
判断一条告警是否值得保留,可以问四个问题:
它是否代表真实用户影响或明确风险?
触发后是否有人知道怎么处理?
它是否有明确负责人?
它是否比已有告警提供了新的信息?
如果答案都是否定的,这条告警大概率不应该打扰人。
Flashduty 适合放在哪个位置
Flashduty 不应该被理解成替代所有监控系统。
它更适合放在监控系统之后,作为统一告警响应层。
Prometheus、Zabbix、Nightingale、Grafana、云监控、自研系统继续负责发现异常。
Flashduty 负责把这些异常统一接入、清洗、聚合、抑制、静默、分派、升级、协同、分析和复盘。
这样切入阻力小。
你不需要先推翻现有监控。
不需要要求所有团队立刻换工具。
不需要重建所有规则。
先把告警接住。
接住之后,再看哪些告警重复、哪些告警无人处理、哪些告警夜里最吵、哪些服务贡献了最多故障。
然后一轮一轮治理。
这比在各个监控系统里分散改规则更容易形成闭环。
一个 14 天治理实验
如果团队还在犹豫要不要做专业 On-call 平台,可以先做一个 14 天实验。
第一天,接入一个主要告警源,比如 Prometheus 或 Zabbix。
第二天,补齐关键标签:service、env、severity、team。
第三天,配置一个核心团队的值班表和分派策略。
第四天,打开基础聚合,把重复告警合并为故障。
第五天,配置计划维护静默规则。
第六天,配置 Critical 告警升级策略。
第七天,复盘前一周告警 Top,看最吵的服务和规则。
第二周,开始针对 Top 问题做治理:调阈值、加持续时间、降级低价值告警、合并重复规则、增加抑制策略。
14 天结束时,看几个结果:
原始告警量是多少。
最终故障量是多少。
压缩率是多少。
Critical 告警是否都有人认领。
MTTA 是否可统计。
夜间打扰是否下降。
高频噪音来源是否清楚。
如果这些数据能跑出来,团队就不再是在凭感觉讨论“告警太多”。
你已经有了一份告警治理诊断报告。
最后
告警太多,不能只靠删规则解决。
删规则可能会让群里安静一点,但不一定让系统更安全。
真正成熟的告警治理,应该同时回答两个问题:
哪些异常值得打扰人?
一旦打扰人,如何确保它被正确处理?
前一个问题靠规则治理。
后一个问题靠告警响应平台。
只有两者结合,团队才能从“告警很多、大家很累”走向“关键故障一定触达、低价值告警持续减少、响应过程可追踪、治理效果可衡量”。
Flashduty 的价值就在这个位置。
它不是让你放弃 Prometheus、Zabbix、Nightingale 或云监控。
它是把这些系统产生的告警接住,然后变成可聚合、可分派、可升级、可协同、可复盘、可分析的故障响应流程。
如果你的团队已经被告警淹没,下一步不要急着继续调阈值。
先做一次完整盘点:告警从哪里来,哪些值得通知,哪些应该聚合,哪些应该抑制,谁负责响应,多久需要升级,最后用什么指标证明治理有效。
这才是告警治理真正开始的地方。