2. 告警源接入:常见监控系统告警接入方式与 Webhook 配置

好,咱们进入正题。

告警源接入,说白了就是让我们的自动化运维平台,能听懂各个监控系统在说什么。你想想看,公司里可能同时跑着 Prometheus、Zabbix、Nagios,每个系统都有自己的告警格式和触发方式。如果平台不能统一接入,那运维同学就得盯着好几个屏幕,效率太低了。

我个人习惯,先把所有告警源抽象成「事件生产者」。不管底层是什么系统,最终都通过 Webhook 把告警事件推送到平台。这样平台只需要维护一套接收接口,维护成本最低。

核心原则: 平台不主动轮询监控系统,而是由监控系统主动推送告警。这是现代运维平台的通用做法。

2.1 Prometheus 告警接入

Prometheus 本身只负责采集和存储指标,告警逻辑在 Alertmanager 里实现。所以我们要接 Prometheus 的告警,其实就是配置 Alertmanager 的 Webhook。

配置步骤:

  1. 在 Alertmanager 的配置文件 alertmanager.yml 中,添加一个 Webhook receiver。
  2. 定义路由规则,把特定告警发送到这个 receiver。
  3. 平台侧提供一个 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"
  }
]
小技巧: Alertmanager 支持多个 Webhook 同时发送。你可以把告警同时发给平台和钉钉/企微,互不干扰。

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}"
}
注意: Zabbix 的宏变量在不同版本中可能有差异。比如 6.0 版本之后,{TRIGGER.SEVERITY} 返回的是数字而不是字符串。建议先在测试环境验证一下。

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
}
避坑指南: 我曾经遇到一个问题——Nagios 的告警频率太高,平台接口被打爆了。后来我在 Nagios 端加了 notification_interval 限制,比如 30 分钟才重复通知一次。这个参数一定要配,不然你会后悔的。

2.4 Webhook 配置通用要点

不管接哪个监控系统,Webhook 配置都有一些共性问题。我总结了几点:

  • 认证机制: 建议用 Token 或 Basic Auth,防止恶意调用。平台端做白名单校验。
  • 重试机制: 监控系统一般都有重试策略。比如 Alertmanager 默认重试 3 次,间隔 5 秒。平台端要做好幂等处理。
  • 数据格式统一: 平台内部定义一个标准告警模型,各个监控系统的数据进来后做一次转换。这样后续的处理逻辑就不用关心底层来源了。
  • 健康检查: 平台提供一个 /health 接口,监控系统可以定期探测 Webhook 是否可用。

下面这张图展示了整体的接入架构:

监控系统层 Prometheus Zabbix Nagios 其他系统 Webhook 接入层 统一接收接口 认证与鉴权 数据格式转换 去重与幂等 健康检查 自动化运维平台 告警处理引擎 通知分发 工单系统 自动化修复

说白了,Webhook 就是监控系统和平台之间的「翻译官」。你只要把翻译规则配好了,后面的事情就顺了。

总结一下: Prometheus 最省心,原生支持 Webhook;Zabbix 需要配媒体类型或脚本;Nagios 最传统,用命令管道。但不管哪种方式,最终目标都是让告警数据流到平台里,统一处理。

嗯,以上就是告警源接入的核心内容。你在实际配置时,记得先在小范围验证,确认数据格式和接口响应都没问题,再全量上线。我曾经吃过这个亏,一上来就全量推,结果平台接口挂了,告警全丢了……


公众号:蓝海资料掘金营,微信deep3321