4. SLI 指标采集:请求成功率、延迟分布、错误率指标的 PromQL 查询
SLI(Service Level Indicator)是 SLO 体系的量化基石。在 Grafana 看板中,SLI 的采集质量直接决定告警准确性与自愈触发时机。本章聚焦三大核心 SLI 的 PromQL 查询模式:请求成功率、延迟分布与错误率,并给出可直接嵌入看板面板的查询模板。
4.1 三大 SLI 的 PromQL 查询模板
以下表格汇总了三种 SLI 的典型 PromQL 表达式、适用场景与常见数据源标签约定。所有查询均基于 prometheus_http_requests_total 与 prometheus_http_request_duration_seconds_bucket 示例指标,实际使用时替换为业务指标名即可。
| SLI 类型 | PromQL 查询 | 说明 | 常用标签 |
|---|---|---|---|
| 请求成功率 | |
5 分钟内 2xx/3xx 请求占比,范围 0~1 | status, method, handler |
| 延迟分布 (p99) | |
基于直方图计算 p99 延迟,单位秒 | le, handler |
| 错误率 | |
5 分钟内 5xx 错误占比,通常要求 < 0.001 | status, method |
4.2 延迟分布的多分位采集策略
仅采集 p99 不足以全面评估延迟健康度。推荐同时采集 p50、p90、p99 三个分位,形成延迟分布视图。以下为多分位查询模板:
# p50 延迟
histogram_quantile(0.50, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
# p90 延迟
histogram_quantile(0.90, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
# p99 延迟
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
在 Grafana 面板中,可将三条查询合并为同一张时间序列图,使用不同颜色区分分位线,便于快速识别延迟拐点。
4.3 SLI 采集架构与数据流
下图展示了从业务服务到 Grafana 看板的 SLI 数据采集链路,包含指标暴露、Prometheus 抓取、Recording Rule 预计算与看板查询四个关键环节。
sli:<指标名>:<时间窗口> 格式命名。
4.4 错误率与成功率的互斥关系
在实际看板设计中,错误率与成功率并非简单的 1:1 互补。以下表格澄清了常见状态码分类与 SLI 归属:
| 状态码范围 | 分类 | 是否计入成功率 | 是否计入错误率 | SLI 处理建议 |
|---|---|---|---|---|
| 2xx | 成功 | 是 | 否 | 计入分子分母 |
| 3xx | 重定向 | 是 | 否 | 计入分子分母 |
| 4xx | 客户端错误 | 否 | 否 | 单独监控,不计入 SLO |
| 5xx | 服务端错误 | 否 | 是 | 计入错误率分子 |
4.5 多维度 SLI 聚合查询
当需要按 服务、端点 或 地域 维度拆分 SLI 时,需在 PromQL 中保留对应标签。以下为按 handler 维度聚合的成功率查询:
# 按 handler 维度聚合成功率
sum by (handler) (
rate(prometheus_http_requests_total{status=~"2..|3.."}[5m])
)
/
sum by (handler) (
rate(prometheus_http_requests_total[5m])
)
在 Grafana 中,可将 handler 设为图例模板变量 {{handler}},实现多线对比。若维度过多(如超过 20 个),建议使用 Top 10 排序或 降采样 避免面板过载。
4.6 SLI 采集的常见陷阱与校验方法
- 指标缺失: 新部署的服务未暴露 /metrics 端点,导致 Prometheus 抓取失败。校验方法:在 Prometheus Target 页面检查
up指标是否为 1。 - 标签爆炸: 高基数标签(如
user_id、request_id)导致 Prometheus 内存飙升。校验方法:使用count by (handler) (metric)检查标签基数。 - 时间窗口不一致: 成功率使用 5m 窗口,错误率使用 1m 窗口,导致燃烧率计算偏差。校验方法:统一所有 SLI 的时间窗口为相同值。
- 直方图 bucket 泄漏: 延迟分布出现
+Inf占比过高,说明最大 bucket 设置过小。校验方法:检查le="+Inf"的计数是否显著高于前一个 bucket。
NaN 或 Inf,说明分母为零或指标名错误。
通过以上 PromQL 模板与采集策略,你可以在 Grafana 看板中稳定获取请求成功率、延迟分布与错误率三大 SLI,为后续 SLO 燃烧率计算与自愈剧本触发提供可靠的数据基础。