含sum by(status)的Prometheus组合查询无结果问题排查
问题分析与排查思路
你的问题核心是**on(status)操作符的使用场景错误**,导致两个查询结果无法匹配,进而返回空数据。以下是具体排查和修正步骤:
1. 先明确两个单独查询的返回结构
分别执行以下两个查询,查看返回的样本标签:
- 第一个查询结果:
返回的样本标签为sum by(status) (increase(number_of_tasks_total{queue=~"$queuename", kubernetes_namespace=~"$namespace", status="unique"}[1h]))status="unique",对应一个数值。 - 第二个查询结果:
返回的样本标签为sum by(status) (increase(number_of_tasks_total{queue=~"$queuename", kubernetes_namespace=~"$namespace", status="enqueued"}[1h]))status="enqueued",对应一个数值。
这两个样本的status标签值完全不同,而on(status)操作符的作用是仅匹配两边status标签值相同的样本进行运算——显然这里没有符合条件的匹配对,所以减法运算返回空。
2. 修正查询的正确写法
你的需求是计算unique状态任务增量与enqueued状态任务增量的差值,不需要使用on(status),直接将两个聚合结果相减即可:
sum by(status) (increase(number_of_tasks_total{queue=~"$queuename", kubernetes_namespace=~"$namespace", status="unique"}[1h])) - sum by(status) (increase(number_of_tasks_total{queue=~"$queuename", kubernetes_namespace=~"$namespace", status="enqueued"}[1h]))
或者更简洁(因为每个查询已经过滤了单个status,sum后无需保留status标签的话):
sum(increase(number_of_tasks_total{queue=~"$queuename", kubernetes_namespace=~"$namespace", status="unique"}[1h])) - sum(increase(number_of_tasks_total{queue=~"$queuename", kubernetes_namespace=~"$namespace", status="enqueued"}[1h]))
3. 关于你的疑问解答
- 为何
sum by(status)后标签不匹配?:不是标签不匹配,是标签值完全不同,on(status)要求的是相同标签值的样本匹配,而非仅存在status标签。 - Prometheus是否有隐藏标签或隐式行为?:没有隐藏标签,
sum by(status)会严格只保留status标签;increase函数仅计算增量,不会修改或添加标签,完全保留原始序列的标签(除聚合操作修改的部分)。 increase函数是否影响标签?:不会,increase属于瞬时向量函数,仅修改样本值,不改变标签集合。
内容的提问来源于stack exchange,提问作者Vassili Gorshkov
相关产品推荐
相关产品推荐

