如何在Prometheus中关联指标:匹配逗号分隔标签内的取值
问题:Grafana关联Prometheus指标,筛选模块依赖的服务状态
背景指标说明
- 模块状态指标
module_status:
查询特定模块的语句:
瞬时结果示例:module_status{module_name="MODULE1"}
(值4代表状态为OK)module_status{dependencies="SERVICE_1,SERVICE_4,SERVICE_5", module_name="MODULE1"} 4 - 服务状态指标
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], ",", "|")}
逻辑:
label_values(...)先拿到目标模块的dependencies字符串;replace(..., ",", "|")把逗号分隔的服务名换成正则的或符号|;=~用正则匹配service_name,只留下符合条件的服务状态。
方法2:把变量拆成单独选项(适合需要下拉选单个服务的场景)
如果需要把依赖服务拆成变量的单独选项,按下面步骤操作:
- 编辑
module_services变量,找到查询选项里的Regex字段; - 变量的
Query字段保留:label_values(module_status{module_name="$module_name"}, dependencies) - 在Regex字段填入:
/(.*?)(?:,|$)/g;要是你的Grafana版本支持,也可以在Format下拉里选“CSV to values”; - 保存变量后,
module_services就会拆成SERVICE_1、SERVICE_4、SERVICE_5这些单独选项,之后面板查询直接用service_status{service_name=~"$module_services"}就行。
内容的提问来源于stack exchange,提问作者Vico Tornan
相关产品推荐
相关产品推荐

