3. Prometheus 基础回顾:数据模型、PromQL 与关键指标类型

在构建 IDP 灰度发布准入检查之前,必须牢固掌握 Prometheus 的核心数据模型与查询语言。本章将系统回顾 Prometheus 的指标体系、PromQL 基础语法以及四种关键指标类型,为后续的准入规则编写和告警配置奠定基础。

3.1 Prometheus 数据模型

Prometheus 将所有采集的数据存储为时间序列(Time Series),每个时间序列由指标名称(Metric Name)和一组标签(Labels)唯一标识。

概念 说明 示例
指标名称 描述被监控对象的含义,通常包含命名空间 http_requests_total
标签 键值对,用于区分同一指标的不同维度 method="GET", status="200"
样本 时间戳 + 浮点数值 @1620000000 1024
时间序列 指标名称 + 标签集合 → 一组有序样本 http_requests_total{method="GET",status="200"}
关键原则:标签是 Prometheus 多维数据模型的灵魂。在 IDP 灰度发布中,我们常通过 version、canary、namespace 等标签区分不同发布批次。
Prometheus 时间序列数据模型 指标名称 http_requests_total 标签集合 {method="GET", status="200"} 样本 @T1 1024, @T2 1050 时间序列(唯一标识) 数据模型核心等式 时间序列 = 指标名称 + 标签集合 → 有序样本流

3.2 PromQL 基础

PromQL(Prometheus Query Language)是 Prometheus 内置的函数式查询语言,支持即时查询和范围查询两种模式。

3.2.1 查询类型

  • 即时向量:返回查询时间戳下所有匹配时间序列的最新样本值。
  • 范围向量:返回指定时间范围内每个时间序列的一组样本值。
  • 标量:单一的浮点数值。
  • 字符串:目前暂未使用。

3.2.2 常用选择器

语法 含义 示例
metric_name 精确匹配指标名称 http_requests_total
{label="value"} 标签精确匹配 {method="GET"}
metric_name[5m] 范围向量,取过去 5 分钟数据 http_requests_total[5m]
rate(metric[1m]) 计算每秒平均增长率 rate(http_requests_total[1m])
灰度发布常用 PromQL 模式:
rate(http_requests_total{version="v2", namespace="production"}[5m]) — 查询生产环境 v2 版本的请求速率。

3.3 关键指标类型

Prometheus 客户端库提供四种核心指标类型,每种类型对应不同的监控场景和计算方式。

类型 行为特征 典型场景 常用 PromQL 函数
Counter 只增不减,重启归零 请求总数、错误计数 rate(), increase()
Gauge 可增可减,反映当前状态 CPU 使用率、内存占用、连接数 avg(), max(), min()
Histogram 分桶计数,可计算分位数 请求延迟分布、响应大小分布 histogram_quantile()
Summary 客户端预计算分位数 SLI 延迟监控、SLO 合规检查 直接读取 quantile 标签

3.3.1 Counter — 只增不减的计数器

Counter 适用于累计型指标,如 HTTP 请求总数、错误次数。由于 Counter 会随进程重启归零,查询时通常配合 rate() 或 increase() 使用。

# 查询过去 5 分钟每秒请求增长率
rate(http_requests_total{status="500"}[5m])

# 查询过去 1 小时错误总数增量
increase(http_requests_total{status="500"}[1h])

3.3.2 Gauge — 可上可下的仪表盘

Gauge 反映当前瞬时值,适合监控内存使用率、CPU 负载、活跃连接数等。Gauge 可以直接做算术运算和聚合。

# 查询当前内存使用率超过 90% 的节点
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.1

# 查询最大 CPU 使用率
max(cpu_usage_percent{instance=~"web.*"})

3.3.3 Histogram — 分桶分布与分位数计算

Histogram 将观测值分配到预定义的桶(bucket)中,同时记录总和与计数。通过 histogram_quantile() 函数可以计算任意分位数。

# 计算过去 5 分钟请求延迟的 P99 分位数
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
注意:Histogram 的分位数精度取决于桶的划分粒度。桶越细,精度越高,但存储开销也越大。在 IDP 灰度准入检查中,建议使用 Histogram 监控新版本的延迟分布。

3.3.4 Summary — 客户端预计算分位数

Summary 在客户端直接计算并暴露分位数(如 P50、P90、P99),无需服务端计算。适合对延迟敏感且需要固定分位数的场景。

# 直接读取 Summary 暴露的 P99 延迟
rpc_duration_seconds{quantile="0.99"}
对比维度 Histogram Summary
分位数计算位置 服务端(Prometheus) 客户端(应用内)
分位数可调整 是,查询时指定 否,需客户端预定义
聚合能力 支持跨实例聚合 不支持聚合
存储开销 较高(桶数量多) 较低(仅暴露分位数)
适用场景 需要灵活分位数、跨服务聚合 已知固定分位数、低延迟要求
四种 Prometheus 指标类型对比 Counter 只增不减 rate() / increase() Gauge 可增可减 avg() / max() / min() Histogram 分桶计数 histogram_quantile() Summary 预计算分位数 直接读取 quantile 灰度发布准入检查中的应用 Counter → 错误率 | Gauge → 资源水位 | Histogram/Summary → 延迟 SLO 选择原则:需要聚合分位数用 Histogram,固定分位数用 Summary

3.4 灰度发布中的指标选择策略

在 IDP 自助门户的灰度发布准入检查中,不同指标类型承担不同角色:

  • Counter:监控新版本的 HTTP 5xx 错误率、业务失败次数。
  • Gauge:监控新版本 Pod 的 CPU/内存使用率、活跃连接数。
  • Histogram:监控新版本请求延迟分布,计算 P99/P95 是否超出基线。
  • Summary:用于已经定义好 SLO 阈值的延迟指标,直接读取分位数。
最佳实践:在灰度发布准入检查的 PromQL 表达式中,始终使用 rate() 包裹 Counter 类型指标,避免因重启或缩放导致误判。对于 Histogram,务必指定合理的时间窗口(通常 5m-10m)以平滑毛刺。