2. Prometheus 告警体系回顾:架构、告警规则与 Alertmanager

在深入自愈 API 调用之前,必须牢固掌握 Prometheus 告警体系的完整链路。本章从架构总览、告警规则定义、Alertmanager 核心组件三个维度,为你建立告警触发自愈的底层认知。

2.1 Prometheus 告警架构总览

Prometheus 采用“拉取 + 推送”混合模型:Server 定期从 Exporter 拉取指标,由 Alerting Rule 评估是否触发告警;触发后的告警被推送到 Alertmanager,由其完成去重、分组、抑制、静默,最终路由到接收器(如自愈 API)。

Prometheus 告警架构总览 Prometheus 告警架构总览 Exporter Prometheus Server Alertmanager 自愈 API 告警规则 流程说明: ① Exporter 暴露指标 → Prometheus Server 拉取并存储 ② 告警规则持续评估指标 → 触发时生成 Alert 对象 ③ Alertmanager 接收告警 → 分组/抑制/静默 → 路由到自愈 API

2.2 告警规则:触发自愈的“触发器”

告警规则是自愈流程的起点。规则定义在 Prometheus Server 的配置文件中,通过 groups 组织,每条规则包含:告警名称、表达式、持续时间、标签和注解。

2.2.1 规则结构

groups:
  - name: self_healing_alerts
    rules:
      - alert: HighCpuUsage
        expr: (100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
        for: 2m
        labels:
          severity: critical
          team: sre
        annotations:
          summary: "Instance {{ $labels.instance }} CPU usage > 80%"
          description: "CPU usage at {{ $value }}% for over 2 minutes"

2.2.2 关键字段说明

字段 作用 自愈场景建议
alert 告警名称,唯一标识 建议与自愈动作名称对应
expr PromQL 表达式,决定触发条件 表达式应精确,避免误触发
for 持续时间,防止抖动 自愈场景建议 1-3 分钟
labels 附加标签,用于路由和分组 必须包含 severity 和 team
annotations 告警描述信息,传递给接收器 包含实例、当前值等上下文
自愈关键点: 在 annotations 中携带自愈所需的参数(如实例 IP、故障类型),自愈 API 可直接解析这些字段执行恢复动作。

2.3 Alertmanager:告警的“路由中枢”

Alertmanager 是告警体系的核心枢纽,负责接收 Prometheus Server 推送的告警,经过处理后将告警发送到正确的接收器(包括自愈 API)。

2.3.1 核心处理流程

  1. 接收:通过 API 接收来自 Prometheus Server 的告警。
  2. 分组:按 group_by 标签将相似告警合并,减少通知数量。
  3. 抑制:当高等级告警触发时,抑制相关的低等级告警。
  4. 静默:根据静默规则,在指定时间内不发送特定告警。
  5. 路由:根据 route 树匹配告警标签,分发到对应接收器。
Alertmanager 内部处理流程 Alertmanager 内部处理流程 接收告警 分组 抑制 静默 路由 自愈 API 路由匹配示例: route: receiver: 'self-healing-api' # 匹配 severity: critical 的告警 match: { severity: critical }

2.3.2 路由配置示例

route:
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - match:
        severity: critical
      receiver: 'self-healing-api'
      continue: true
    - match:
        severity: warning
      receiver: 'email-notifier'

receivers:
  - name: 'self-healing-api'
    webhook_configs:
      - url: 'http://self-healing-service:8080/api/v1/heal'
        send_resolved: true
注意: 自愈 API 接收器必须设置 send_resolved: true,以便在告警恢复时通知自愈系统执行回滚或确认操作。

2.4 告警生命周期与状态机

理解告警的状态转换,有助于设计自愈 API 的幂等性和重试逻辑。

状态 含义 自愈触发时机
Pending 表达式满足,但未达到 for 持续时间 不触发自愈,避免抖动
Firing 表达式持续满足,告警正式触发 立即调用自愈 API
Resolved 表达式不再满足,告警恢复 调用自愈 API 的恢复接口

2.5 本章小结