实践背景
Prometheus 预聚合可以将频繁使用的、计算成本高昂的查询结果,提前计算好并保存为新的时间序列。当用户需要对复杂的聚合语句进行查询时,可以直接读取这个聚合后的指标数据,从而避免每次查询都进行原始数据的重复扫描和计算。
实践案例
某用户在进行业务迁移至腾讯云的过程中,需依托监控指标支持业务压测评估。但在使用 Grafana 查看监控面板过程中,反馈出现查询缓慢的问题。经协同排查,通过 Prometheus 预聚合能力有效优化了查询性能,提升用户体验。
用户有一个包含200个节点的 Kubernetes 集群,需要监控每个节点的 CPU 使用率,用户配置的原始查询语句如下:
sum(rate(node_cpu_seconds_total{cluster="$cluster",mode!="idle"}[1m])) by (cluster)
随着集群规模扩大,该查询出现了查询延迟高、Grafana 仪表盘加载慢的问题,尤其在查询时间范围扩大至24小时后,Grafana 仪表盘无法正常展示监控数据。
原查询计算过程分析
1. 原始数据获取:扫描所有满足
mode!="idle"
的 node_cpu_seconds_total 时间序列,每次查询需加载1分钟的高基数原始数据。2. 实时计算:对每一时间序列实时计算 rate()(每秒增长率),并按 cluster 分组聚合(sum)。
该查询存在以下明显瓶颈:
计算开销高 :每次查询均需扫描原始数据并实时计算 rate()。
内存占用大 :需在内存中处理大量时间序列点,节点数量增多时尤为显著。
查询延迟显著 :数据量增大导致响应变慢。
存储 I/O 压力大 :频繁读取原始数据,影响其他查询操作。
预聚合方案设计
rules:- record: cluster:node_cpu_util:sumexpr: sum (1 - rate(node_cpu_seconds_total{mode="idle"}[1m])) by(cluster)
启用以上预聚合规则后,Prometheus 将定时执行预聚合规则,并将计算结果存储为新指标 cluster:node_cpu_util:sum,用户可直接使用以下简单语句进行查询:
cluster:node_cpu_util:sum{cluster="$cluster"}
对于 node_cpu_seconds_total 指标,mode 包含8个不同的维度,原始查询语句中的 mode != "idle" 需要把其它的维度的时间序列都查询出来进行计算,而预聚合规则中的 1 - {mode="idle"} 只需要查询包含这个标签的时间序列,在预聚合计算时的计算量也将大幅减少,同时也建议用户精简采集指标,减少不必要的指标数据在查询计算中的消耗。
性能对比
原始查询语句和通过预聚合规则查询的性能对比如下:
对比项 | 原始查询 | 预聚合查询 |
单次查询计算量 | 实时计算所有节点 CPU rate + 聚合 | 直接读取预聚合结果 |
查询延迟 | 依赖集群规模 | 恒定低延迟 |
内存占用 | 需加载所有节点1分钟原始数据 | 仅加载1个聚合值 |
存储 IO | 高频读取原始数据 | 仅读取预聚合结果 |
CPU 消耗 | 每次查询需完整计算 | 仅需1分钟1次计算 |
适用场景 | 临时排查/小规模集群 | 仪表盘/告警/大规模集群 |
查询面板配置建议
Prometheus 更适合短期、高频的指标查询(15 – 90 天)。若涉及高阶复杂分析,建议结合专门的数据分析/OLAP 系统。对于简单的长期趋势、同比环比报表,需避免直接堆叠原始指标,以减少查询成本和数据噪声。
面板设计
业务视角优先:按业务目标(如请求成功率、延迟、转化率)组织指标,而非以技术组件为单位。
总览 vs 细节:设置“总览面板”提供核心指标(2 – 3 个比率/趋势曲线),而“细节面板”用于下钻分析,避免使用复杂的变量。
减少噪音:避免在单个面板上堆砌大量相似曲线,突出核心指标的对比和趋势。
查询加速
聚合前移,分层聚合:先把离散维度(如 cluster、region)合并成更有业务意义的指标;查询时再逐级下钻,而不是在面板端动态拼装复杂聚合。
统一口径,核心指标优先:统一报表口径,优先使用“总量、比率、分位数”类指标,而非长时间原始计数曲线。同比/环比提供直观的性能和质量变化,避免依赖二次解读。
用少量清晰的组合性指标替代原始数据海洋;通过预聚合、统一口径和分层面板设计,保证长期趋势和同比/环比分析既直观又高效。
总结
对于监控仪表盘(Grafana 等需要高频刷新)、告警规则(需快速检测阈值)、超大规模集群(节点 > 50)和长期使用的核心指标,推荐用户提前配置预聚合规则,通过使用预聚合指标来提升查询性能,降低资源消耗,有效保障监控系统的稳定性和用户体验。