4. 告警源接入:Prometheus Alertmanager、Zabbix、云监控与机器人Webhook对接
告警源接入是值班机器人自动化体系的“神经末梢”。只有将Prometheus Alertmanager、Zabbix、云监控等主流告警源与机器人Webhook正确对接,才能实现告警事件的实时采集、标准化解析与后续的故障隔离联动。本章将逐一拆解三种典型告警源的对接配置、Payload结构及常见避坑点。
4.1 告警源接入架构总览
所有告警源均通过出站Webhook将告警JSON推送至机器人网关。机器人网关负责鉴权、去重、格式化,并将标准化事件写入内部事件总线。下图展示了多源统一接入的逻辑架构:
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"
}
]
}'
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
- 登录 Zabbix 前端,进入 Administration → Media types → Create media type。
- Type 选择 Webhook,Name 填写 "Robot Gateway"。
- Parameters 中定义脚本参数,例如:
URL=http://robot-gateway:8080/webhook/zabbix。 - 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} | severity | 0~5 数字严重度 |
{HOST.NAME} | host | 主机名 |
{TRIGGER.NAME} | trigger_name | 触发器名称 |
{EVENT.STATUS} | status | PROBLEM / OK |
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 字段 | 机器人标准字段 |
|---|---|---|---|
| 告警名称 | alertName | AlarmName | alert_name |
| 状态 | alertState | NewStateValue | status |
| 触发值 | curValue | — | current_value |
| 资源ID | dimensions | — | resource_id |
| 时间戳 | timestamp | StateChangeTime | timestamp |
source_type 路由解析逻辑。这样下游Runbook和值班通知模块无需感知告警源差异。
4.5 机器人Webhook网关通用设计
无论对接哪种告警源,机器人Webhook网关都应具备以下通用能力:
- 鉴权:通过 Header 中的 或 Basic Auth 验证告警源身份。
- 限流:基于令牌桶算法,防止告警风暴冲垮网关。
- 格式标准化:将不同源的 Payload 转换为统一的内部事件格式。
- 去重:基于
source + event_id做幂等处理,避免重复触发Runbook。 - 健康检查:暴露
/health端点供告警源探测。
4.6 对接清单与验证要点
| 告警源 | 对接方式 | 关键配置项 | 验证方法 |
|---|---|---|---|
| Prometheus Alertmanager | webhook_config | url, send_resolved, basic_auth | curl 模拟推送,检查网关日志 |
| Zabbix | Webhook Media Type | Script 参数、Action 绑定 | 手动触发告警,查看机器人接收 |
| 阿里云云监控 | 报警联系人 Webhook | 回调地址、报警规则 | 创建测试报警,观察回调日志 |
| AWS CloudWatch | SNS → HTTP(S) | Subscription、Lambda 转发 | 发布测试消息,检查 endpoint |
完成告警源对接后,机器人即可实时接收来自 Prometheus、Zabbix、云监控的标准化告警事件。下一阶段将基于这些事件触发故障隔离与Runbook联动逻辑。