Prometheus告警规则设计实战:从指标采集到多级告警体系构建

告警规则设计的常见误区

监控告警体系搭建中,最常见的错误不是缺少告警,而是告警太多。大量低质量告警会导致告警疲劳——运维人员对告警麻木,真正严重的故障反而被淹没。有效的告警体系应遵循以下原则:每条告警都必须可操作(收到后知道该做什么)、告警阈值基于SLO而非绝对值、多级告警对应不同响应级别。

Prometheus告警规则核心语法

AlertManager配合Prometheus的告警规则,是目前最主流的开源告警方案。规则文件使用YAML格式:

groups:
- name: node_alerts
  rules:
  - alert: NodeHighCPU
    expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
    for: 5m
    labels:
      severity: warning
      team: infra
    annotations:
      summary: "节点 {{ $labels.instance }} CPU使用率超过85%"
      description: "当前CPU使用率 {{ $value }}%,持续5分钟"
      runbook: "https://wiki.internal/runbook/node-high-cpu"

  - alert: NodeCPUCritical
    expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 95
    for: 2m
    labels:
      severity: critical
      team: infra
    annotations:
      summary: "节点 {{ $labels.instance }} CPU使用率超过95%"
      runbook: "https://wiki.internal/runbook/node-high-cpu"

关键字段说明:for指定持续时间,避免瞬时抖动触发告警;labels用于路由和分组;annotations用于展示详细信息;runbook指向处理手册。

基于SLO的告警:Burn Rate方法

传统阈值告警(CPU>80%)是粗粒度的,无法反映对业务的实际影响。Google提出的SLO告警方案基于错误预算消耗速率(Burn Rate):

groups:
- name: slo_alerts
  rules:
  # SLO: 99.9%可用性,30天窗口
  # 错误率 = 1 - 可用性 = 0.1%
  # Burn Rate = 实际错误率 / SLO错误率
  
  # 短窗口高Burn Rate触发Page告警
  - alert: HighErrorBudgetBurnPage
    expr: |
      (
        sum(rate(http_requests_total{code=~"5.."}[1h])) 
        /
        sum(rate(http_requests_total[1h]))
      ) 
      /
      0.001 > 14.4
    for: 5m
    labels:
      severity: page
    annotations:
      summary: "错误预算消耗速率过高,1小时内消耗了超过5%的月度预算"

  # 长窗口中Burn Rate触发Ticket告警
  - alert: HighErrorBudgetBurnTicket
    expr: |
      (
        sum(rate(http_requests_total{code=~"5.."}[6h])) 
        /
        sum(rate(http_requests_total[6h]))
      ) 
      /
      0.001 > 6
    for: 30m
    labels:
      severity: ticket
    annotations:
      summary: "错误预算持续消耗,6小时内消耗了超过2%的月度预算"

14.4和6是Google SRE手册推荐的阈值系数。短窗口高Burn Rate表示突发故障需要立即响应,长窗口中Burn Rate表示慢性退化需要工单跟踪。

AlertManager路由与抑制规则配置

AlertManager的核心能力是多渠道路由和告警抑制:

route:
  receiver: 'default-slack'
  group_by: ['alertname', 'cluster', 'namespace']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
  - match:
      severity: page
    receiver: 'pager-duty'
    group_wait: 10s
    repeat_interval: 1h
  - match:
      severity: critical
    receiver: 'pager-duty'
  - match:
      team: db
    receiver: 'db-team-slack'

inhibit_rules:
  # 节点Down时抑制该节点上的所有服务告警
  - source_match:
      alertname: NodeDown
    target_match:
      severity: warning
    equal: ['instance']
  # 数据库主从切换时抑制从库告警
  - source_match:
      alertname: MySQLFailover
    target_match_re:
      alertname: MySQLReplicationLag|MySQLSlaveDelay

receivers:
- name: 'pager-duty'
  pagerduty_configs:
  - service_key: <key>
- name: 'default-slack'
  slack_configs:
  - api_url: <webhook>
    channel: '#alerts'
- name: 'db-team-slack'
  slack_configs:
  - api_url: <webhook>
    channel: '#db-alerts'

告警静默与维护窗口管理

计划内维护(部署、扩容)会触发大量预期告警。使用silence机制而非关闭告警规则:

# 通过API创建静默规则
curl -X POST http://alertmanager:9093/api/v2/silences -H 'Content-Type: application/json' -d '{
  "matchers": [
    {"name": "cluster", "value": "prod-east", "isRegex": false}
  ],
  "startsAt": "2026-07-29T02:00:00Z",
  "endsAt": "2026-07-29T04:00:00Z",
  "createdBy": "ops-team",
  "comment": "计划内数据库维护窗口"
}'

# 查看当前生效的静默
curl http://alertmanager:9093/api/v2/silences | jq '.[] | select(.status.state=="active")'

告警质量度量:持续优化告警体系

告警体系需要持续度量才能不断优化。关键指标:

1. 告警准确率(告警后确实有问题的比例),目标>90%

2. 告警响应时间(从告警触发到人工确认的时间),Page级<5分钟

3. 告警解决时间(从告警触发到故障修复的时间),按P0/P1/P2分级统计

4. 告警重复率(同一问题触发的告警次数),高重复率说明抑制规则不足

每季度review告警数据,淘汰持续低准确率的告警规则,合并重复告警,调整阈值。告警体系的健康度直接决定了SRE团队的响应效率。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-gao-jing-gui-ze-she-ji-shi-zhan-cong-zhi-biao/

(0)
小编小编
上一篇 2026年7月29日
下一篇 2026年7月29日

相关推荐

Prometheus告警规则设计实战:从指标采集到分级告警的SRE最佳实践

告警体系为什么总出问题

告警过多导致值班人员麻木、关键告警被淹没、告警阈值不合理引发误报——这三个问题几乎出现在所有没有系统设计过告警规则的团队里。SRE方法论中,告警系统的核心目标是”在用户感知到故障之前发现问题”,而非”把所有异常都报出来”。一套经过设计的Prometheus告警体系,需要从指标选择、规则编写、分级策略、路由分发到抑制静默全链路考虑。本文给出从零搭建可运维告警体系的完整路径。

指标分类与告警规则设计原则

不是所有指标都适合告警。把指标分为四类:

  • 黄金指标(Golden Signals):延迟、流量、错误率、饱和度——这四个是必须告警的核心
  • 业务指标:订单量、支付成功率等——需要根据业务SLI设定阈值
  • 资源指标:CPU、内存、磁盘——设高水位告警即可
  • 运维指标:进程存活、配置变更——简单阈值判断

告警规则设计的三条原则:

  1. 每条告警必须对应一个明确的处理动作,无法指导行动的告警不该存在
  2. 优先使用速率类指标而非绝对值,减少短时波动误报
  3. 设置合理的for持续时间,避免瞬时抖动触发告警

黄金指标告警规则编写

以下是一组经过生产验证的核心告警规则:

# prometheus_rules/golden_signals.yml
groups:
  - name: golden_signals
    interval: 30s
    rules:
      # 错误率告警 - 5分钟内5xx比例超过5%
      - alert: HighErrorRate
        expr: |
          (
            sum(rate(http_requests_total{status=~"5.."}[5m]))
            /
            sum(rate(http_requests_total[5m]))
          ) > 0.05
        for: 2m
        labels:
          severity: critical
          team: sre
        annotations:
          summary: "服务 {{ $labels.service }} 5xx错误率超过5%"
          description: "当前5xx比例: {{ $value | printf "%.2f" }}%,持续2分钟"

      # 延迟告警 - P99延迟超过基线3倍
      - alert: HighLatencyP99
        expr: |
          histogram_quantile(0.99,
            sum(rate(http_request_duration_seconds_bucket[5m]))
            by (le, service)
          ) > 
          histogram_quantile(0.99,
            sum(rate(http_request_duration_seconds_bucket[24h]))
            by (le, service)
          ) * 3
        for: 5m
        labels:
          severity: warning
          team: sre
        annotations:
          summary: "服务 {{ $labels.service }} P99延迟异常"
          description: "当前P99: {{ $value | printf "%.3f" }}s,超过24小时基线的3倍"

      # 流量突降 - 5分钟QPS相对1小时前下降超过50%
      - alert: TrafficDrop
        expr: |
          (
            sum(rate(http_requests_total[5m]))
            /
            sum(rate(http_requests_total[1h] offset 1h))
          ) < 0.5
        for: 3m
        labels:
          severity: critical
          team: sre
        annotations:
          summary: "整体流量突降超过50%"
          description: "当前QPS相对1小时前: {{ $value | printf "%.1f" }}倍"

      # 饱和度 - 连接池使用率超过85%
      - alert: ConnectionPoolSaturation
        expr: |
          (
            db_connection_pool_active / db_connection_pool_max
          ) > 0.85
        for: 5m
        labels:
          severity: warning
          team: dba
        annotations:
          summary: "数据库连接池 {{ $labels.pool }} 使用率超过85%"
          description: "活跃连接: {{ $value | printf "%.1f" }}%"

告警分级与路由策略

告警分级决定了通知渠道和响应时效。建议分为三级:

级别 含义 通知方式 响应时效
P1-Critical 业务不可用或即将不可用 电话+即时消息+邮件 5分钟内响应
P2-Warning 指标异常但未影响业务 即时消息+邮件 30分钟内响应
P3-Info 需关注的趋势变化 邮件/日报 工作时间内处理

Alertmanager路由配置示例:

# alertmanager.yml
route:
  group_by: ['alertname', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
    - match:
        severity: critical
      receiver: 'critical-team'
      repeat_interval: 15m
    - match:
        severity: warning
      receiver: 'warning-team'
      repeat_interval: 2h

receivers:
  - name: 'default'
    webhook_configs:
      - url: 'http://alertmanager-webhook:8080/alert'
  - name: 'critical-team'
    pagerduty_configs:
      - routing_key: 'YOUR_PAGERDUTY_KEY'
  - name: 'warning-team'
    webhook_configs:
      - url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'

告警抑制与静默机制

抑制(Inhibit)用于在高级别告警触发时自动静默低级别相关告警。经典场景:节点宕机触发NodeDown告警,同时会连带产生ServiceUnavailable、HighErrorRate等告警,只需通知NodeDown即可:

# alertmanager.yml - inhibit规则
inhibit_rules:
  - source_match:
      alertname: NodeDown
    target_match:
      alertname: HighErrorRate
    equal: ['instance']

  - source_match:
      alertname: DatabaseDown
    target_match_re:
      alertname: ConnectionPoolSaturation|SlowQuery
    equal: ['cluster']

静默(Silence)用于计划内维护窗口,避免发布、扩容期间触发大量预期中的告警:

# 通过API创建静默规则
curl -X POST http://alertmanager:9093/api/v1/silences -d '{
  "matchers": [
    {"name": "service", "value": "payment-api", "isRegex": false}
  ],
  "startsAt": "2026-07-23T10:00:00Z",
  "endsAt": "2026-07-23T12:00:00Z",
  "createdBy": "sre-team",
  "comment": "payment-api版本发布,预期告警静默"
}'

告警质量治理与持续优化

告警系统本身需要定期治理,否则会逐步退化。以下指标用于衡量告警质量:

# 告警质量指标
# 1. 告警确认率 = 已确认告警 / 总告警数(目标 > 90%)
# 2. 告警行动率 = 触发操作的告警 / 总告警数(目标 > 70%)
# 3. 告警噪音率 = 无需处理的告警 / 总告警数(目标 < 10%)
# 4. MTTA = 告警触发到首次响应的时间(P1目标 < 5分钟)

每季度做一次告警复盘:审查噪音率超过15%的规则,调整for持续时间或阈值;删除连续3个月未触发的规则;对频繁触发的P3告警考虑降级为日志输出。

告警规则测试:在CI流水线中加入promtool检查,确保规则语法正确;对关键规则使用PromQL单元测试验证边界值行为:

# promtool 单元测试
# tests.yml
rule_files:
  - golden_signals.yml
tests:
  - interval: 30s
    input_series:
      - series: http_requests_total{service="api",status="500"}
        values: "0 10 20 30 40 50 60 70 80 90 100"
      - series: http_requests_total{service="api",status="200"}
        values: "1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000"
    alert_rule_test:
      - eval_time: 5m
        alertname: HighErrorRate
        exp_alerts:
          - exp_labels:
              severity: critical
              service: api
            exp_annotations:
              summary: "服务 api 5xx错误率超过5%"

这套测试确保规则在预期数据下产生预期告警,防止修改规则后引入回归。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-gao-jing-gui-ze-she-ji-shi-zhan-cong-zhi-biao/

(0)
小编小编
上一篇 2026年7月23日
下一篇 2026年7月23日

相关推荐