仪表盘
构建值班工程师凌晨 3 点也能读懂的仪表盘 — 快、直观、面向行动。
为什么
仪表盘是决策工具,不是数据堆。凌晨 3 点宕机时,工程师只有几秒在噪声中定位信号,而 30 个面板的虚荣图墙每次都会让你多花几分钟 MTTR。好仪表盘每个面板只回答一个问题,把最重要信号放左上(视线落点),颜色只表示状态(绿/黄/红),并把每个面板链接到它变红时该怎么做的 runbook。把仪表盘当艺术项目的团队最终得到压力下没人用的漂亮图墙,值班工程师反而盯着终端里的原始 Prometheus 查询。
何时使用
指标埋点就位之后。若值班工程师在事件中常开终端而非仪表盘,或某仪表盘有 >20 个面板,则需重建。
如何做
1. 定义受众和问题 - 值班仪表盘:"服务健康吗?不健康的话在哪?" - 容量仪表盘:"我们接近极限了吗?" - 业务仪表盘:"用户在成功吗?" — 受众不同,面板不同 2. 布局跟随眼动:左上 = 最重要 - 第 1 行:黄金信号(RED 摘要 3 个大 stat 面板带阈值) - 第 2 行:延迟热力图 + 按路由错误率 - 第 3 行:依赖(DB、缓存、下游服务)健康 - 第 4 行:饱和信号(CPU、内存、队列深度、连接池) 3. 每个面板一个问题 - 坏:"orders 服务所有指标"(堆) - 好:"POST /api/orders 5m 内错误率"(决策) - 若无法把面板表述成一个问题,删掉它 4. 颜色 = 状态,非装饰 - 绿/黄/红阈值绑定 SLO 燃烧率 - 不要彩虹配色,不要 20 条线的图加图例 - 永远绿色的面板是删除候选 5. 每个面板链接 runbook - 面板标题或描述链接到"变红时怎么做"的 runbook - 包含查询和告警名,让工程师能深入调查 6. 用真实事件测试 - 下次宕机时,观察值班工程师用它 - 若他们离开仪表盘去开终端,说明 仪表盘失败了 — 修它
示例
# Grafana 仪表盘即代码(JSON 入 Git)
{
"title": "Orders 服务 — 值班",
"panels": [
{ "title": "请求/秒", "gridPos": {"h":4,"w":8,"x":0,"y":0},
"targets": [{"expr": "sum(rate(http_requests_total{service='orders'}[5m]))"}] },
{ "title": "错误 %", "gridPos": {"h":4,"w":8,"x":8,"y":0},
"thresholds": {"steps":[{"color":"green"},{"color":"red","value":1}]},
"targets": [{"expr": "sum(rate(http_requests_total{service='orders',status=~'5..'}[5m])) / sum(rate(http_requests_total{service='orders'}[5m])) * 100"}] },
{ "title": "p95 延迟", "gridPos": {"h":4,"w":8,"x":16,"y":0},
"targets": [{"expr": "histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{service='orders'}[5m])) by (le))"}] }
],
"links": [{"title": "Runbook:orders 高错误率", "url": "https://runbooks/operate/orders-high-error"}]
}
# 经验法则:若一个面板移动后不影响行为,它是装饰 — 删掉它。常见问题
- ⚠30+ 面板、加载 30 秒的仪表盘 — 值班工程师放弃它直接查 Prometheus,失去意义。
- ⚠什么都用折线图,而热力图和 stat 面板传达状态更快 — 一条平在 50ms 的 p99 线对尾部分布毫无说明。
- ⚠无 runbook 链接 — 红面板没有"怎么做"链接,迫使工程师凌晨 3 点重新发明调查,推高 MTTR。
- ⚠颜色用于装饰(彩虹序列)而非状态 — 工程师在彩色线海中找不到红色信号。
最佳实践
- ✓把仪表盘当代码:Grafana JSON 入 Git,PR 审查变更,模板版本化使改进传播到所有服务。
- ✓值班仪表盘上限 12 个面板;需要更多则拆成第二个仪表盘从第一个链接,使主仪表盘 <3 秒加载。
- ✓每个面板必须链接 runbook 且阈值绑定 SLO — 无阈值的面板是图,不是监控信号。
- ✓每次事件后做"仪表盘复盘":值班工程师是从仪表盘还是终端找到原因?修失败的那个。