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 的查询内容。适合需要按服务、环境或团队进行切分的场景。
Grafana SLO 看板三层布局架构 L1:全局健康 核心 SLO 达成率 | 错误预算消耗 | 全局告警风暴 | 自愈成功率 L2:服务视图 按服务拆分的 SLO 详情 | 错误率/延迟 | 自愈剧本执行列表 (支持通过 $service 变量动态切换) L3:诊断详情 告警事件时间线 | 自愈剧本执行日志 | 原始指标数据 阅读流:宏观 → 微观

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]))
模板变量驱动看板交互流程 用户选择变量 如 $service = "api-gateway" Grafana 变量引擎 解析依赖 & 刷新 数据源查询 PromQL / LogQL Panel 重新渲染 图表 & 表格更新 核心原则:变量改变 → 引擎触发 → 所有依赖该变量的 Panel 自动刷新

2.4 设计原则总结清单

在开始制作看板前,请对照以下清单进行设计评审:

  1. 布局: 是否遵循了“全局健康 → 服务视图 → 诊断详情”的三层结构?
  2. 数据源: 指标、日志、事件、自愈状态是否使用了最合适的数据源?
  3. 变量: 是否定义了 $service、$environment 等核心变量?变量之间是否存在链式依赖?
  4. 性能: 是否避免了在单个 Panel 中查询过多数据?是否使用了 $__rate_interval 等 Grafana 内置变量优化查询?
  5. 可操作性: 看板上的每个图表是否都能直接关联到告警或自愈剧本?