如何在Prometheus查询中替换字符串以简化Grafana服务名显示?
解决Grafana中Prometheus查询图例显示问题
最简方案:调整Grafana图例格式
不用修改PromQL,直接在Grafana面板的Legend设置里,把Legend format改成{{name}}即可。这样不管查询返回的标签包含哪些字段,图例都会只显示name标签的值(比如certbot.service)。
优化查询维度(更高效)
原查询中已经过滤了state="failed",所有结果的state字段都是固定值,没必要在聚合维度里保留它。修改查询为:
sum(node_systemd_unit_state{instance=~"^.*$",state="failed"}) by (name) > 0
此时查询结果的标签只有name,再配合Grafana图例格式{{name}},就能完美显示服务名。
保留聚合维度的方案(用label_replace)
如果确实需要保留state在聚合维度中,用label_replace提取服务名到新标签:
label_replace( sum(node_systemd_unit_state{instance=~"^.*$",state="failed"}) by (name, state) > 0, "service", "$1", "name", "(.*)" )
- 语法解释:
label_replace(指标, 新标签名, 替换模板, 源标签名, 匹配正则),这里把name的完整内容复制到service标签中。 - 之后在Grafana图例设置里指定
{{service}}作为显示格式即可。
关于regex_replace管道符错误的说明
PromQL的regex_replace是字符串处理函数,仅在Prometheus 2.42+版本支持,且需配合标签操作使用,不能直接用管道符连接聚合查询。比如正确的用法是对单个标签值处理,而非直接拼接在聚合查询后。相比之下,label_replace更适合这类标签提取场景,语法也更直观。
内容的提问来源于stack exchange,提问作者JJandke
相关产品推荐
相关产品推荐

