3. Grafana 告警体系:从 Prometheus 到 Loki 的告警演进
3.1 告警体系演进路线:从 Prometheus 到 Loki 的架构变迁
在可观测性领域,告警体系经历了从单数据源告警到统一告警管理的深刻变革。Prometheus 的 Alertmanager 是早期告警体系的代表,它专注于处理基于指标(Metrics)的告警规则,而 Loki 的引入则带来了基于日志(Logs)的告警能力。Grafana Alerting 作为统一告警管理器,将这两者整合到一个统一的控制平面中。
核心演进驱动力: 传统基于指标的告警(如 CPU > 90%)无法捕获日志中的异常模式(如 ERROR 关键字爆发)。Loki 的 LogQL 告警规则填补了这一空白,而 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 规则 |
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 告警的实践要点
在迁移或新建告警体系时,需要关注以下实践要点:
- 告警规则统一管理:将所有告警规则迁移到 Grafana Alerting,避免分散在 Prometheus 和 Loki Ruler 中。
- 标签标准化:定义统一的标签命名规范(如
severity、team、service、changewindow_id),确保路由策略可正确匹配。 - 评估间隔与延迟:Loki 日志告警通常需要更大的评估间隔(如 1m-5m),以应对日志采集和索引的延迟。
- 告警分组降噪:利用 Notification Policy 的分组功能,将相同变更窗口的告警合并为一条通知,避免告警风暴。
- 静默与变更窗口联动:通过 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 频道),避免干扰常规告警流。