PromQL 查询中如何按标签分组聚合?

PromQL 用 by 子句按标签分组聚合:sum by (status) (http_requests_total)。本文讲解 by/without 的用法、多标签分组、常见聚合函数搭配,以及分组后的高基数注意事项。

最佳实践
PromQL 查询中如何按标签分组聚合?封面

用 by 子句:sum(http_requests_total) by (status)——把指标按 status 标签的每个取值聚成一条线;反向操作用 without,保留除列出标签与指标名以外的其他标签。

基本语法

# 按状态码分组统计 QPS
sum(rate(http_requests_total[5m])) by (status)

# 按多个标签分组
sum(rate(http_requests_total[5m])) by (status, method)

# without:去掉 instance 维度,其余标签保留
sum(rate(http_requests_total[5m])) without (instance)

常用聚合函数搭配

  • sum by (...):总量分布,如各状态码的请求量;
  • avg by (...):序列样本等权平均;请求平均延迟应按总耗时/请求数加权,不能直接平均各实例的均值;
  • max by (...) / min by (...):极值监控;
  • count by (...):统计每个标签值下有多少条序列,仅在每实例对应一条所选序列时才等于实例数;
  • topk(3, ...):取最高的 3 条,看"最忙的接口"。

注意事项

  1. rate 要放在 sum 里面:sum(rate(x[5m])),先算每条序列的速率再聚合,顺序反了结果是错的;
  2. 分组的标签越多线条越多:按 user_id 这类高基数标签分组会产生上万条序列,查询慢且图表不可读——不存在几十个取值的固定安全阈值,应按标签组合数、保留期与查询负载评估;
  3. by 里没有的标签会被丢弃,聚合结果只保留 by 列出的标签。

常见问题(FAQ)

Q:by 和 without 能一起用吗? 不能,一个聚合表达式里二选一。

Q:分组后标签值太多图上看不清? 用 topk 选每个求值时刻的头部;Range 查询入选成员可变化,整张图可能超过 k 条,或先在采集侧精简标签。

Q:能按标签值的正则分组吗? 先用 label_replace() 把正则提取的片段写成新标签,再按新标签 by。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台