Prometheus告警规则编写与Alertmanager多渠道通知路由配置实战

Prometheus告警规则结构与PromQL表达式编写

Prometheus告警体系由两部分构成:Prometheus Server负责规则评估和告警触发,Alertmanager负责告警去重、分组、路由和通知分发。监控告警体系的核心价值不在于收集数据,而在于在故障发生时准确、及时地通知到正确的人。

Prometheus告警规则定义在rules文件中,每条规则包含告警名称、表达式、持续时间、标签和注解。一个完整的告警规则示例如下:

groups:
- name: node_alerts
  rules:
  - alert: HighCPUUsage
    expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
    for: 5m
    labels:
      severity: warning
      team: ops
    annotations:
      summary: "CPU使用率过高 {{ $labels.instance }}"
      description: "实例 {{ $labels.instance }} 的CPU使用率已超过85%持续5分钟,当前值: {{ $value }}%"

  - alert: HighMemoryUsage
    expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
    for: 3m
    labels:
      severity: critical
      team: ops
    annotations:
      summary: "内存使用率过高 {{ $labels.instance }}"
      description: "实例 {{ $labels.instance }} 内存使用率超过90%,当前值: {{ $value }}%"

  - alert: DiskSpaceLow
    expr: (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 > 85
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "磁盘空间不足 {{ $labels.instance }} {{ $labels.mountpoint }}"
      description: "挂载点 {{ $labels.mountpoint }} 使用率超过85%,当前值: {{ $value }}%"

expr字段使用PromQL表达式定义触发条件。rate()函数计算5分钟内的平均速率,for字段指定告警触发前需持续满足条件的时间。for: 5m表示连续5分钟满足条件才触发告警,避免瞬时波动造成误报。labels中的severity字段用于后续Alertmanager路由决策。

Alertmanager路由配置与通知分发机制

Alertmanager接收Prometheus发送的告警后,根据路由规则(route)将告警分发到不同的接收器(receiver)。路由配置是Alertmanager的核心,通过标签匹配实现精细化的告警分发。以下是一个覆盖多渠道通知的配置示例:

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager@example.com'
  smtp_auth_password: 'password'

route:
  group_by: ['alertname', 'cluster', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
  # critical级别告警发送到企业微信+邮件
  - matchers:
    - severity="critical"
    receiver: 'wechat-critical'
    group_wait: 10s
    repeat_interval: 1h
    continue: true
  # warning级别告警只发邮件
  - matchers:
    - severity="warning"
    receiver: 'email-warning'
    repeat_interval: 3h
  # 按团队路由
  - matchers:
    - team="db"
    receiver: 'dba-team'
  - matchers:
    - team="frontend"
    receiver: 'frontend-team'

receivers:
- name: 'default'
  email_configs:
  - to: 'ops-team@example.com'

- name: 'wechat-critical'
  webhook_configs:
  - url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx'
    send_resolved: true
  email_configs:
  - to: 'oncall@example.com'

- name: 'email-warning'
  email_configs:
  - to: 'ops-team@example.com'

- name: 'dba-team'
  webhook_configs:
  - url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=db-key'

inhibit_rules:
- source_matchers:
  - severity="critical"
  target_matchers:
  - severity="warning"
  equal: ['instance', 'alertname']

group_by控制告警分组维度,同一组告警合并为一条通知发送,避免告警风暴。group_wait是首次发送前的等待时间,收集同组告警。group_interval是同组新告警的发送间隔。repeat_interval是重复发送未解决告警的间隔。continue: true表示匹配后继续匹配后续路由,实现多渠道同时通知。

inhibit_rules定义告警抑制规则——当critical告警触发时,自动抑制同实例的warning级别告警。例如某节点宕机触发critical告警后,该节点上的CPU过高、磁盘空间不足等warning告警会被自动抑制,避免告警轰炸。

告警规则测试与验证方法

编写告警规则后需要验证表达式是否正确、触发条件是否合理。Prometheus提供了promtool工具用于规则验证:

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

# 测试规则文件
promtool test rules test_rules.yml

test_rules.yml是一个测试用例文件,定义输入数据和期望结果:

rule_files:
- alert_rules.yml

evaluation_interval: 1m

tests:
- interval: 1m
  input_series:
  - series: 'node_cpu_seconds_total{instance="10.0.0.1", mode="idle"}'
    values: '0+100x10'
  - series: 'node_memory_MemAvailable_bytes{instance="10.0.0.1"}'
    values: '1000000000x10'
  - series: 'node_memory_MemTotal_bytes{instance="10.0.0.1"}'
    values: '16000000000x10'
  
  alert_rule_test:
  - eval_time: 6m
    alertname: HighCPUUsage
    exp_alerts:
    - exp_labels:
        severity: warning
        instance: "10.0.0.1"
      exp_annotations:
        summary: "CPU使用率过高 10.0.0.1"

这种方式可以在不部署Prometheus的情况下离线验证告警规则的正确性,特别适合CI/CD流水线中集成规则测试。

生产环境告警优化实践

告警过多导致”狼来了”效应是运维团队的常见痛点。优化策略包括:合理设置for持续时间过滤瞬时抖动、使用动态阈值替代静态阈值、配置告警抑制减少衍生告警。动态阈值可以通过记录规则(recording rules)实现,先计算历史基线再与当前值比较:

# 记录规则:计算7天前同时段的平均CPU使用率
groups:
- name: baseline_rules
  rules:
  - record: cpu:usage:avg_7d
    expr: avg_over_time((100 - (rate(node_cpu_seconds_total{mode="idle"}[5m]) * 100))[7d:1h])
  
  # 告警规则:当前值超过基线2倍时触发
  - alert: AnomalyCpuUsage
    expr: (100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > (cpu:usage:avg_7d * 2)
    for: 10m
    labels:
      severity: warning

告警发送渠道的选择也需要分层:critical级别通过即时通讯工具(企业微信、钉钉、飞书)加电话告警,warning级别通过邮件或工单系统,info级别仅记录到日志不主动通知。repeat_interval根据严重程度递减——critical每1小时重复、warning每3小时、info不重复。这种分层策略在保证关键告警及时送达的同时,有效降低告警疲劳。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-gao-jing-gui-ze-bian-xie-yu-alertmanager-duo-qu/

(0)
小编小编
上一篇 11小时前
下一篇 11小时前

相关推荐