Prometheus Alertmanager 接入

工作原理

┌─────────────────────────────────────────────────────────────────────┐
│                        Prometheus Stack                              │
│                                                                      │
│   Prometheus ──scrape──→ Targets ( exporters, 应用, 基础设施 )        │
│        │                                                               │
│        └──评估规则──→ 触发告警 ──→ Alertmanager ──webhook──→ 灵王OPS  │
│                                         │                            │
│                                  (多个 receiver)                      │
└─────────────────────────────────────────────────────────────────────┘

Alertmanager 接收到 Prometheus 发来的告警后,通过 Webhook 转发给灵王 OPS。灵王 OPS 负责: - 告警去重、分组 - 按团队路由(通过 URL 中的 team_id) - 触发通知(邮件、钉钉、飞书等) - 告警历史与统计分析


前置条件

  • 已部署 Prometheus + Alertmanager
  • 可访问灵王 OPS 的 :8080 端口
  • 知道你的团队 ID(在团队页面 → 团队设置中查看)

Alertmanager 配置

最简配置

alertmanager.ymlreceivers 中添加灵王 OPS:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'lingwang'
  routes:
    - match:
        severity: critical
      receiver: 'lingwang'
      continue: true

receivers:
  - name: 'lingwang'
    webhook_configs:
      - url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/{team_id}'
        send_resolved: true
        max_alerts: 100

多团队路由(通过 label 路由)

如果你的 Prometheus 管理多个团队的告警,可以在告警规则中打标签,Alertmanager 按标签转发到不同团队:

# 告警规则中给不同团队的告警打标签
groups:
  - name: example
    rules:
      - alert: HighCPU
        expr: node_cpu_usage > 0.9
        labels:
          team_id: '团队A的ID'
          severity: critical
        annotations:
          summary: "CPU 使用率过高"

Alertmanager 配置:

route:
  group_by: ['alertname', 'team_id']
  routes:
    # 优先按 team_id 路由
    - match:
        team_id: '团队A的ID'
      receiver: 'lingwang-team-a'
    - match:
        team_id: '团队B的ID'
      receiver: 'lingwang-team-b'
    # 默认
    - receiver: 'lingwang-default'
      continue: true

receivers:
  - name: 'lingwang-team-a'
    webhook_configs:
      - url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/团队A的ID'
        send_resolved: true

  - name: 'lingwang-team-b'
    webhook_configs:
      - url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/团队B的ID'
        send_resolved: true

  - name: 'lingwang-default'
    webhook_configs:
      - url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/{默认团队ID}'
        send_resolved: true

配置示例:静默与抑制

route:
  # 收到 firing 告警后,等待 30s 再通知(等待告警稳定)
  group_wait: 30s
  # 同一组告警,变更后间隔 5m 再通知(避免告警风暴)
  group_interval: 5m
  # 告警解决 12h 后才停止通知(防止告警反复触发)
  repeat_interval: 12h
  # 告警抑制:运维期间静默所有相关告警
  routes:
    - match:
        maintenance: "true"
      receiver: 'silence'
    - match:
        severity: critical
      receiver: 'lingwang'
      continue: true
    - match:
        severity: warning
      receiver: 'lingwang-low'
      continue: true

告警规则中的 labels 与 annotations

建议在 Prometheus 告警规则中统一规范 labels 和 annotations:

Labels(用于路由和分组)

Label 说明 示例
alertname 告警名称 HighCPU
severity 严重程度 critical / warning / info
team_id 团队 ID(用于路由) 3fa2b38c-...
instance 监控目标实例 web-01:9100
job Prometheus job 名称 node_exporter

Annotations(用于展示和通知)

Annotation 说明 示例
summary 简短描述(用于通知标题) CPU 使用率超过 90%
description 详细描述(用于告警详情) 实例 web-01 的 CPU 使用率已达 {{ $value }}
runbook_url 应急手册链接 https://wiki.example.com/runbooks/high-cpu
dashboard_url Grafana 大盘链接 https://grafana.example.com/d/xxx

完整示例

groups:
  - name: node
    rules:
      - alert: HighMemory
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "内存使用率超过 85%"
          description: "节点 {{ $labels.instance }} 内存使用率为 {{ printf \"%.2f\" $value }}%"
          runbook_url: "https://wiki.example.com/runbooks/high-memory"
          dashboard_url: "https://grafana.example.com/d/node"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|fuse.lxcfs"} / node_filesystem_size_bytes) * 100 < 15
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "磁盘空间不足"
          description: "挂载点 {{ $labels.mountpoint }} 可用空间仅剩 {{ printf \"%.2f\" $value }}%"

验证接入

手动发送测试告警

# 获取团队 ID(替换为你的)
TEAM_ID="your-team-id"

curl -X POST "http://localhost:8080/api/v1/alerts/alertmanager/${TEAM_ID}" \
  -H "Content-Type: application/json" \
  -d '{
    "version": "4",
    "groupKey": "{}:{alertname=\"TestAlert\"}",
    "status": "firing",
    "receiver": "lingwang",
    "alerts": [
      {
        "status": "firing",
        "labels": {
          "alertname": "HighCPU",
          "severity": "critical",
          "instance": "server-01:9100"
        },
        "annotations": {
          "summary": "CPU 使用率超过 90%",
          "description": "服务器 server-01:9100 的 CPU 使用率当前为 95.3%"
        },
        "startsAt": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
      }
    ]
  }'

验证 resolved(告警恢复)

# 告警被解决时,Alertmanager 会发送 resolved 状态
curl -X POST "http://localhost:8080/api/v1/alerts/alertmanager/${TEAM_ID}" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "resolved",
    "alerts": [
      {
        "status": "resolved",
        "labels": {"alertname": "HighCPU"},
        "endsAt": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
      }
    ]
  }'

检查告警列表

登录管理后台 → 告警页面,确认测试告警出现。


性能与限制

项目 限制
单次请求最大告警数 100 条
请求超时 10s
建议 group_wait 30s(避免首次告警风暴)
建议 repeat_interval 12h(告警持续未解决时的重复通知间隔)

故障排查

告警未出现在平台

  1. 确认 Alertmanager 配置已重载:amtool check-config alertmanager.yml
  2. 确认 Webhook URL 可达:curl -v http://ops.sengyueplay.com:8080/health
  3. 查看 Alertmanager 日志:journalctl -u alertmanager -f
  4. 查看灵王 OPS 后端日志:tail -f /tmp/lingwang.log

告警重复通知

  • 调大 group_interval(建议 5m)
  • 确认 Prometheus 告警规则中 for 字段设置合理

告警分类/分组不符合预期

  • 检查 Prometheus 告警规则的 labels 配置
  • Alertmanager 按 group_by 字段分组,修改 group_by 列表

告警通知延迟

  • group_wait 越大,首次通知延迟越高(但能有效抑制告警风暴)
  • Prometheus → Alertmanager 的推送间隔由 evaluation_interval 决定(建议 15s)