2. Grafana 看板设计原则:布局、数据源与模板化
设计一个用于监控 SLO 告警与自愈剧本执行状态的 Grafana 看板,不仅仅是拖拽图表。它需要遵循一套严谨的设计原则,确保看板在运维团队中具备可读性、可维护性和可操作性。本章将围绕三大核心支柱展开:看板布局策略、数据源选择、变量与模板化设计。
2.1 看板布局策略:从宏观到微观
一个优秀的 SRE 看板应当遵循“金字塔原则”或“从上到下、从左到右”的阅读流。用户应能在 5 秒内判断系统整体健康度,并在 30 秒内定位到具体故障点。
2.1.1 标准三层布局模型
我们将看板垂直划分为三个逻辑区域,每一层服务于不同的运维角色和决策粒度:
| 层级 | 位置 | 内容 | 目标用户 |
|---|---|---|---|
| L1:全局健康 | 顶部 1-2 行 | 核心 SLO 达成率、全局错误预算、关键告警数量、自愈剧本整体成功率 | 值班经理、SRE 负责人 |
| L2:服务视图 | 中部 3-5 行 | 按服务或团队拆分的 SLO 详情、错误率、延迟、自愈剧本执行列表 | 服务 Owner、SRE 工程师 |
| L3:诊断详情 | 底部区域 | 单个告警的日志、事件时间线、自愈剧本执行日志、指标原始数据 | 排障工程师、On-Call 人员 |
设计建议: 使用 Grafana 的 Row 功能对每一层进行分组,并添加折叠/展开功能。默认只展开 L1 和 L2,L3 在需要排查时再展开,避免信息过载。
2.1.2 布局策略对比
在实际项目中,我们通常混合使用以下两种策略:
- 固定网格布局: 使用
Repeat功能或固定 Panel 位置。适合指标数量固定、结构稳定的看板(如核心 SLO 总览)。 - 动态变量驱动布局: 通过模板变量(如
$service)动态控制 Panel 的查询内容。适合需要按服务、环境或团队进行切分的场景。
2.2 数据源选择:统一与隔离
数据源是看板的“血液”。对于 SLO 和自愈监控场景,数据源的选择直接影响查询性能和数据的准确性。
2.2.1 推荐数据源组合
| 数据源类型 | 推荐产品 | 适用场景 | 注意事项 |
|---|---|---|---|
| 指标存储 | Prometheus / VictoriaMetrics | SLO 指标(SLI)、错误预算、延迟、吞吐量 | 确保指标命名规范,使用 _total 和 _bucket 后缀 |
| 日志存储 | Loki / Elasticsearch | 自愈剧本执行日志、告警事件详情、排障上下文 | 日志必须包含 trace_id 或 playbook_id 用于关联 |
| 事件/告警 | Alertmanager / Grafana OnCall | 告警状态、告警沉默、告警接收人 | 通过 AM 数据源直接查询告警列表 |
| 自愈状态 | MySQL / PostgreSQL / API | 自愈剧本执行状态、步骤结果、重试次数 | 建议使用 Grafana Infinity 数据源对接 REST API |
避坑指南: 不要将所有数据都塞进 Prometheus。对于自愈剧本的详细执行日志(如步骤输出、错误堆栈),应存储在 Loki 或 ES 中,Prometheus 只存储聚合后的状态指标(如
playbook_success_total)。
2.3 变量与模板化设计:让看板“活”起来
模板变量是 Grafana 最强大的功能之一。通过变量,我们可以将一张静态看板变为一个动态的、可交互的运维控制台。
2.3.1 核心变量定义
针对 SLO 与自愈场景,建议定义以下核心变量:
$service:服务名称,用于按服务切分所有图表。$environment:环境(prod/staging),用于区分不同环境的 SLO。$slo_name:SLO 名称,用于查看特定 SLO 的详细燃烧速率。$playbook_id:自愈剧本 ID,用于追踪特定剧本的执行历史。$interval:时间范围,用于快速切换(如 1h、6h、24h)。
2.3.2 变量依赖与链式查询
变量之间可以建立依赖关系,实现级联过滤。例如,选择 $service 后,$slo_name 下拉框只显示该服务下的 SLO。
# 变量:$slo_name
# 查询类型:Query
# 数据源:Prometheus
# 查询语句:
label_values({__name__=~"slo:.*", service="$service"}, slo_name)
2.3.3 变量在 Panel 中的使用
在 Panel 的 PromQL 查询中,直接引用变量:
# 查询当前服务的 SLO 达成率
sum(rate(slo:success_total{service="$service", slo_name="$slo_name"}[5m]))
/
sum(rate(slo:total{service="$service", slo_name="$slo_name"}[5m]))
2.4 设计原则总结清单
在开始制作看板前,请对照以下清单进行设计评审:
- 布局: 是否遵循了“全局健康 → 服务视图 → 诊断详情”的三层结构?
- 数据源: 指标、日志、事件、自愈状态是否使用了最合适的数据源?
- 变量: 是否定义了
$service、$environment等核心变量?变量之间是否存在链式依赖? - 性能: 是否避免了在单个 Panel 中查询过多数据?是否使用了
$__rate_interval等 Grafana 内置变量优化查询? - 可操作性: 看板上的每个图表是否都能直接关联到告警或自愈剧本?