告警规则基础:定义、阈值、严重级别

告警规则,说白了就是一套“如果...就...”的条件判断。系统在监控着,数据不停地流进来,什么时候该通知你?就是规则触发的那一刻。我个人习惯把告警规则拆成三块:监控对象、判定条件、响应动作。这块搞不定,后面调优全是空中楼阁。

核心公式:告警规则 = 监控指标 + 阈值条件 + 持续时间 + 严重级别 + 通知策略

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 知识体系总览

告警规则核心结构 告警规则 1. 监控指标 2. 阈值条件 3. 严重级别 名称 / 标签 持续时长 静态 / 动态 / 百分位 Critical / Warning / Info 三者缺一不可 指标决定了“看什么”,阈值决定了“怎么看”,严重级别决定了“怎么反应” 组合得当才能既不错过故障,又不被告警淹没

2.6 几个常见误区

最后说说我这些年踩过的坑,不想你也走一趟:

  1. 阈值设得“太精准”。比如将延迟阈值设成 1.000 秒,结果网络波动 1.001 秒就告警,全是噪声。留 10%-20% 的余量。
  2. 忽略恢复条件。只定义触发,不定义恢复,导致告警一直挂在那,第二天发现其实问题早就没了。
  3. 把所有告警都发给同一个人。Critical 走电话,Warning 走钉钉群,Info 走日志——级别就是分流器。
  4. 告警文案里写死数值。用模板变量 {{ $value }} 把当前实际值嵌进去,排障时一眼看出严重程度。

核心原则:告警规则不是写出来就完了。每次故障复盘,我都会问自己——“这个规则如果提前两分钟触发,能止损吗?” 回答不了,就改规则。