3. 告警路由基础:什么是告警路由、Loki与Alertmanager的集成方式

3.1 告警路由的核心概念

在可观测性体系中,告警路由是指将产生的告警事件根据预定义的规则(如标签、严重级别、来源)分发到不同接收端(如邮件、PagerDuty、Slack)的机制。它解决了“告警风暴”和“通知混乱”两大痛点,确保正确的告警在正确的时间到达正确的人。

告警路由的核心组件包括:

  • 告警源:产生告警的系统,如Loki、Prometheus、Grafana。
  • 路由引擎:根据标签匹配规则决定告警去向的中间件,典型代表为Alertmanager。
  • 接收器:最终接收告警通知的渠道,如邮件、即时通讯、工单系统。
关键原则:告警路由应遵循“先宽后窄”的匹配策略——先定义通用路由(匹配所有告警),再定义特定路由(匹配高优先级或特定标签的告警),避免告警丢失。

3.2 Loki与Alertmanager的集成架构

Loki本身不直接发送告警通知,而是通过Ruler组件评估告警规则,并将触发的告警推送到Alertmanager。Alertmanager负责去重、分组、抑制和路由分发。下图展示了完整的集成链路:

Loki → Alertmanager 告警路由集成架构 Loki 日志存储 + 查询 Ruler 告警规则评估 Alertmanager 去重 / 分组 / 路由 HTTP API 邮件 Slack / 钉钉 PagerDuty 集成要点: • Loki Ruler 通过 alertmanager-url 配置指向 Alertmanager 实例 • 告警以 HTTP POST 方式发送,格式为 Alertmanager 兼容的 JSON • 路由规则在 Alertmanager 的 config 中定义,基于标签匹配

3.3 告警路由的匹配机制

Alertmanager 的路由配置采用树形结构,每个路由节点包含一组匹配规则和子路由。告警进入后,从根路由开始逐级匹配,直到找到第一个匹配的叶子节点。匹配依据是告警的标签键值对。

路由属性 说明 示例
receiver 匹配成功后使用的接收器名称 receiver: "team-alert-email"
match 精确匹配标签(所有标签必须完全匹配) match: { severity: "critical" }
match_re 正则匹配标签值 match_re: { service: "web-.*" }
continue 匹配后是否继续向子路由传递 continue: true
group_by 分组聚合的标签列表 group_by: ['cluster', 'alertname']
路由匹配优先级:Alertmanager 按配置顺序从上到下评估路由。第一个匹配的路由节点生效,除非该节点设置了 continue: true,此时告警会继续匹配同级或子路由。建议将最具体的路由放在前面,通用路由放在末尾。

3.4 集成配置示例

以下是一个完整的 Loki Ruler 与 Alertmanager 集成配置片段:

# Loki Ruler 配置 (loki.yaml)
ruler:
  storage:
    type: local
    local:
      directory: /etc/loki/rules
  rule_path: /tmp/loki/rules
  alertmanager_url: http://alertmanager:9093
  external_url: http://loki:3100
  external_labels:
    source: loki
    env: production

# Alertmanager 路由配置 (alertmanager.yml)
route:
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - match:
        severity: critical
      receiver: 'pagerduty-critical'
      group_wait: 10s
      repeat_interval: 1h
    - match_re:
        service: 'api-.*'
      receiver: 'slack-api-team'
      group_by: ['service', 'alertname']

receivers:
  - name: 'default-receiver'
    email_configs:
      - to: 'ops@example.com'
  - name: 'pagerduty-critical'
    pagerduty_configs:
      - routing_key: 'YOUR_PD_KEY'
  - name: 'slack-api-team'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/xxx'
        channel: '#api-alerts'

3.5 路由策略对比

不同的路由策略适用于不同的运维场景,下表对比了三种常见策略:

策略类型 适用场景 优点 缺点
扁平路由 小团队、告警量少 配置简单,易于维护 无法精细控制,容易产生告警疲劳
层级路由 多团队、多环境 隔离性好,告警精准送达 配置复杂,调试困难
动态路由 大规模、标签动态变化 灵活适应业务变化 依赖标签规范,正则性能开销大

3.6 集成验证与常见问题

完成配置后,建议按以下步骤验证集成是否正常:

  1. 检查 Loki Ruler 日志:确认 Ruler 能正常连接到 Alertmanager,无连接超时或拒绝连接错误。
  2. 触发测试告警:在 Loki 中写入一条匹配告警规则的日志,等待评估周期触发。
  3. 查看 Alertmanager UI:访问 http://alertmanager:9093,确认告警是否到达并被正确分组。
  4. 验证通知送达:检查配置的接收器(如邮箱、Slack)是否收到告警通知。
常见陷阱:
  • Loki Ruler 的 alertmanager_url 必须使用 Alertmanager 可访问的地址,避免使用 localhost。
  • 告警标签必须与路由匹配规则完全一致,大小写敏感。
  • 如果告警未到达,优先检查 Ruler 的 external_labels 是否与路由匹配规则冲突。