2. 告警源接入:常见监控系统告警接入方式与 Webhook 配置
好,咱们进入正题。
告警源接入,说白了就是让我们的自动化运维平台,能听懂各个监控系统在说什么。你想想看,公司里可能同时跑着 Prometheus、Zabbix、Nagios,每个系统都有自己的告警格式和触发方式。如果平台不能统一接入,那运维同学就得盯着好几个屏幕,效率太低了。
我个人习惯,先把所有告警源抽象成「事件生产者」。不管底层是什么系统,最终都通过 Webhook 把告警事件推送到平台。这样平台只需要维护一套接收接口,维护成本最低。
2.1 Prometheus 告警接入
Prometheus 本身只负责采集和存储指标,告警逻辑在 Alertmanager 里实现。所以我们要接 Prometheus 的告警,其实就是配置 Alertmanager 的 Webhook。
配置步骤:
- 在 Alertmanager 的配置文件
alertmanager.yml中,添加一个 Webhook receiver。 - 定义路由规则,把特定告警发送到这个 receiver。
- 平台侧提供一个 HTTP POST 接口,接收 Alertmanager 推送的 JSON 数据。
来看一个典型的配置片段:
# alertmanager.yml
receivers:
- name: 'auto-platform-webhook'
webhook_configs:
- url: 'http://your-platform:8080/api/v1/alerts/prometheus'
send_resolved: true
http_config:
basic_auth:
username: 'admin'
password: 'your-password'
route:
receiver: 'auto-platform-webhook'
group_by: ['alertname', 'cluster']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
这里有个细节要注意:send_resolved: true 这个参数。我曾经在一个项目里没配这个,结果告警恢复了平台也不知道,工单一直挂着。嗯,后来被业务方投诉了。所以建议你默认就打开。
平台接收的数据格式大概是这样的:
[
{
"status": "firing",
"labels": {
"alertname": "HighCPUUsage",
"instance": "192.168.1.100:9090",
"severity": "critical"
},
"annotations": {
"summary": "CPU usage above 90%",
"description": "Instance 192.168.1.100 CPU usage is 95%"
},
"startsAt": "2024-01-15T10:00:00Z",
"endsAt": "0001-01-01T00:00:00Z"
}
]
2.2 Zabbix 告警接入
Zabbix 的接入方式稍微传统一些。它不像 Prometheus 那样原生支持 Webhook,但我们可以通过「动作(Action)」+「脚本(Script)」的方式实现。
两种主流方式:
- 方式一:自定义脚本 —— 在 Zabbix Server 上写一个 Python/Shell 脚本,通过 curl 调用平台接口。
- 方式二:Webhook 媒体类型 —— Zabbix 5.0 之后支持了 Webhook 媒体类型,配置更简单。
我个人更推荐方式二,毕竟不用维护额外的脚本。配置路径是:管理 → 报警媒介类型 → 创建媒体类型,类型选择 Webhook。
关键参数如下:
| 参数 | 说明 | 示例值 |
|---|---|---|
| 名称 | 媒体类型名称 | AutoPlatform Webhook |
| 类型 | 选择 Webhook | Webhook |
| URL | 平台接收地址 | http://platform:8080/api/v1/alerts/zabbix |
| 请求方法 | POST | POST |
| 请求内容类型 | application/json | application/json |
| 模板 | 自定义 JSON 模板 | 见下方代码 |
模板示例:
{
"event_id": "{EVENT.ID}",
"host": "{HOST.NAME}",
"ip": "{HOST.IP}",
"trigger_name": "{TRIGGER.NAME}",
"severity": "{TRIGGER.SEVERITY}",
"status": "{EVENT.STATUS}",
"time": "{EVENT.DATE} {EVENT.TIME}",
"message": "{TRIGGER.STATUS}: {TRIGGER.NAME}"
}
2.3 Nagios 告警接入
Nagios 算是老前辈了。它的告警接入方式比较「硬核」——通过命令管道(command pipe)或者 NSCA 被动检查。
我建议用最简单的方式:在 Nagios 的 commands.cfg 里定义一个通知命令,直接调用 curl 发送告警到平台。
# commands.cfg
define command {
command_name notify-platform
command_line /usr/bin/curl -X POST -H "Content-Type: application/json" \
-d '{
"host": "$HOSTNAME$",
"service": "$SERVICEDESC$",
"state": "$SERVICESTATE$",
"output": "$SERVICEOUTPUT$",
"time": "$LONGDATETIME$"
}' \
http://platform:8080/api/v1/alerts/nagios
}
然后在联系人配置里引用这个命令:
define contact {
contact_name platform-user
service_notification_commands notify-platform
host_notification_commands notify-platform
service_notification_options w,u,c,r
host_notification_options d,u,r
}
notification_interval 限制,比如 30 分钟才重复通知一次。这个参数一定要配,不然你会后悔的。
2.4 Webhook 配置通用要点
不管接哪个监控系统,Webhook 配置都有一些共性问题。我总结了几点:
- 认证机制: 建议用 Token 或 Basic Auth,防止恶意调用。平台端做白名单校验。
- 重试机制: 监控系统一般都有重试策略。比如 Alertmanager 默认重试 3 次,间隔 5 秒。平台端要做好幂等处理。
- 数据格式统一: 平台内部定义一个标准告警模型,各个监控系统的数据进来后做一次转换。这样后续的处理逻辑就不用关心底层来源了。
- 健康检查: 平台提供一个 /health 接口,监控系统可以定期探测 Webhook 是否可用。
下面这张图展示了整体的接入架构:
说白了,Webhook 就是监控系统和平台之间的「翻译官」。你只要把翻译规则配好了,后面的事情就顺了。
嗯,以上就是告警源接入的核心内容。你在实际配置时,记得先在小范围验证,确认数据格式和接口响应都没问题,再全量上线。我曾经吃过这个亏,一上来就全量推,结果平台接口挂了,告警全丢了……
公众号:蓝海资料掘金营,微信deep3321