监控与仪表盘
指导 Agent 从用户旅程提炼 SLI、设定 SLO 与错误预算,并配置 RED/USE 类指标、日志关联与 Grafana 面板模板即代码。
SKILL 要求告警包含运行手册链接、严重级别与静默规则;避免「仅图表无阈值」或重复告警风暴;burn rate 多窗口若采用需写清参数来源。
指标命名遵循 Prometheus 约定(单位后缀、_total 计数器);histogram bucket 与 SLO 查询对齐;高基数标签禁止项列明。
分布式 trace 与日志 trace id 关联;采样率在成本与排障之间的默认策略;仪表盘变量与多环境 datasource 约定。
观测设计主流程
[ 用户旅程 / 关键路径 ]
│
▼
┌─────────────┐ 候选 SLI:可用性、延迟分位、正确率、吞吐
│ SLI → SLO │──── 错误预算窗口与政策(季度 / 滚动)
└─────────────┘
│
▼
┌─────────────┐ RED / USE 指标映射 + 日志 / Trace 关联字段
│ 指标与采集 │──── 命名、bucket、标签白名单与基数审查
└─────────────┘
│
▼
┌─────────────┐ 按角色分行:on-call / 产品 / 管理;变量与环境
│ Grafana 面板 │──── JSON 导出或 Terraform / 代码库路径
└─────────────┘
│
▼
┌─────────────┐ 阈值、路由、静默、Runbook;burn rate 参数写明
│ 告警与复盘 │──── 预算耗尽 → 发布冻结或与发布技能联动
└─────────────┘
RED 与 USE 列指标
面向微服务或请求驱动路径时优先补齐 RED;面向主机、队列、数据存储容量时叠加 USE。Agent 输出 SKILL 时应写明指标与 SLO 查询的对应关系,避免重复图表。
RED:请求率、错误与延迟
- Rate:每秒请求 / 任务数;与容量、限流、Autoscale 对齐。
- Errors:HTTP 5xx、业务失败码、超时;分子分母与 SLO 一致。
- Duration:p50 / p95 / p99;histogram bucket 与告警 PromQL 共用。
USE:利用率、饱和度与错误
- Utilization:CPU、内存、连接池占用比例;区分实例与集群。
- Saturation:队列深度、等待时间、线程池排队的「满了吗」信号。
- Errors:设备 / 驱动 / 磁盘 IO 错误等底层失败(与 RED 错误互补)。
Golden Signals 标准面板布局(Grafana JSON 结构示例):
// Grafana Dashboard JSON 片段:Golden Signals 布局
// 包含 SLO 面板(availability)的完整配置
{
"title": "payment-svc — Golden Signals",
"uid": "payment-golden-signals-v1",
"tags": ["payment", "slo", "oncall"],
"templating": {
"list": [
{
"name": "env",
"type": "custom",
"options": [{"value": "prod"}, {"value": "staging"}],
"current": {"value": "prod"}
}
]
},
"panels": [
{
"title": "Availability SLO (99.9%)",
"type": "stat",
"gridPos": {"x": 0, "y": 0, "w": 6, "h": 4},
"targets": [{
"expr": "sum(rate(http_requests_total{job='payment-svc',env='$env',code!~'5..'}[28d])) / sum(rate(http_requests_total{job='payment-svc',env='$env'}[28d])) * 100",
"legendFormat": "Availability %"
}],
"fieldConfig": {
"defaults": {
"thresholds": {
"steps": [
{"value": 0, "color": "red"},
{"value": 99.5, "color": "yellow"},
{"value": 99.9, "color": "green"}
]
},
"unit": "percent"
}
},
"options": {"reduceOptions": {"calcs": ["lastNotNull"]}}
},
{
"title": "Request Rate (RPS)",
"type": "timeseries",
"gridPos": {"x": 6, "y": 0, "w": 9, "h": 4},
"targets": [{
"expr": "sum(rate(http_requests_total{job='payment-svc',env='$env'}[5m])) by (code)",
"legendFormat": "HTTP {{code}}"
}]
},
{
"title": "Latency p99 vs SLO (200ms)",
"type": "timeseries",
"gridPos": {"x": 15, "y": 0, "w": 9, "h": 4},
"targets": [{
"expr": "histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{job='payment-svc',env='$env'}[5m])) by (le))",
"legendFormat": "p99 latency"
}]
}
]
}
SLI、SLO 与错误预算
切换下列焦点时,SKILL 正文应把对应段落写全:测量窗口、合规口径、以及多窗口 burn rate 是否与 Google SRE 约定一致。
SLI 候选与测量窗口
从旅程映射 SLI:成功请求比例、延迟分位、数据新鲜度等;写清聚合窗口(5m / 1h)与「好的」事件定义。histogram le bucket 须覆盖 SLO 阈值,避免外推误差。
# Availability SLO:Prometheus Query(28天滚动窗口)
# 定义:成功请求 / 总请求(排除 4xx 客户端错误)
sum(rate(http_requests_total{job="payment-svc",code!~"[45].."}[28d]))
/
sum(rate(http_requests_total{job="payment-svc"}[28d]))
# 等价 Recording Rule(减少查询负载)
# prometheus rules:
- record: job:slo_availability:ratio_rate28d
expr: |
sum(rate(http_requests_total{job="payment-svc",code!~"[45].."}[28d]))
/ sum(rate(http_requests_total{job="payment-svc"}[28d]))
# Latency SLO:p99 < 200ms(直方图查询)
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{job="payment-svc"}[5m]))
by (le)
) < 0.2 # 200ms SLO 阈值
错误预算与豁免
预算消耗速率与发布节奏挂钩;写明冻结条件、紧急豁免审批与事后补账。仪表盘上同时展示「剩余预算」与「本窗口消耗趋势」,避免只看即时 SLI。
# 错误预算计算(99.9% SLO,28天窗口)
# 总允许错误分钟数 = 28 * 24 * 60 * (1 - 0.999) = 40.32 min
# 剩余预算查询:
(1 - job:slo_availability:ratio_rate28d{job="payment-svc"}) * 28 * 24 * 60
# 结果单位:分钟,当前已消耗的错误预算
# 错误预算消耗百分比(面板展示用)
(1 - job:slo_availability:ratio_rate28d{job="payment-svc"})
/ (1 - 0.999)
* 100 # 结果 >100 表示已超预算
多窗口 burn rate 告警
长短窗口组合(如 1h+6h)降低误报;SKILL 须列出窗口、阈值系数与数据源(Recording rule 或直查)。禁止复制粘贴未注明来源的魔法数字。
# Burn Rate 多窗口告警(Google SRE Book 方法)
# 告警条件:1h窗口 AND 6h窗口 burn rate 均超阈值(减少误报)
groups:
- name: slo.payment-svc
rules:
- alert: PaymentSLOBurnRateHigh
expr: |
(
# 短窗口(1h)burn rate > 14.4x(消耗速率超正常的14.4倍)
sum(rate(http_requests_total{job="payment-svc",code=~"5.."}[1h]))
/ sum(rate(http_requests_total{job="payment-svc"}[1h]))
/ (1 - 0.999) > 14.4
) and (
# 长窗口(6h)burn rate > 6x(防止短暂抖动的误报)
sum(rate(http_requests_total{job="payment-svc",code=~"5.."}[6h]))
/ sum(rate(http_requests_total{job="payment-svc"}[6h]))
/ (1 - 0.999) > 6
)
for: 2m
labels:
severity: critical
slo: availability
annotations:
summary: "Payment SLO burn rate critical: 2h消耗14.4x错误预算"
runbook_url: "https://wiki/runbooks/payment-slo-burn"
与「告警与值班响应」技能对齐:每条 SLO 相关告警绑定 Runbook、严重级别与静默规则;面板链接嵌入值班手册占位。
告警、面板分层与基数
- 面板:按角色(on-call、产品、管理)分层,避免单屏信息过载。
- 导入导出:Grafana JSON 或 Terraform provider 管理路径。
- 事后:错误预算耗尽时的发布冻结或与发布技能联动的流程。
- 高基数维度(如未脱敏 user_id)列入禁止项;允许维度需在 SKILL 中显式审批。
面板标题 slug 导出
根据各带 .dash-slug-panel 的区块内标题生成稳定 slug(优先 data-dash-slug,否则从标题中的拉丁字符推导),便于写入 IaC、Grafana uid 前缀或 SKILL 附录。
中文标题若无拉丁片段,请直接在 HTML 的 data-dash-slug 中维护机器可读 id;生成结果可作为团队约定表粘贴到仓库文档。
---
name: monitoring-dashboards
description: SLI/SLO、告警与 Grafana 面板设计
model: claude-sonnet-4-5
---
# 步骤
steps:
1. 用户旅程映射 SLI(availability/latency/correctness)
2. 设定 SLO 目标值与错误预算窗口(28天滚动)
3. 设计 Prometheus 指标命名(单位后缀/_total计数器)
4. 定义 histogram bucket(覆盖 SLO 阈值,避免外推误差)
5. 配置 Recording Rules(减少查询复杂度)
6. 设计 Grafana 面板(Golden Signals: Rate/Errors/Duration/Saturation)
7. 配置 Burn Rate 多窗口告警(1h+6h 组合)
8. 设置告警路由与 Runbook 链接
# 指标命名规范
naming_convention:
counter: http_requests_total(_total后缀)
gauge: process_memory_bytes(单位后缀)
histogram: http_request_duration_seconds(秒为单位)
forbidden_labels: [user_id, email, ip_address] # 高基数禁止项