2. Prometheus 基础回顾:数据模型与 PromQL 聚合算子
在构建容量水位巡检方案之前,必须牢固掌握 Prometheus 的核心数据模型与查询语言。本章将拆解 Metric、Label、Sample 三大要素,并梳理 PromQL 基础语法与聚合算子,为后续告警规则编写与容量趋势分析奠定基础。
2.1 数据模型:Metric、Label、Sample
Prometheus 存储的所有时间序列数据由三个核心概念组成:指标名(Metric)、标签(Label) 和 样本值(Sample)。三者共同构成一条完整的时间序列。
| 概念 | 说明 | 示例 |
|---|---|---|
| Metric | 被监控对象的量化指标名称,描述“测量什么”。 | node_cpu_seconds_total |
| Label | 键值对,用于区分同一指标的不同维度(实例、设备、环境等)。 | instance="192.168.1.1:9100", mode="idle" |
| Sample | 时间戳 + 浮点数值,构成一个数据点。 | @1710000000 12345.67 |
关键理解: 一条时间序列由
metric_name + {label_key="label_value", ...} 唯一标识。例如 node_cpu_seconds_total{instance="node1", mode="idle"} 与 node_cpu_seconds_total{instance="node1", mode="system"} 是两条不同的序列。
下图展示了从数据采集到时间序列存储的完整链路:
2.2 PromQL 基础语法
PromQL(Prometheus Query Language)是 Prometheus 内置的函数式查询语言。以下是最常用的基础语法元素:
- 即时向量选择器:直接查询当前最新样本值,如
node_memory_MemTotal_bytes。 - 范围向量选择器:查询过去一段时间内的样本序列,如
node_memory_MemTotal_bytes[5m]。 - 标签匹配器:
=(精确匹配)、!=(不匹配)、=~(正则匹配)、!~(正则不匹配)。 - 偏移修饰符:
offset 1d查询一天前的数据,用于同比分析。
容量巡检常用查询示例:
# 查询当前节点内存使用率(即时向量)
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# 查询过去 1 小时 CPU 空闲率(范围向量 + 聚合)
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
# 同比昨日同一时刻的内存使用量(偏移修饰符)
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes offset 1d
2.3 聚合算子与容量水位计算
聚合算子用于将多条时间序列合并为一条,是容量巡检中计算集群总量、均值、百分位数的核心工具。下表列出最常用的聚合算子及其适用场景:
| 算子 | 作用 | 容量巡检典型用法 |
|---|---|---|
sum |
求和 | 计算集群总 CPU 核数、总内存量 |
avg |
平均值 | 计算集群平均 CPU 使用率、平均延迟 |
max / min |
最大值 / 最小值 | 找出集群中水位最高的节点(热点检测) |
quantile |
分位数 | 计算 P95/P99 响应时间,评估容量余量 |
count |
计数 | 统计在线节点数量,判断缩容/扩容规模 |
topk / bottomk |
取前 K 个 / 后 K 个 | 定位水位最高的 Top 5 节点 |
聚合算子通常与 by 或 without 子句配合使用,以控制分组维度:
# 按 instance 分组求平均 CPU 使用率(每个节点一条结果)
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
# 不按 mode 维度聚合,求所有 CPU 模式的总使用率
sum without (mode) (rate(node_cpu_seconds_total[5m])) * 100
⚠️ 常见陷阱: 在容量巡检中,
sum by (instance) 与 sum without (cpu) 的结果可能完全不同。务必明确你希望保留哪些标签维度,避免因标签爆炸导致聚合结果偏离预期。
下图展示了从原始指标到容量水位指标的典型聚合流程:
2.4 本章小结
- 数据模型:Metric 定义测量对象,Label 提供多维度区分,Sample 记录时间戳与数值。
- PromQL 基础:即时向量与范围向量是查询的两种基本形态,标签匹配器与偏移修饰符提供灵活筛选。
- 聚合算子:
sum、avg、max、quantile等是容量水位计算的核心工具,配合by/without控制分组维度。