Prometheus中标签不匹配的指标间除法查询实现问题
Prometheus中标签不匹配的指标间除法查询实现问题
当然可以实现啦!你遇到的是Prometheus里常见的「标签名不匹配时的关联计算」问题,咱们直接说解决方案:
核心思路是用PromQL的label_replace函数,把其中一个指标的标签名改成和另一个一致,这样两个指标就能基于相同标签名的对应值做匹配除法了。
具体实现方法
你有两种选择,任选其一就行:
- 方案一:修改左边指标的标签名
把nodes_threadpool_rejected的nodename标签替换成node,让它和右边指标的标签名统一,再做除法:label_replace(nodes_threadpool_rejected, "node", "$nodename", "nodename", ".*") / nodes_indices_index_total - 方案二:修改右边指标的标签名
反过来,把nodes_indices_index_total的node标签替换成nodename,再和左边指标计算:nodes_threadpool_rejected / label_replace(nodes_indices_index_total, "nodename", "$node", "node", ".*")
原理说明
label_replace的作用是给指标添加/替换标签,格式是label_replace(指标, "新标签名", "替换后的标签值", "原标签名", "匹配正则")。这里我们用.*作为正则,意思是完全匹配原标签的所有值,直接把原标签值复制到新标签里。
这样处理后,Prometheus会自动匹配两个指标中所有标签值一致的条目(包括你替换后的标签,以及原本就一致的cluster_type、job等标签),只对匹配成功的条目执行除法计算,完全符合你要的「nodename和node值匹配时才计算」的需求。
额外补充(如果标签值有差异的情况)
看你给出的示例里,右边指标的node值是1.2.3.4-os,左边是1.2.3.4-es,如果这不是笔误,而是实际值有后缀差异,那可以调整正则来提取相同部分。比如要去掉-es和-os后缀,只匹配前面的IP部分:
label_replace(nodes_threadpool_rejected, "node", "$1", "nodename", "(.*)-es") / label_replace(nodes_indices_index_total, "node", "$1", "node", "(.*)-os")
这样就能让1.2.3.4-es和1.2.3.4-os基于前面的1.2.3.4匹配计算了。
备注:内容来源于stack exchange,提问作者Sandeep Lade
相关产品推荐
相关产品推荐

