如何根据$group变量实现PromQL的多条件标签匹配?
解决方案
方法1:正则匹配 + 变量值映射(推荐)
如果是在Grafana或支持自定义变量值的环境中,直接修改$group变量的选项配置:
- 选项1:显示名称
monitoring,对应值^monitoring$ - 选项2:显示名称
web,对应值^$ - 选项3:显示名称
all,对应值^(monitoring|)$
然后将原查询修改为:
sum by (name) ( rate( container_cpu_usage_seconds_total{ image!="", container_label_org_label_schema_group=~"$group" }[1m] ) ) / scalar(count(node_cpu_seconds_total{mode="$mode"})) * 100
这种方式直接用正则覆盖所有场景:
- 选
monitoring时,仅匹配标签值为monitoring的容器 - 选
web时,仅匹配标签值为空的容器 - 选
all时,匹配标签值为monitoring或空的容器
方法2:纯PromQL逻辑组合(无需修改变量配置)
如果无法修改变量默认值,只能用原变量值(monitoring/web/all),可以通过逻辑或组合多个条件:
sum by (name) ( rate( container_cpu_usage_seconds_total{ image!="", # 匹配monitoring场景 (container_label_org_label_schema_group == "$group" and "$group" != "web" and "$group" != "all") # 匹配web场景 or (container_label_org_label_schema_group == "" and "$group" == "web") # 匹配all场景 or (container_label_org_label_schema_group =~ "monitoring|^$" and "$group" == "all") }[1m] ) ) / scalar(count(node_cpu_seconds_total{mode="$mode"})) * 100
变量替换后,仅对应场景的条件会生效:
$group=monitoring时,第一个分支生效,精确匹配monitoring标签$group=web时,第二个分支生效,匹配空标签容器$group=all时,第三个分支生效,同时匹配monitoring和空标签容器
方法3:Grafana模板语法动态生成规则
如果使用Grafana,可利用模板语法根据变量值动态生成匹配条件:
sum by (name) ( rate( container_cpu_usage_seconds_total{ image!="", container_label_org_label_schema_group=~"{{ if eq $group \"web\" }}^${{ else if eq $group \"all\" }}monitoring|^${{ else }}$group{{ end }}" }[1m] ) ) / scalar(count(node_cpu_seconds_total{mode="$mode"})) * 100
模板会自动生成对应正则:
$group=web→ 生成^$(匹配空标签)$group=all→ 生成monitoring|^$(匹配两种标签)$group=monitoring→ 生成monitoring(精确匹配)
内容的提问来源于stack exchange,提问作者mike01010
相关产品推荐
相关产品推荐

