如何找出Prometheus中缺失tenant_id标签的com_name应用?
正确查询缺失tenant_id标签的com_name应用方法
错误查询的问题分析
- 第一个查询
group ({com_name=~"id-pro-.+", tenant_id=""}) by (com_name):这个语句是匹配tenant_id标签值为空字符串的指标,而非缺失tenant_id标签的指标,所以会返回那些有tenant_id但值为空的应用,和你要找的“缺失标签”需求不符。 - 第二个查询
node_load1{com_name="id-pro-.+", not_existent_label="tenant_id"}:语法错误,PromQL没有这种判断标签不存在的写法,因此返回空集。
正确的查询方法
方法1:使用unless运算符对比集合
通过对比所有符合com_name规则的应用,减去带有tenant_id标签的应用,剩下的就是缺失标签的目标:
count by (com_name) ({com_name=~"id-pro-.+"}) unless count by (com_name) ({com_name=~"id-pro-.+", tenant_id=~".+"})
解释:
- 前半部分统计所有符合
id-pro-.+规则的com_name应用; - 后半部分统计带有tenant_id标签(值不为空)的同规则应用;
unless运算符会返回前半部分存在但后半部分不存在的com_name,也就是缺失tenant_id标签的应用。
方法2:使用label_exists函数(Prometheus 2.27+版本支持)
如果你的Prometheus版本在2.27及以上,可以直接用label_exists的否定形式筛选:
count by (com_name) ({com_name=~"id-pro-.+", !label_exists(tenant_id)})
解释:!label_exists(tenant_id)直接匹配不存在tenant_id标签的指标,再按com_name分组统计即可。
内容的提问来源于stack exchange,提问作者MortenB
相关产品推荐
相关产品推荐

