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 等标签区分不同发布批次。
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) | 客户端(应用内) |
| 分位数可调整 | 是,查询时指定 | 否,需客户端预定义 |
| 聚合能力 | 支持跨实例聚合 | 不支持聚合 |
| 存储开销 | 较高(桶数量多) | 较低(仅暴露分位数) |
| 适用场景 | 需要灵活分位数、跨服务聚合 | 已知固定分位数、低延迟要求 |
3.4 灰度发布中的指标选择策略
在 IDP 自助门户的灰度发布准入检查中,不同指标类型承担不同角色:
- Counter:监控新版本的 HTTP 5xx 错误率、业务失败次数。
- Gauge:监控新版本 Pod 的 CPU/内存使用率、活跃连接数。
- Histogram:监控新版本请求延迟分布,计算 P99/P95 是否超出基线。
- Summary:用于已经定义好 SLO 阈值的延迟指标,直接读取分位数。
最佳实践:在灰度发布准入检查的 PromQL 表达式中,始终使用
rate() 包裹 Counter 类型指标,避免因重启或缩放导致误判。对于 Histogram,务必指定合理的时间窗口(通常 5m-10m)以平滑毛刺。