如何动态过滤PromQL中与另一指标标签值重复的时间序列?
如何动态过滤PromQL中与另一指标标签值重复的时间序列?
这个问题我之前也碰到过,手动写正则匹配几百个动态变化的标签值完全不现实,其实用PromQL的label_replace配合unless就能完美解决动态过滤的需求,具体操作如下:
核心思路
因为你的两个指标标签名不同(label1 vs label2),直接用unless无法匹配标签值,所以第一步需要把其中一个指标的标签名改成和另一个一致,让它们拥有可匹配的共同标签,再用unless排除重复的序列。
具体查询语句
metric1 unless label_replace(metric2, "label1", "$1", "label2", "(.*)")
语句解析
label_replace(metric2, "label1", "$1", "label2", "(.*)"):这个函数的作用是把metric2中label2的所有值,提取出来赋值给新的标签label1。简单说就是给metric2“改个标签名”,让它和metric1的标签名统一成label1。unless:这个运算符会保留metric1中所有不存在于后面指标(重命名后的metric2)中的时间序列,也就是自动过滤掉label1值和metric2的label2值重复的那些序列。
进阶优化(限定匹配标签)
如果你的指标还有其他额外标签,只想基于label1/label2的值进行匹配过滤,可以加上on(label1)来限定只对比这个标签:
metric1 unless on(label1) label_replace(metric2, "label1", "$1", "label2", "(.*)")
这样不管其他标签是什么,只要label1的值在metric2的label2中出现过,就会被从metric1中排除,完全实现动态过滤的效果,不用再手动维护正则表达式啦。
备注:内容来源于stack exchange,提问作者Michal Lis
相关产品推荐
相关产品推荐

