4. 告警源接入:Prometheus Alertmanager、Zabbix、云监控与机器人Webhook对接

告警源接入是值班机器人自动化体系的“神经末梢”。只有将Prometheus Alertmanager、Zabbix、云监控等主流告警源与机器人Webhook正确对接,才能实现告警事件的实时采集、标准化解析与后续的故障隔离联动。本章将逐一拆解三种典型告警源的对接配置、Payload结构及常见避坑点。

4.1 告警源接入架构总览

所有告警源均通过出站Webhook将告警JSON推送至机器人网关。机器人网关负责鉴权、去重、格式化,并将标准化事件写入内部事件总线。下图展示了多源统一接入的逻辑架构:

多告警源统一接入架构 多告警源统一接入架构 Prometheus Alertmanager Zabbix Action / Media 云监控 阿里云/腾讯云/AWS 机器人 Webhook 网关 鉴权 / 限流 / 格式标准化 / 去重 内部事件总线 (Kafka / Redis Stream)
设计要点:所有告警源统一使用出站Webhook推送,避免轮询带来的延迟和资源浪费。网关层承担协议适配与格式归一化,下游Runbook引擎无需关心告警源类型。

4.2 Prometheus Alertmanager 对接

Prometheus Alertmanager 通过 webhook_config 将告警直接 POST 到机器人网关。配置路径为 Alertmanager 的 alertmanager.yml。

4.2.1 配置示例

receivers:
  - name: 'robot-webhook'
    webhook_configs:
      - url: 'http://robot-gateway:8080/webhook/prometheus'
        send_resolved: true
        http_config:
          basic_auth:
            username: 'alertmanager'
            password: 'your-secret-'
        max_alerts: 50

4.2.2 Payload 结构解析

Alertmanager 推送的 JSON 包含 receiver、status、alerts 数组等字段。机器人需提取以下关键字段:

字段路径说明示例值
status告警状态:firing / resolved"firing"
alerts[].labels.alertname告警规则名称"HighCpuUsage"
alerts[].labels.severity严重级别"critical"
alerts[].annotations.summary告警摘要"CPU > 90%"
alerts[].startsAt触发时间 (RFC3339)"2025-03-01T10:00:00Z"

4.2.3 对接验证

# 模拟 Alertmanager 推送(使用 curl)
curl -X POST http://robot-gateway:8080/webhook/prometheus \
  -H "Content-Type: application/json" \
  -d '{
    "receiver":"robot-webhook",
    "status":"firing",
    "alerts":[
      {
        "labels":{"alertname":"HighCpuUsage","severity":"critical","instance":"web-01"},
        "annotations":{"summary":"CPU usage > 90% on web-01"},
        "startsAt":"2025-03-01T10:00:00Z"
      }
    ]
  }'
常见问题:Alertmanager 默认不发送 resolved 告警,需显式设置 send_resolved: true。另外,max_alerts 建议设为 50~100,避免单次推送过大导致网关超时。

4.3 Zabbix 对接

Zabbix 通过 Action 中的 Media type 发送告警。推荐使用 Webhook media type(Zabbix 5.0+ 原生支持),或使用自定义脚本。

4.3.1 创建 Webhook Media Type

  1. 登录 Zabbix 前端,进入 Administration → Media types → Create media type。
  2. Type 选择 Webhook,Name 填写 "Robot Gateway"。
  3. Parameters 中定义脚本参数,例如:URL = http://robot-gateway:8080/webhook/zabbix。
  4. Script 填入以下 JavaScript 处理逻辑:
var params = JSON.parse(value);
var request = new HttpRequest();
request.addHeader('Content-Type: application/json');
var payload = {
  event_id: params.eventid,
  severity: params.severity,
  host: params.host.name,
  trigger_name: params.trigger.name,
  status: params.status,
  timestamp: params.clock
};
request.post(params.URL, JSON.stringify(payload));

4.3.2 配置 Action 使用该 Media Type

# 在 Action 的 Operations 标签页中:
- Default operation step duration: 0
- Operations:
  - Send to users: {User group: SRE}
  - Send only to: Robot Gateway
- Recovery operations:
  - Send to users: {User group: SRE}
  - Send only to: Robot Gateway

4.3.3 字段映射表

Zabbix 宏机器人字段说明
{EVENT.ID}event_id事件唯一ID
{TRIGGER.SEVERITY}severity0~5 数字严重度
{HOST.NAME}host主机名
{TRIGGER.NAME}trigger_name触发器名称
{EVENT.STATUS}statusPROBLEM / OK
最佳实践:Zabbix 的 Webhook media type 支持 JavaScript 脚本,建议在脚本内做简单的字段重命名和类型转换,减少网关处理压力。务必在脚本中处理 HttpRequest 异常,避免告警丢失。

4.4 云监控对接

主流云厂商(阿里云、腾讯云、AWS)均支持通过 Webhook 或 函数计算 推送告警。本节以阿里云和AWS为例说明。

4.4.1 阿里云云监控

阿里云通过 报警联系人 中的 Webhook 回调地址推送。配置路径:云监控 → 报警联系人 → 新建联系人 → 选择Webhook。

# 阿里云推送的 Payload 示例(简化)
{
  "alertName": "CPU使用率过高",
  "alertState": "ALARM",
  "curValue": "95.0",
  "dimensions": "instanceId:i-xxxxx",
  "expression": "Average(CpuUtilization) > 90",
  "metricName": "CpuUtilization",
  "namespace": "acs_ecs",
  "timestamp": 1710000000000
}

4.4.2 AWS CloudWatch

AWS 通过 SNS Topic 订阅 Lambda 或 HTTP endpoint 转发告警。推荐使用 SNS → HTTP(S) subscription 直接推送。

# AWS SNS 推送的 Payload 示例(简化)
{
  "Type": "Notification",
  "MessageId": "xxxx",
  "TopicArn": "arn:aws:sns:region:account:topic",
  "Message": "{\"AlarmName\":\"HighCPU\",\"NewStateValue\":\"ALARM\",\"OldStateValue\":\"OK\",\"StateChangeTime\":\"2025-03-01T10:00:00.000+0000\",\"Trigger\":{\"MetricName\":\"CPUUtilization\",\"Namespace\":\"AWS/EC2\",\"Statistic\":\"Average\",\"Threshold\":90.0}}"
}

4.4.3 云监控字段归一化对照

语义阿里云字段AWS SNS 字段机器人标准字段
告警名称alertNameAlarmNamealert_name
状态alertStateNewStateValuestatus
触发值curValue—current_value
资源IDdimensions—resource_id
时间戳timestampStateChangeTimetimestamp
归一化策略:在机器人网关层维护一个 源类型 → 标准字段 的映射表,通过 source_type 路由解析逻辑。这样下游Runbook和值班通知模块无需感知告警源差异。

4.5 机器人Webhook网关通用设计

无论对接哪种告警源,机器人Webhook网关都应具备以下通用能力:

  • 鉴权:通过 Header 中的 或 Basic Auth 验证告警源身份。
  • 限流:基于令牌桶算法,防止告警风暴冲垮网关。
  • 格式标准化:将不同源的 Payload 转换为统一的内部事件格式。
  • 去重:基于 source + event_id 做幂等处理,避免重复触发Runbook。
  • 健康检查:暴露 /health 端点供告警源探测。
Webhook网关内部处理流程 Webhook网关内部处理流水线 ① 鉴权 ② 限流 ③ 格式标准化 ④ 去重 标准化事件 → 事件总线 失败步骤记录日志并返回 4xx/5xx 给告警源 告警源侧应配置重试策略(指数退避)

4.6 对接清单与验证要点

告警源对接方式关键配置项验证方法
Prometheus Alertmanagerwebhook_configurl, send_resolved, basic_authcurl 模拟推送,检查网关日志
ZabbixWebhook Media TypeScript 参数、Action 绑定手动触发告警,查看机器人接收
阿里云云监控报警联系人 Webhook回调地址、报警规则创建测试报警,观察回调日志
AWS CloudWatchSNS → HTTP(S)Subscription、Lambda 转发发布测试消息,检查 endpoint
安全提醒:所有 Webhook 端点必须使用 HTTPS 并配置 或 Basic Auth。避免将网关地址暴露在公网,建议通过内网或 VPN 传输告警数据。定期轮换鉴权凭证。

完成告警源对接后,机器人即可实时接收来自 Prometheus、Zabbix、云监控的标准化告警事件。下一阶段将基于这些事件触发故障隔离与Runbook联动逻辑。