You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:32:22