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

如何在Prometheus中关联指标:匹配逗号分隔标签内的取值

问题:Grafana关联Prometheus指标,筛选模块依赖的服务状态

背景指标说明

  • 模块状态指标 module_status:
    查询特定模块的语句:
    module_status{module_name="MODULE1"}
    
    瞬时结果示例:
    module_status{dependencies="SERVICE_1,SERVICE_4,SERVICE_5", module_name="MODULE1"} 4
    
    (值4代表状态为OK)
  • 服务状态指标 service_status:
    瞬时结果示例:
    service_status{service_name="SERVICE_1"} 4
    service_status{service_name="SERVICE_2"} 4
    service_status{service_name="SERVICE_3"} 4
    service_status{service_name="SERVICE_4"} 4
    service_status{service_name="SERVICE_5"} 4
    

需求

只展示service_status里,service_name出现在对应module_status的dependencies标签中的数据。

已尝试操作

  • 创建变量module_name,查询语句:label_values(module_status, module_name),用来获取所有模块名;
  • 创建变量module_services,查询语句:label_values(module_status{module_name="$module_name"}, dependencies),但这个变量返回的是单行CSV值(比如SERVICE_1,SERVICE_4,SERVICE_5),没法拆成单独的选项。

解决方案

方法1:直接用PromQL筛选(不用拆分变量)

在面板的查询框里直接用这段PromQL就行,不用单独做module_services变量:

service_status{service_name=~replace(label_values(module_status{module_name="$module_name"}, dependencies)[0], ",", "|")}

逻辑:

  1. label_values(...)先拿到目标模块的dependencies字符串;
  2. replace(..., ",", "|")把逗号分隔的服务名换成正则的或符号|;
  3. =~用正则匹配service_name,只留下符合条件的服务状态。

方法2:把变量拆成单独选项(适合需要下拉选单个服务的场景)

如果需要把依赖服务拆成变量的单独选项,按下面步骤操作:

  1. 编辑module_services变量,找到查询选项里的Regex字段;
  2. 变量的Query字段保留:
    label_values(module_status{module_name="$module_name"}, dependencies)
    
  3. 在Regex字段填入:/(.*?)(?:,|$)/g;要是你的Grafana版本支持,也可以在Format下拉里选“CSV to values”;
  4. 保存变量后,module_services就会拆成SERVICE_1、SERVICE_4、SERVICE_5这些单独选项,之后面板查询直接用service_status{service_name=~"$module_services"}就行。

内容的提问来源于stack exchange,提问作者Vico Tornan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:15:27