2. 告警源接入:Prometheus、Zabbix、ELK 等常见监控系统告警接入方式

告警路由平台的核心价值在于统一消费来自不同监控系统的告警事件。本章聚焦三种主流监控系统——Prometheus、Zabbix、ELK Stack——的告警接入方式,分析其数据格式、传输协议、适配器模式及常见坑点。

2.1 接入架构总览

告警路由平台通常采用 Webhook 接收器 + 消息队列 + 适配器层 的架构。各监控系统通过原生或自定义 Webhook 推送告警 JSON/XML 载荷,平台侧通过适配器将异构格式归一化为内部告警模型(Alert Object)。

告警接入架构总览 告警接入架构总览 Prometheus Zabbix ELK Stack Webhook 接收器 /api/v1/alert /api/v2/event /webhook/elk 消息队列 (Kafka / RabbitMQ) 适配器层 Prometheus Adapter Zabbix Adapter ELK Adapter ↓ 归一化 内部告警模型 说明:各监控系统通过独立 Webhook 端点推送告警,适配器层负责格式归一化,解耦告警源与路由策略。

2.2 Prometheus 告警接入

Prometheus 通过 Alertmanager 组件管理告警,支持多种接收器(Receiver),其中 Webhook 接收器是最通用的接入方式。

2.2.1 接入方式:Alertmanager Webhook

  1. 配置 Alertmanager:在 alertmanager.yml 中定义 Webhook 接收器。
  2. 推送格式:Alertmanager 发送 HTTP POST 请求,Body 为 JSON 数组,每个元素包含 status、labels、annotations、startsAt、endsAt 等字段。
  3. 路由平台侧:接收端点解析 JSON,提取告警名称、严重级别、标签、时间戳,映射到内部模型。
关键配置示例:
# alertmanager.yml 片段
receivers:
- name: 'route-platform'
  webhook_configs:
  - url: 'http://alert-router:8080/api/v1/alert'
    send_resolved: true
    http_config:
      basic_auth:
        username: 'webhook_user'
        password: 'webhook_pass'

2.2.2 告警载荷结构

字段 类型 说明
status string firing / resolved
labels.alertname string 告警规则名称
labels.severity string critical / warning / info
annotations.summary string 告警摘要
annotations.description string 详细描述
startsAt RFC3339 告警开始时间
generatorURL string Prometheus 表达式链接
最佳实践: 在 Alertmanager 中启用 send_resolved: true,使路由平台能感知告警恢复事件,实现自动关闭和降噪。

2.3 Zabbix 告警接入

Zabbix 提供 Action + Media Type 机制发送告警。推荐使用 Webhook Media Type(Zabbix 5.0+ 原生支持)或 自定义脚本 方式接入。

2.3.1 接入方式:Webhook Media Type

  1. 创建 Media Type:在 Zabbix 前端 Administration → Media types → Create media type,选择 Type = Webhook。
  2. 配置参数:设置 URL、HTTP 方法(POST)、Content-Type(application/json)、超时时间。
  3. 定义告警模板:使用 {ALERT.SUBJECT}、{ALERT.MESSAGE}、{EVENT.DATE} 等宏变量构建 JSON Body。
  4. 关联 Action:在 Action 配置中指定该 Media Type 作为告警通道。
注意: Zabbix 默认告警 JSON 格式与 Prometheus 差异较大,适配器需处理字段映射,特别是 triggerid、eventid、severity(数字等级 0-5)的转换。

2.3.2 字段映射对照

Zabbix 字段 内部模型字段 说明
eventid alert_id 唯一事件 ID
triggerid rule_id 触发器 ID
severity (0-5) severity (string) 0=未分类, 1=信息, 2=警告, 3=一般严重, 4=严重, 5=灾难
clock started_at Unix 时间戳
hosts[0].host source_host 主机名
description message 告警描述

2.4 ELK Stack 告警接入

ELK Stack(Elasticsearch + Logstash + Kibana)通常通过 Watcher(Elasticsearch 付费特性)或 ElastAlert(开源)生成告警。接入方式以 Webhook 输出为主。

2.4.1 接入方式:ElastAlert Webhook

  1. 配置 ElastAlert:在 config.yaml 中设置 alert: "webhook"。
  2. 定义规则:编写规则文件(如 frequency.yaml),指定查询频率、时间窗口、聚合条件。
  3. 推送格式:ElastAlert 发送 JSON 数组,包含 @timestamp、alert_type、rule_name、match(匹配的日志条目)等字段。
ElastAlert Webhook 配置示例:
# config.yaml 片段
alerts:
- "webhook"
webhook_url: "http://alert-router:8080/webhook/elastalert"
webhook_max_results: 10

# frequency.yaml 规则文件
name: "高频错误检测"
type: frequency
index: "nginx-logs-*"
num_events: 5
timeframe:
  minutes: 1
filter:
- query:
    query_string:
      query: "status: 5*"
alert: "webhook"

2.4.2 适配器处理要点

  • 时间戳归一化:ELK 使用 @timestamp,需转换为内部统一格式(RFC3339)。
  • 匹配数据裁剪:match 字段可能包含大量日志原文,适配器应只保留关键字段(如 message、host、status),避免消息体膨胀。
  • 去重逻辑:ElastAlert 可能因时间窗口重叠推送重复告警,路由平台需基于 rule_name + match._id 做幂等处理。

2.5 接入方式对比

维度 Prometheus Zabbix ELK Stack
推送方式 Alertmanager Webhook Webhook Media Type / 脚本 ElastAlert Webhook / Watcher
数据格式 JSON(标准 Alertmanager 结构) JSON(宏变量模板) JSON(ElastAlert 自定义结构)
认证方式 Basic Auth / Bearer / 无认证 Basic Auth / 无认证
告警恢复 send_resolved 字段 PROBLEM / OK 事件类型 需规则内判断
适配器复杂度 低(字段规范) 中(需映射数字等级) 中高(需裁剪匹配数据)

2.6 接入避坑指南

常见问题与解决方案:
  • 重复告警:监控系统重试机制导致同一告警多次推送。解决方案:路由平台基于 alert_id / eventid 做幂等去重。
  • 时间戳时区:Zabbix 使用本地时间,Prometheus 使用 UTC。解决方案:适配器统一转换为 UTC 存储。
  • 消息体过大:ELK 的 match 字段可能包含完整日志。解决方案:适配器限制单条告警载荷不超过 1MB,超长内容截断或引用外部存储。
  • 认证失败:Webhook 端点未配置认证导致告警丢失。解决方案:所有接入端点强制启用 Basic Auth 或 校验。
三种监控系统接入流程对比 三种监控系统接入流程对比 Prometheus → Alertmanager Webhook POST → 路由平台 Zabbix Server → Action Webhook Media Type → 路由平台 Elasticsearch → ElastAlert Webhook POST → 路由平台 适配器归一化 → 内部告警模型 → 路由决策

2.7 小结

告警源接入是路由平台的第一道关卡。Prometheus 的 Alertmanager Webhook 最为规范,适配成本最低;Zabbix 需处理数字等级与宏变量模板,适配器需做字段映射;ELK Stack 的 ElastAlert 灵活但需注意消息体裁剪与去重。无论哪种接入方式,统一认证、幂等去重、时间戳归一化是平台工程的基础要求。