4、Prometheus基础与指标类型:四种核心指标类型及其在SLI中的应用

Prometheus 是云原生监控的事实标准,其多维数据模型和强大的 PromQL 查询语言为 SLI 采集提供了灵活、精准的底座。理解 Prometheus 的四种核心指标类型——Counter、Gauge、Histogram 和 Summary——是构建可靠 SLI 数据管道的第一步。每种类型对应不同的数据特征和计算场景,选错类型将直接导致 SLI 计算失真。

4.1 四种指标类型概览

指标类型 数据特征 典型 SLI 场景 PromQL 常用函数
Counter 只增不减(重启归零) 请求总数、错误总数、延迟累计 rate()、increase()
Gauge 可增可减,反映当前状态 CPU 使用率、内存占用、并发连接数 avg()、max()、quantile()
Histogram 分桶计数,可计算分位数 请求延迟分布、响应大小分布 histogram_quantile()
Summary 客户端预计算分位数 延迟分位数(无法聚合) 直接读取 quantile 标签
选型黄金法则: 能用 Counter 的不要用 Gauge;需要分位数且允许服务端计算的用 Histogram;需要精确分位数且不跨实例聚合的用 Summary。

4.2 Counter:累计计数,驱动速率类 SLI

Counter 是最常用的指标类型,其值只能单调递增(进程重启时归零)。它天然适合描述“总量”类数据,如 HTTP 请求总数、错误总数、任务执行次数。在 SLI 计算中,我们几乎从不直接使用 Counter 的原始值,而是通过 rate() 或 increase() 函数将其转换为每秒速率或一段时间内的增量。

# 示例:计算过去5分钟的平均请求速率(QPS)
rate(http_requests_total{job="api-server"}[5m])

# 示例:计算过去1小时内的错误总数增量
increase(http_errors_total{job="api-server"}[1h])
SLI 实战提示: 定义“请求成功率”SLI 时,通常使用 rate(http_errors_total[5m]) / rate(http_requests_total[5m]) 计算错误率,再用 1 减去得到成功率。务必确保两个 Counter 的 label 维度一致。

4.3 Gauge:瞬时快照,监控饱和度与资源

Gauge 反映当前时刻的瞬时值,可升可降。它适用于描述状态或水位类指标,如 CPU 使用率、内存使用量、队列深度、并发连接数。在 SLI 中,Gauge 常用于监控资源饱和度和容量瓶颈。

# 示例:获取当前 CPU 使用率最高的节点
max(node_cpu_seconds_total{mode="idle"}) by (instance)

# 示例:检查当前队列深度是否超过阈值
queue_depth{job="worker"} > 1000
避坑指南: 不要用 Gauge 统计“请求总数”或“错误总数”,因为 Gauge 的瞬时值无法准确反映累计量,且进程重启后数据会丢失。这类场景应使用 Counter。

4.4 Histogram:分桶统计,服务端计算延迟分布

Histogram 是构建延迟类 SLI 的核心工具。它将观测值(如请求延迟)分配到预定义的桶(bucket)中,同时记录所有观测值的总和(_sum)和总数(_count)。Prometheus 服务端通过 histogram_quantile() 函数计算分位数,如 P99、P95 延迟。

# 示例:计算过去5分钟的 P99 延迟(单位:秒)
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# 示例:计算平均延迟(通过 _sum / _count)
rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])
桶设计原则: 桶的边界应覆盖目标 SLI 的阈值范围。例如,若 SLO 要求 P99 延迟 < 200ms,则应在 200ms 附近加密桶(如 0.1、0.15、0.2、0.25、0.3),以提高分位数精度。

4.5 Summary:客户端预计算,精确但不可聚合

Summary 在客户端直接计算分位数,并将结果以 quantile 标签的形式暴露。它不依赖服务端计算,因此分位数更精确,但无法跨实例聚合。在微服务架构中,Summary 通常用于需要精确延迟监控但不需要全局聚合的场景。

# Summary 暴露的指标示例(直接读取)
rpc_duration_seconds{quantile="0.5"}  0.052
rpc_duration_seconds{quantile="0.9"}  0.123
rpc_duration_seconds{quantile="0.99"} 0.345
rpc_duration_seconds_count            1000
rpc_duration_seconds_sum              45.6
关键区别: Histogram 的分位数在 Prometheus 服务端计算,支持 sum() 聚合;Summary 的分位数在客户端预计算,sum() 聚合后的分位数无意义。在需要全局 SLI 聚合时,优先选择 Histogram。

4.6 指标类型选择决策流程

指标类型选择决策流程 需要采集什么数据? 数据是累计增长还是瞬时状态? 累计增长 Counter 瞬时状态 Gauge 是否需要延迟/大小分位数? 不需要 直接使用 Counter 需要 需要跨实例聚合? 是 Histogram 否 Summary

4.7 四种类型在 SLI 中的典型应用对照

SLI 指标 推荐类型 采集示例 PromQL 计算方式
请求速率 (QPS) Counter http_requests_total rate(http_requests_total[5m])
错误率 Counter http_errors_total rate(http_errors_total[5m]) / rate(http_requests_total[5m])
P99 延迟 Histogram http_request_duration_seconds_bucket histogram_quantile(0.99, rate(..._bucket[5m]))
平均延迟 Histogram / Summary ..._duration_seconds_sum / ..._count rate(_sum[5m]) / rate(_count[5m])
CPU 使用率 Gauge node_cpu_seconds_total{mode="idle"} 1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))
内存使用率 Gauge node_memory_MemTotal_bytes / node_memory_MemFree_bytes (node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes
并发连接数 Gauge nginx_connections_active nginx_connections_active
最佳实践: 在定义 SLI 指标时,始终为指标添加清晰的 unit 和 help 注释,并在 label 中保留足够的维度信息(如 method、endpoint、status),以便后续进行多维度的 SLO 聚合分析。