2、核心概念:PromQL基础、指标类型及在资源监控中的应用
在基于 Prometheus 指标进行集群升级窗口资源预测之前,必须牢固掌握 PromQL(Prometheus Query Language)的基础语法与 Prometheus 的四种核心指标类型。这些概念是构建预测模型、分析资源趋势的“语言”与“原材料”。
2.1 PromQL 基础:查询与聚合
PromQL 是一种函数式查询语言,用于实时聚合与计算时间序列数据。其核心操作分为即时查询与范围查询。
- 即时向量(Instant Vector):返回一组时间序列在当前时间戳的最新样本值。例如:
node_memory_MemAvailable_bytes返回所有节点的当前可用内存。 - 范围向量(Range Vector):返回一组时间序列在过去一段时间窗口内的样本值。通过在指标名后附加
[5m]指定窗口。例如:node_cpu_seconds_total[5m]返回过去5分钟内的CPU使用数据。
关键区别: 即时向量用于“当前值”判断(如当前内存是否充足);范围向量用于“趋势计算”(如过去1小时CPU平均负载),是资源预测的基础。
常用 PromQL 函数与操作符
| 类别 | 函数/操作符 | 示例 | 说明 |
|---|---|---|---|
| 速率计算 | rate() |
rate(node_cpu_seconds_total[5m]) |
计算Counter类型指标在窗口内的每秒平均增长率,消除采样抖动。 |
| 聚合操作 | sum() / avg() |
sum(rate(node_cpu_seconds_total[5m])) |
按维度(如实例、CPU核心)汇总或平均,得到集群整体CPU使用率。 |
| 分组聚合 | by |
sum(rate(node_cpu_seconds_total[5m])) by (instance) |
按指定标签(如节点名)分组聚合,查看每个节点的CPU使用率。 |
| 预测函数 | predict_linear() |
predict_linear(node_memory_MemAvailable_bytes[1h], 3600) |
基于线性回归预测未来1小时(3600秒)的可用内存值,是资源预测的核心函数。 |
实战建议: 在升级窗口预测中,
rate() 用于计算CPU/网络流量趋势,predict_linear() 用于预测内存/磁盘耗尽时间点。务必使用范围向量作为输入。
2.2 指标类型:Counter、Gauge、Histogram、Summary
Prometheus 客户端库提供四种核心指标类型,每种类型在资源监控中有不同的语义与适用场景。理解其差异是正确编写 PromQL 的前提。
| 指标类型 | 值特征 | 典型场景 | PromQL 处理方式 |
|---|---|---|---|
| Counter | 只增不减(重启时重置为0) | 请求总数、CPU总时间、网络字节数 | 必须使用 rate() 或 increase() 计算速率 |
| Gauge | 可增可减,反映当前状态 | 内存使用量、CPU使用率、磁盘剩余空间 | 直接使用原始值,或使用 avg() / max() 聚合 |
| Histogram | 分桶计数,可计算分位数 | 请求延迟分布、响应大小分布 | 使用 histogram_quantile() 计算P50/P95/P99 |
| Summary | 客户端预计算分位数,不可聚合 | 延迟SLO监控(已预计算分位数) | 直接查询 quantile 标签,但无法跨实例聚合 |
常见错误: 对 Counter 类型直接使用
avg() 或 max() 会得到无意义的累计值。必须先用 rate() 转换为每秒速率后再聚合。例如:avg(rate(node_cpu_seconds_total[5m])) 才是正确的CPU使用率。
2.3 在资源监控中的应用
在集群升级窗口资源预测中,四种指标类型各有分工,共同构成预测数据源。
- Counter → 流量与负载趋势:使用
rate(node_network_receive_bytes_total[5m])计算网络流量速率,判断升级期间是否会出现带宽瓶颈。 - Gauge → 资源水位:直接使用
node_memory_MemAvailable_bytes或node_filesystem_avail_bytes判断当前资源余量,作为预测的基线。 - Histogram → 服务质量:使用
histogram_quantile(0.95, rate(etcd_request_duration_seconds_bucket[5m]))计算P95延迟,确保升级不会导致服务降级。 - Summary → 预计算SLO:直接查询
etcd_request_duration_seconds{quantile="0.99"}验证是否满足SLO,但注意无法跨节点聚合。
2.4 实战:编写第一个资源预测 PromQL
结合上述概念,我们编写一个用于升级窗口的节点内存耗尽预测查询。该查询将 Gauge 类型指标与 predict_linear() 函数结合,预测未来2小时内可用内存是否会低于阈值。
# 预测节点可用内存(单位:字节),基于过去1小时数据,预测未来2小时(7200秒)
predict_linear(
node_memory_MemAvailable_bytes[1h], # Gauge类型,范围向量
7200 # 预测未来7200秒
) < 1e9 # 阈值:低于1GB视为风险
查询解读: 该查询返回所有可用内存预测值低于1GB的节点。在升级窗口规划中,可将这些节点标记为“高风险”,优先扩容或延迟升级。
2.5 避坑指南:指标类型误用
| 错误用法 | 后果 | 正确做法 |
|---|---|---|
对 Counter 直接使用 avg() |
得到无意义的累计平均值,无法反映速率 | 先 rate() 再 avg() |
对 Histogram 直接使用 avg() |
忽略分桶分布,无法计算分位数 | 使用 histogram_quantile() |
| 跨实例聚合 Summary | 预计算分位数不可聚合,结果错误 | 使用 Histogram 替代,或按实例单独查询 |
对 Gauge 使用 rate() |
产生无意义的负值或零值 | 直接使用原始值或 avg() |
记忆口诀: Counter 看速率,Gauge 看水位,Histogram 看分布,Summary 看预算。在升级窗口预测中,Gauge 用于资源余量,Counter 用于流量趋势,Histogram 用于服务质量。