配置硬件监控仪表盘时,PromQL查询使用without(cpu)子句报错的问题求助
解决PromQL中添加
without(cpu)子句的语法报错问题 我来帮你梳理下这个PromQL的语法问题——你遇到的报错都是因为without子句的位置不符合PromQL的语法规则,咱们一步步拆解:
错误写法分析
写法1的问题
你写的查询:
avg without(cpu) irate(node_cpu_seconds_total {instance="nodeexp:9100", job="nodeexp", mode!="idle"} [1m])
报错提示unexpected identifier "irate" in aggregation,原因是without(cpu)作为聚合函数avg的标签过滤选项,后面必须用括号包裹要聚合的指标表达式。你直接把irate(...)跟在后面,PromQL解析器无法识别这是聚合函数的参数。
写法2的问题
你写的查询:
avg(without(cpu) irate(node_cpu_seconds_total {instance="nodeexp:9100", job="nodeexp", mode!="idle"} [1m]))
报错提示unexpected "(" in aggregation,因为without是聚合函数的修饰选项,不能放在聚合函数的括号内部,它应该和聚合函数名绑定,要么在括号前,要么在整个聚合表达式的末尾。
正确的两种写法
PromQL的聚合函数支持两种合法的without子句写法,你可以任选其一:
写法A:without放在聚合函数名后,括号包裹指标表达式
avg without(cpu) (irate(node_cpu_seconds_total {instance="nodeexp:9100", job="nodeexp", mode!="idle"} [1m]))
写法B:without放在聚合函数整体表达式的末尾
avg(irate(node_cpu_seconds_total {instance="nodeexp:9100", job="nodeexp", mode!="idle"} [1m])) without(cpu)
语法规则补充
PromQL聚合函数的标签过滤(without/by)语法规则是:
- 格式1:
聚合函数 without(排除标签列表) (要聚合的指标表达式) - 格式2:
聚合函数(要聚合的指标表达式) without(排除标签列表)
两种格式完全等价,都是先计算括号内的指标表达式(这里是irate计算的CPU使用率瞬时增长率),再对结果进行聚合,同时排除指定的标签(这里是cpu标签),最终得到去掉cpu维度后的平均CPU使用率。
内容的提问来源于stack exchange,提问作者Michael Binegar
相关产品推荐
相关产品推荐

