告警规则基础:定义、阈值、严重级别
告警规则,说白了就是一套“如果...就...”的条件判断。系统在监控着,数据不停地流进来,什么时候该通知你?就是规则触发的那一刻。我个人习惯把告警规则拆成三块:监控对象、判定条件、响应动作。这块搞不定,后面调优全是空中楼阁。
核心公式:告警规则 = 监控指标 + 阈值条件 + 持续时间 + 严重级别 + 通知策略
2.1 告警规则的定义与组成
每个告警规则,本质上是一个命名后的条件表达式。你在 Prometheus、Zabbix 或 Datadog 里写的那些规则文件,都逃不出这个范畴。
举个例子,一个典型的告警规则包含以下字段:
- 名称 —— 一眼看出问题在哪,比如“API 响应时间过高”
- 监控指标 —— 你要观察的数据,比如
http_request_duration_seconds - 聚合方式 —— 平均值?最大值?百分位?
- 比较运算符 ——
>、<、>=、== - 阈值 —— 具体的数值界限
- 持续时间 —— 持续多久才算触发,防止毛刺
- 严重级别 —— 影响程度(critical, warning, info 等)
- 标签 / 分组 —— 方便归类,比如
env=prod、region=us-east - 通知渠道 —— 发送给谁,怎么发
我记得最早接手的一个项目,老同事写了一条规则:cpu > 90,没有持续时间。结果每三分钟就被打断一次,一查全是瞬时毛刺。从那以后,持续时间 就成了我写规则时的“必填项”。
小技巧:我建议你在规则名称里加上“持续时长”的暗示,比如“CPU 高负载 5m”,排障时能省好多时间。
2.2 阈值的设定策略
阈值是告警规则的心脏。设得松,故障没人理;设得紧,整天狼来了。怎么做?我的经验是:先看历史数据,再定静态基线,最后补动态调整。
常用的阈值设定方法有下面几种:
| 方法 | 适用场景 | 风险点 |
|---|---|---|
| 静态阈值 | 资源水位(CPU、内存、磁盘) | 业务负载波动时容易误报 |
| 动态基线 | 周期性业务(如电商大促、日报生成) | 需要足够历史数据训练 |
| 百分位阈值(P99/P95) | 耗时、延迟类指标 | 长尾问题可能被掩盖 |
| 复合条件 | 需要多指标联合判断的场景 | 配置复杂度高 |
举个真实例子。我曾在某电商平台处理过“大促期间 CPU 告警淹没人”的问题。当时用了静态阈值 80%,大促期间业务量翻三倍,CPU 跑到 85% 其实正常。后来改用 同比上一小时同一分钟 的动态基线算法,误报率从 70% 降到了 5% 以下。
避坑:我曾经见过一个新手把阈值设成 0.99 的比率值,但指标本身是计数器(永远递增),结果从没触发过告警。你需要搞清楚指标类型——瞬时值 vs 累积值,环比 vs 同比。
2.3 严重级别的分层体系
严重级别不只是打标签,它决定了响应速度和通知方式。我个人习惯分四个层级:
- Critical(P0) —— 核心服务不可用,需要立即叫醒人。典型:支付接口 5xx 率 > 1%,持续 3 分钟。
- Warning(P1) —— 资源逼近极限,但还没影响用户。典型:CPU > 80% 持续 10 分钟。
- Info(P2) —— 需要关注但不紧急。典型:磁盘使用率 > 70%(预留扩容窗口期)。
- OK / 恢复 —— 问题已解决,用于关闭告警风暴。
这里有个关键点:级别不代表严重程度线性递增。我见过有人把所有指标都设成 Critical,结果 P0 告警跟普通日志一样多。你要给每个级别明确触发和恢复条件,否则迟早“告警疲劳”。
我的经验:严重级别最好跟 SLO 指标 挂钩。比如错误预算剩余 10% 时发 Warning,剩余 5% 时发 Critical。这样告警直接跟“对用户的承诺”绑定,业务方也认可。
2.4 完整规则示例(Prometheus + Alertmanager)
纸上谈兵没用,直接看一个真实规则。下面是我在一个微服务项目里用过的:
groups:
- name: api_service
rules:
- alert: APIHighLatency
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 2
for: 5m
labels:
severity: critical
service: api-gateway
annotations:
summary: "API 99% 响应时间 > 2s 持续 5 分钟"
description: "当前 P99 = {{ $value }}s,请立即排查"
注意几点:
expr里用了histogram_quantile,这是典型的百分位阈值for: 5m避免了抖动引起的误报severity: critical意味着它会走电话+钉钉双重通知
提示:一定在 annotations 里写清楚当前值和建议动作。值班的人可能不熟悉你的业务,文案要清晰。
2.5 知识体系总览
2.6 几个常见误区
最后说说我这些年踩过的坑,不想你也走一趟:
- 阈值设得“太精准”。比如将延迟阈值设成
1.000秒,结果网络波动 1.001 秒就告警,全是噪声。留 10%-20% 的余量。 - 忽略恢复条件。只定义触发,不定义恢复,导致告警一直挂在那,第二天发现其实问题早就没了。
- 把所有告警都发给同一个人。Critical 走电话,Warning 走钉钉群,Info 走日志——级别就是分流器。
- 告警文案里写死数值。用模板变量
{{ $value }}把当前实际值嵌进去,排障时一眼看出严重程度。
核心原则:告警规则不是写出来就完了。每次故障复盘,我都会问自己——“这个规则如果提前两分钟触发,能止损吗?” 回答不了,就改规则。