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"} 是两条不同的序列。

下图展示了从数据采集到时间序列存储的完整链路:

Prometheus 数据模型结构图 Prometheus 数据模型:Metric → Label → Sample Metric node_cpu_seconds_total Label Set instance="node1" mode="idle" Sample T=1710000000, V=12345.67 📌 时间序列唯一标识 node_cpu_seconds_total{instance="node1", mode="idle"} → 唯一的时间序列 改变任意 Label 值(如 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) 的结果可能完全不同。务必明确你希望保留哪些标签维度,避免因标签爆炸导致聚合结果偏离预期。

下图展示了从原始指标到容量水位指标的典型聚合流程:

PromQL 聚合算子流程图 PromQL 聚合流程:原始指标 → 容量水位指标 原始指标 node_cpu_seconds_total rate() 函数 rate(metric[5m]) → 每秒增长率 聚合算子 avg by (instance) sum without (mode) 容量水位指标(输出) avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 → 节点 CPU 空闲率

2.4 本章小结

  • 数据模型:Metric 定义测量对象,Label 提供多维度区分,Sample 记录时间戳与数值。
  • PromQL 基础:即时向量与范围向量是查询的两种基本形态,标签匹配器与偏移修饰符提供灵活筛选。
  • 聚合算子:sum、avg、max、quantile 等是容量水位计算的核心工具,配合 by/without 控制分组维度。