告警规则的基本结构

一条完整的 Prometheus 告警规则包含 5 个要素:

groups:
  - name: example
    rules:
      - alert: HighCPUUsage          # 告警名称
        expr: cpu_usage > 0.8        # PromQL 表达式
        for: 5m                      # 持续时间阈值
        labels:
          severity: warning          # 标签
        annotations:
          summary: "CPU 使用率过高"   # 注解
          description: "实例 {{ $labels.instance }} CPU 使用率 {{ $value }}"

注意事项1:合理设置持续时间阈值(for)

  • 太短:产生大量误报(网络抖动、瞬时峰值)
  • 太长:真实故障发现延迟

建议:

  • 关键指标(服务不可用):2-5 分钟
  • 资源指标(CPU、内存):10-15 分钟
  • 趋势类指标(磁盘增长):30 分钟以上

注意事项2:避免高基数标签

不要在告警规则中使用用户 ID、请求 ID 等高基数标签,会导致时间序列爆炸。

# 错误示例
expr: http_requests_total{user_id=~".+"} > 100

# 正确示例
expr: sum(rate(http_requests_total[5m])) by (service) > 100

注意事项3:善用标签和注解

标签用于路由和分组,注解用于提供上下文信息。

annotations:
  summary: "服务 {{ $labels.service }} 响应时间过高"
  description: "P99 延迟 {{ $value }}ms,超过阈值 500ms"
  runbook: "https://wiki.example.com/runbook/high-latency"

注意事项4:防止告警疲劳

按严重程度分层,只对需要立即人工介入的情况发送告警。

使用 Inhibition 规则:当严重告警触发时,自动抑制相关的警告级告警。

inhibit_rules:
  - source_match:
      severity: critical
    target_match:
      severity: warning
    equal: [service]

注意事项5:基于历史数据设置阈值

不要用通用标准,要基于实际观测的基线数据。同一个指标在不同业务场景下的正常范围差异很大。


注意事项6:测试和验证

# 语法检查
promtool check rules /etc/prometheus/rules/*.yml

# 单元测试
promtool test rules /etc/prometheus/tests/*.yml

在测试环境验证告警规则,确认触发条件和通知内容符合预期。


注意事项7:定期维护

  • 定期审查告警触发记录,清理长期不触发或频繁误报的规则
  • 用版本控制管理告警规则文件
  • 为每条规则添加注释,说明告警的业务含义和处理建议