3、告警规则原理:Prometheus告警规则结构

Prometheus 告警规则是容量水位巡检的“触发器”。一条规则定义了:在什么指标条件下、持续多久、触发什么级别的告警。理解规则结构是编写精准巡检策略的基础。

3.1 告警规则核心结构

一条完整的 Prometheus 告警规则由五个字段组成,定义在 groups 下的 rules 列表中:

字段 必填 说明 容量巡检示例
alert 是 告警名称,必须唯一且语义清晰 NodeDiskUsageHigh
expr 是 PromQL 表达式,返回非零值即触发 node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.1
for 否 持续时间,防止瞬时抖动误报 5m
labels 否 附加标签,用于告警路由、分组、严重级别 severity: critical
annotations 否 描述信息,用于告警通知模板 summary: "磁盘使用率超过90%"
关键原则: expr 是规则的核心,for 是稳定性的保障,labels 和 annotations 是告警可运维性的关键。

3.2 字段深度解析

3.2.1 alert —— 告警名称

命名规范建议采用 大驼峰 + 层级前缀 方式,例如 K8sPodMemoryUsageHigh。避免使用空格或特殊字符,保持与 Prometheus 标签体系兼容。

3.2.2 expr —— PromQL 表达式

表达式返回的 向量值 > 0 时,规则进入评估状态。容量巡检中常用三类表达式模式:

  • 阈值比较: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.05
  • 速率预测: predict_linear(node_filesystem_free_bytes[6h], 24*3600) < 0
  • 资源饱和度: rate(container_cpu_cfs_throttled_seconds_total[5m]) > 0.2

3.2.3 for —— 持续时间

for 字段是告警规则中 防抖机制 的核心。在容量巡检中,建议按场景设置不同时长:

场景 推荐 for 值 原因
磁盘使用率 5m 磁盘变化慢,短时间波动多为采样误差
CPU 饱和度 2m CPU 突发频繁,但持续高负载才需告警
内存泄漏 10m 内存增长需排除 GC 抖动,观察趋势
Pod 重启 1m 重启事件应快速响应,但避免单次 OOM 误报

3.2.4 labels —— 标签与路由

labels 用于告警的 分组、路由和去重。容量巡检中至少应包含:

  • severity:critical / warning / info
  • team:infra / sre / platform
  • tier:storage / compute / network

3.2.5 annotations —— 通知模板

annotations 不参与告警分组,但会注入到告警通知中。建议包含:

  • summary:一句话概括问题
  • description:详细上下文,可引用模板变量 {{ $value }}、{{ $labels.instance }}
  • runbook_url:指向运维手册链接
# 完整告警规则示例
groups:
  - name: capacity_watermark
    rules:
      - alert: NodeDiskUsageHigh
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.1
        for: 5m
        labels:
          severity: critical
          team: sre
        annotations:
          summary: "节点 {{ $labels.instance }} 磁盘使用率超过 90%"
          description: "当前可用率 {{ $value | humanizePercentage }},请立即排查"
          runbook_url: "https://wiki.example.com/runbook/disk-full"

3.3 规则评估周期

Prometheus 使用 全局评估间隔 来周期性计算所有告警规则。评估周期由启动参数 --eval-interval 控制,默认 1 分钟。

评估周期 vs 采集周期: 采集周期(scrape_interval)决定数据入库频率,评估周期决定规则计算频率。两者通常保持一致,但容量巡检场景建议评估周期 ≤ 采集周期,避免数据空洞导致漏报。

评估流程如下:

  1. Prometheus 每 eval_interval 秒执行一次所有规则。
  2. 对每条规则,执行 expr 查询,获取返回的瞬时向量。
  3. 如果向量非空(有样本值 > 0),则检查 for 字段:
    • 无 for:立即进入 Firing 状态。
    • 有 for:启动计时器,持续满足条件达到 for 时长后进入 Firing。
  4. 一旦条件不满足,计时器重置,告警进入 Pending → Resolved 流程。
告警规则评估生命周期 Expr 评估 Pending Firing Resolved 条件满足 持续 for 时长 条件恢复 条件再次满足 评估周期默认 1 分钟,for 时长建议 ≥ 2 个评估周期以避免抖动

3.4 评估周期对容量巡检的影响

评估周期的选择直接影响告警的 时效性 和 系统开销:

评估间隔 优势 劣势 适用场景
15s 秒级响应,适合突发容量事件 Prometheus 负载高,规则多时可能超时 核心服务内存/CPU 快速耗尽
1m 默认值,平衡负载与时效 对慢速指标(磁盘)足够,对快速指标偏慢 大多数容量水位场景
5m 极低负载,适合长期趋势 告警延迟可达 5-10 分钟 存储空间、日志增长等慢变指标
避坑提示: 不要将 for 设置为小于 2 倍评估周期的值。例如评估周期 1 分钟,for: 30s 会导致规则在两次评估之间无法稳定判断,容易产生 Pending → Firing 的反复抖动。

3.5 规则结构总结