把告警当成一个会喊“狼来了”的同事,要既不误报也不漏报,核心不是把阈值调高或调低,而是让每条告警都对应一个可执行动作,阈值来自历史基线,通知走分级升级。
监控告警误报太多怎么处理?先拆掉三个常见来源
多数情况下,误报不是因为一个参数设错,而是三个来源叠加:阈值拍脑袋、瞬时抖动不收敛、通知发出后没有闭环,逐层处理即可。
告警阈值设置多少合适?用动态基线和波动区间
固定阈值是最常见的误报来源,CPU 超过 90% 就告警,凌晨批处理跑满时也会触发,但这不是故障,更合适的做法是让阈值跟着历史基线走。
以 Prometheus 为例,不要写 cpu_usage > 90,可以基于过去 7 天同一时段的均值加波动区间:
expr: |
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) 100)
> (avg_over_time(100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) 100))[7d:1h]) 1.5
for: 10m
这表示当前 CPU 超过同时段均值的 1.5 倍,并持续 10 分钟才触发。for 不能省,它能把瞬时尖峰过滤掉。
如果用的是 Zabbix,可以启用预测触发函数,forecast() 判断趋势,而不是等指标已经越过红线,Zabbix 中的触发器表达式可写:
forecast(/host/key, 15m, 0) > 95
意思是未来 15 分钟会超过 95% 才告警,提前量有了,误报也会下降。
阈值设置没有统一答案,但有一个判断标准:触发后你是否愿意立刻处理,如果每次看到告警都先等 10 分钟确认,说明阈值太敏感。
告警收敛规则怎么配?先合并再抑制
单台机器抖动可能不是问题,成片抖动才是,收敛规则解决的是“一次故障刷出几百条通知”。

Alertmanager 的收敛配置主要看四个参数:
route: group_by: ['alertname', 'job'] group_wait: 30s group_interval: 5m repeat_interval: 2h
group_by 把同类型告警合进一条,group_wait 给第一批告警一个等待窗口,group_interval 控制后续新告警加入同一通知的频率,repeat_interval 决定同一条告警多久提醒一次,不要设置 repeat_interval: 1m,否则一个未恢复的故障会刷屏。
抑制规则更直接:磁盘满了会触发大量服务不可用,配置一条“磁盘告警存在时,抑制该主机上的其他服务告警”,Alertmanager 中用 inhibit_rules 即可。
Zabbix 用户可以在“动作”里设置条件:同一主机的相同触发器 5 分钟内只发送一次,或依赖项告警不重复发送,Zabbix 的“依赖项”功能适合机房网络设备,上游交换机挂了,下游服务器告警会被自动抑制。
服务器告警规则配置:每条告警必须带“动作字段”
这是很多团队忽略的一点,告警详情里只有“CPU high on 192.168.1.10”,收到的人不知道干什么,等查完上下文,故障已经扩大。
服务器告警规则配置里应强制加上注解字段,Prometheus 的 annotations:
annotations: action: "登录主机执行 top -c,确认是否为备份任务;若是业务进程,参考 runbook: /ops/runbooks/cpu-high.md" owner: "基础架构组"
这个字段不是给机器看的,是给凌晨被叫醒的人看的,没有动作字段的规则,建议先停用,补齐再启用。
开源监控告警工具对比:选错工具会把收敛做成补救
工具选型本身会影响误报和漏报,以下是常见开源监控告警工具对比:

| 工具 | 收敛能力 | 学习成本 | 适合场景 |
|---|---|---|---|
| Prometheus + Alertmanager | 强,原生支持分组、抑制、静默 | 中 | 云原生、Kubernetes、微服务 |
| Zabbix | 中,依赖动作和依赖项 | 低 | 传统机房、网络设备、Windows |
| Nightingale | 强,内置告警降噪和值班管理 | 低中 | 混合架构、国内团队 |
| Grafana Alerting | 中,多数据源统一告警 | 中 | 已有 Grafana 体系 |
业内专家指出,工具本身不会减少误报,但收敛能力强的工具能把“误报爆炸”控制在小范围,给团队留出时间调整阈值,开源版均为免费,商业版按规模授权,价格差异主要体现在高可用和长期存储上。
北京机房服务器告警怎么减少漏报?用分级和升级通道
北京机房的服务器通常承载核心业务或合规数据,漏报成本比误报更高,减少漏报不能靠把阈值设得很低,那样只会回到误报,正确做法是分级和升级。
告警级别只分 P0 到 P3,每条只属于一级
P0:客户无法使用,需要立即处理,P1:核心功能降级,10 分钟内处理,P2:单个组件异常,有冗余,30 分钟内处理,P3:预警类,不影响业务,可工作时间处理。
不要把“硬盘使用率 80%”设成 P0,也不要把“交易成功率下降 5%”设成 P3,级别定错,要么漏报要么疲劳。
升级策略:未确认自动升级,避免单人遗漏
告警发出后,5 分钟没人确认,自动通知第二值班人;15 分钟没人处理,升级到技术负责人,这是典型的升级通道,几乎所有的值班系统都支持,PagerDuty、OnCall 或 Nightingale 内置值班表。

行业共识认为,未确认的告警升级到团队而不是个人,能明显降低漏报概率。
从“调阈值”到“调动作”:日常维护清单
告警系统需要像仓库一样定期盘点,建议每月做一次告警审计:
- 查看过去 30 天触发次数最多的告警,逐条判断:是真的需要处理,还是阈值太敏感。
- 回收超过 20 天没有触发的静默规则,静默不是永久免打扰。
- 删除没有对应 runbook 的告警规则,或补齐动作字段。
- 对核心业务的 P0 告警做一次演练,确认通知链路能到达值班手机。
阈值不是一成不变,业务上量、架构调整、流量峰值变化后,基线需要重新计算,把每一个告警当成一次“请处理”的请求,而不是一声“出事了”的噪音,误报和漏报自然会回到平衡点。
告警怎么设才能既不误报也不漏报的常见问题
告警阈值设置多少合适?
没有固定数值,应该基于历史基线和波动区间,CPU、内存、磁盘、QPS 都要分开设置,业务峰值和低谷差异大的指标优先用动态阈值,不能用一个 90% 套所有主机。
监控告警误报太多怎么处理?
先看三个点:阈值是否固定、是否缺少 for 持续时间、是否没有分组收敛,把固定阈值改成动态基线,增加 5 到 10 分钟的持续条件,再配置 Alertmanager 的 group_by 和 repeat_interval,多数误报会明显下降。
服务器告警规则配置有哪些必须字段?
必须包含触发条件、持续时间、告警级别、动作说明、负责人,动作说明要能直接指导处理,比如登录命令、查看路径或 runbook 地址,缺少动作说明的规则应立即补齐或停用。