3. Grafana 告警体系:从 Prometheus 到 Loki 的告警演进

3.1 告警体系演进路线:从 Prometheus 到 Loki 的架构变迁

在可观测性领域,告警体系经历了从单数据源告警到统一告警管理的深刻变革。Prometheus 的 Alertmanager 是早期告警体系的代表,它专注于处理基于指标(Metrics)的告警规则,而 Loki 的引入则带来了基于日志(Logs)的告警能力。Grafana Alerting 作为统一告警管理器,将这两者整合到一个统一的控制平面中。

核心演进驱动力: 传统基于指标的告警(如 CPU > 90%)无法捕获日志中的异常模式(如 ERROR 关键字爆发)。Loki 的 LogQL 告警规则填补了这一空白,而 Grafana Alerting 则提供了跨数据源的路由、静默和通知管理能力。
告警体系演进:从 Prometheus 到 Grafana 统一告警 Prometheus 时代 Prometheus Server Alertmanager 通知渠道 仅支持 Metrics 告警 告警规则分散在各 Prometheus 无统一视图 Loki 加入 Prometheus Server Loki + Ruler 通知渠道 支持 Metrics + Logs 告警 Loki Ruler 独立评估 LogQL 告警路由仍分散 Grafana 统一告警 Prometheus Loki Grafana Alerting 统一通知渠道 统一告警规则管理 统一路由、静默、通知 当前推荐架构

3.2 Grafana Alerting 统一告警管理器架构

Grafana Alerting 是 Grafana 内置的统一告警引擎,它不再依赖外部的 Alertmanager 或 Loki Ruler 进行告警评估和路由,而是将所有告警规则、评估、路由、静默和通知集中管理。其核心组件包括:

组件 职责 对应传统组件
Alert Rule 定义告警条件,支持 PromQL、LogQL、Graphite 等 Prometheus 告警规则 / Loki Ruler 规则
Evaluation Group 按固定间隔(如 10s、30s)评估规则 Prometheus 评估间隔
Alertmanager (Grafana 内置) 接收告警实例,执行路由、分组、静默、抑制 Prometheus Alertmanager
Contact Point 定义通知目标(邮件、Slack、PagerDuty、Webhook 等) Alertmanager 接收器
Notification Policy 树形路由策略,匹配标签并分发到 Contact Point Alertmanager 路由配置
Silence / Mute Timing 临时或周期性静默告警 Alertmanager 静默
关键差异: 在 Grafana Alerting 中,告警规则的评估由 Grafana 后端直接执行,不再需要每个 Prometheus 或 Loki 实例独立评估。这意味着你可以在一处定义所有告警规则,并统一管理它们的生命周期。

3.3 从 Prometheus 到 Loki 的告警规则迁移

当从 Prometheus 告警迁移到 Grafana 统一告警时,需要理解两种规则定义方式的差异。以下是一个典型的迁移对照:

维度 Prometheus 告警规则 Grafana Alerting 规则
规则语法 YAML 文件,PromQL 表达式 UI 或 API,支持 PromQL / LogQL / Graphite
评估位置 Prometheus Server 或 Loki Ruler Grafana 后端
路由配置 Alertmanager 配置文件(route) Notification Policy 树形结构
标签继承 自动继承 Prometheus 标签 可自定义标签,支持模板
日志告警 需额外部署 Loki Ruler 原生支持 LogQL 规则
Grafana Alerting 统一告警流程 数据源 Prometheus / Loki / Graphite 规则评估 Evaluation Group 告警实例 Firing / Pending 通知策略 路由 / 分组 / 静默 通知渠道 Slack / Email / PagerDuty 统一告警优势 • 单点管理所有告警规则 • 统一路由与通知策略 • 支持跨数据源告警 • 内置静默与抑制 • 告警历史与审计 • 模板化通知消息 • 与 Grafana 面板集成 • 支持告警分组降噪 • 可扩展的 Webhook • 兼容 Prometheus 规则 • 原生 LogQL 支持

3.4 告警路由与通知策略的标准化

在 Grafana Alerting 中,Notification Policy 取代了传统 Alertmanager 的 route 配置。它采用树形结构,支持基于标签的精确匹配、正则匹配和默认路由。以下是一个标准化的告警路由配置示例:

// Grafana Notification Policy 树形结构(UI 配置等效)
// 根策略:默认路由
//   ├── 子策略 1:匹配 severity="critical"
//   │   └── 发送到 PagerDuty + Slack
//   ├── 子策略 2:匹配 severity="warning" + team="platform"
//   │   └── 发送到 Slack #platform-alerts
//   ├── 子策略 3:匹配 source="loki" + log_type="error"
//   │   └── 发送到 Webhook (变更窗口事件)
//   └── 默认子策略:匹配所有未匹配告警
//       └── 发送到 Email 摘要
变更窗口场景注意: 在变更窗口期间,你可能需要临时调整告警路由策略,例如将 critical 告警降级为 warning,或将其路由到专门的变更窗口通知渠道。Grafana Alerting 的 Mute Timing 和 Silence 功能可以精确控制这一行为,而不需要修改告警规则本身。

3.5 告警模板与标准化通信

Grafana Alerting 支持使用 Go 模板 自定义通知消息。这对于变更窗口场景尤为重要——你可以将告警的上下文信息(如变更 ID、服务名称、时间戳)嵌入到通知中,形成标准化的通信格式。

以下是一个标准的告警通知模板示例:

{{ define "changewindow_alert" }}
[{{ .Status | toUpper }}] 变更窗口告警
变更 ID: {{ .Labels.changewindow_id }}
服务: {{ .Labels.service }}
环境: {{ .Labels.environment }}
告警名称: {{ .Labels.alertname }}
描述: {{ .Annotations.description }}
触发时间: {{ .StartsAt | date "2006-01-02 15:04:05" }}
当前值: {{ .Values.A }}
{{ end }}
标准化通信的核心要素:
  • 告警状态:Firing / Resolved,明确当前告警阶段
  • 变更标识:changewindow_id,关联到具体的变更事件
  • 服务与环境:快速定位影响范围
  • 触发时间与当前值:提供实时数据,辅助决策
  • 建议操作:在 Annotations 中预置回滚或排查步骤

3.6 从 Prometheus 到 Loki 告警的实践要点

在迁移或新建告警体系时,需要关注以下实践要点:

  1. 告警规则统一管理:将所有告警规则迁移到 Grafana Alerting,避免分散在 Prometheus 和 Loki Ruler 中。
  2. 标签标准化:定义统一的标签命名规范(如 severity、team、service、changewindow_id),确保路由策略可正确匹配。
  3. 评估间隔与延迟:Loki 日志告警通常需要更大的评估间隔(如 1m-5m),以应对日志采集和索引的延迟。
  4. 告警分组降噪:利用 Notification Policy 的分组功能,将相同变更窗口的告警合并为一条通知,避免告警风暴。
  5. 静默与变更窗口联动:通过 API 或 Webhook 在变更窗口开启时自动创建 Mute Timing,关闭时自动清理。
数据源类型 推荐评估间隔 典型告警场景 路由标签示例
Prometheus (Metrics) 10s - 30s CPU 高、内存不足、QPS 下降 severity="critical", metric="cpu_usage"
Loki (Logs) 1m - 5m ERROR 日志爆发、异常模式匹配 source="loki", log_type="error"
混合 (Metrics + Logs) 30s - 1m 错误率 + 错误日志关联分析 service="payment", changewindow_id="CW-123"
推荐实践: 在变更窗口期间,建议将 Loki 日志告警的评估间隔缩短至 30s-1m,以便更快地捕获变更引入的异常。同时,在 Notification Policy 中为变更窗口告警设置独立的通知渠道(如专门的 Slack 频道),避免干扰常规告警流。