告警路由基础概念:告警源、告警事件、路由规则、目标端点

告警路由是变更窗口自动化运维体系中的核心枢纽。它负责将来自不同监控系统的告警信息,按照预定义的策略,准确、及时地送达对应的处理人员或自动化系统。理解告警路由的四个基础构成要素——告警源、告警事件、路由规则和目标端点——是构建可靠告警体系的第一步。

2.1 告警源(Alert Source)

告警源是告警信息的产生者。在变更窗口场景下,告警源通常覆盖基础设施、应用层和业务层。常见的告警源类型包括:

告警源类型 典型系统/工具 产生告警示例
基础设施监控 Prometheus + Alertmanager、Zabbix、Nagios CPU 使用率 > 90%、磁盘空间不足、节点宕机
日志与链路追踪 ELK Stack、Grafana Loki、Jaeger 错误日志频率激增、P99 延迟超过阈值
云平台事件 AWS CloudWatch、Azure Monitor、阿里云 CMS ECS 实例重启、RDS 连接数打满
自定义应用探针 自研 Agent、Spring Boot Actuator 订单接口返回 5xx 比例 > 1%
变更编排系统 Spinnaker、ArgoCD、自研变更平台 发布批次回滚、金丝雀健康检查失败
实践建议:在接入告警源时,建议为每个告警源分配唯一的 source_id 标签。这有助于在路由规则中精确匹配来源,避免因告警源名称变更导致路由失效。

2.2 告警事件(Alert Event)

告警事件是告警源发出的结构化数据载体。一个标准的告警事件通常包含以下核心字段,这些字段是路由规则进行匹配和决策的依据:

  • alert_id:全局唯一标识,用于去重和追踪。
  • source_id:告警源标识,指明事件来自哪个系统。
  • severity:严重级别,如 critical、warning、info。
  • status:事件状态,如 firing(触发)、resolved(恢复)。
  • title:告警标题,简明描述问题。
  • description:详细描述,包含上下文信息。
  • labels:标签集合,用于分类和路由,如 env=production、service=payment。
  • annotations:注解信息,通常包含 runbook 链接、值班人员等。
  • timestamp:事件发生时间戳。
// 标准告警事件 JSON 示例
{
  "alert_id": "alert-20250321-001",
  "source_id": "prometheus-prod",
  "severity": "critical",
  "status": "firing",
  "title": "生产环境支付服务 P99 延迟 > 5s",
  "description": "支付服务实例 10.0.1.25:8080 在最近 5 分钟内 P99 延迟达到 5.2s,超过阈值 3s。",
  "labels": {
    "env": "production",
    "service": "payment",
    "region": "us-east-1"
  },
  "annotations": {
    "runbook_url": "https://runbook.internal/payment-latency",
    "oncall": "sre-team-1"
  },
  "timestamp": "2025-03-21T14:30:00Z"
}

2.3 路由规则(Routing Rule)

路由规则是告警路由引擎的核心逻辑。它定义了一组条件表达式,当告警事件满足条件时,将被转发到指定的目标端点。规则通常采用“条件 + 动作”的模式:

  • 条件(Condition):基于告警事件字段进行匹配,支持精确匹配、正则匹配、数值比较、标签存在性检查等。
  • 动作(Action):指定一个或多个目标端点,以及可选的告警聚合、静默、降噪策略。
规则示例 条件 动作(目标端点) 适用场景
生产环境 Critical 告警 labels.env == "production" && severity == "critical" PagerDuty Webhook + 短信网关 需要立即响应,电话或短信通知值班 SRE
非核心服务 Warning 告警 severity == "warning" && labels.tier != "core" 企业微信机器人 Webhook 仅在工作群内通知,无需立即处理
变更窗口期间告警 labels.change_window == "true" 变更协调系统 Webhook + 邮件列表 变更期间告警需同步到变更审批流程
已恢复告警 status == "resolved" 仅记录到告警历史数据库 恢复事件无需通知,仅用于事后审计
路由规则优先级:当多条规则同时匹配时,建议采用“最先匹配”或“最高优先级”策略。实践中,应将最紧急、最具体的规则置于列表顶部,避免通用规则提前拦截关键告警。

2.4 目标端点(Target Endpoint)

目标端点是告警事件的最终接收方。根据通知方式和自动化程度,目标端点可分为三大类:

  • Webhook:通过 HTTP/HTTPS POST 请求将告警事件推送到外部系统,如 PagerDuty、Slack、钉钉、自研运维平台。Webhook 支持自定义 payload 格式,是实现自动化闭环的首选方式。
  • Email:通过 SMTP 协议发送告警邮件到指定邮箱或邮件列表。适合非紧急、需要留痕的告警通知。
  • SMS / 电话:通过第三方短信网关或语音呼叫服务发送告警。适用于最高优先级的告警,确保值班人员即使不在电脑前也能收到通知。
// Webhook 目标端点配置示例(YAML)
endpoints:
  - name: "pagerduty-prod"
    type: webhook
    url: "https://events.pagerduty.com/v2/enqueue"
    method: POST
    headers:
      Content-Type: application/json
      Authorization: " =YOUR_PD_"
    timeout: 10s
    retry:
      max_attempts: 3
      backoff: exponential

  - name: "email-sre-team"
    type: email
    to: ["sre-team@company.com"]
    cc: ["manager@company.com"]
    smtp_server: "smtp.company.com:587"
    use_tls: true

  - name: "sms-oncall"
    type: sms
    provider: "twilio"
    to: ["+8613800138000"]
    template: "[严重] {{.title}} - {{.description}}"

2.5 告警路由核心流程

下图展示了告警路由引擎从接收告警事件到最终送达目标端点的完整处理链路:

告警路由核心处理流程 告警源 Prometheus / Zabbix / 自研 告警事件 结构化 JSON 数据 路由引擎 规则匹配 & 决策 路由规则库 Webhook 端点 PagerDuty / Slack / 自研 Email 端点 SRE 邮件列表 / 归档 SMS / 电话端点 Twilio / 语音网关 说明: 路由引擎根据告警事件的 labels、severity 等字段,匹配路由规则库中的条件,将告警分发到对应的 Webhook、Email 或 SMS 端点。 支持多路分发:一条告警可同时发送到多个端点,例如 Critical 告警同时触发 Webhook 和 SMS。

2.6 告警路由与变更窗口的关联

在变更窗口场景下,告警路由需要额外考虑以下特殊逻辑:

  • 窗口感知路由:在变更窗口开启期间,将告警路由到变更协调系统,而非常规值班渠道,避免干扰日常运维。
  • 告警降噪:变更期间可能产生大量预期内的告警(如服务重启导致的连接中断),路由规则应自动过滤或聚合这些告警。
  • 回滚触发:当路由规则匹配到变更窗口内的 Critical 告警时,可自动触发变更回滚流程,通过 Webhook 调用变更系统的回滚 API。
注意:变更窗口期间的告警路由规则应独立于常规规则,且优先级更高。建议在告警事件中显式添加 change_window: true 标签,以便路由引擎快速识别并应用窗口专属策略。