在Grafana中能否复用带模板参数的Prometheus查询片段?
问题:Grafana中复用带参数的Prometheus查询片段?
我在Grafana里经常用几乎一样的Prometheus查询,只有指标名称有细微差别。比如我有这个查询:
label_replace(erlang_vm_ets_limit{instance=~"[^.]*${host}.*",env="${env}",app="${app}"}, "host", "$1", "instance", "[^.]*?(\\d+).*")
现在想把同样的逻辑用到erlang_vm_memory_ets_tables等其他指标上,能不能把查询存成可参数化指标名的形式?Grafana有没有原生方法复用这类查询片段?
解决方案
完全可以实现,Grafana有几种原生方法满足这类查询复用需求:
1. 用Grafana变量实现参数化指标名
这是最直接的方案:
- 先在仪表盘的「变量」设置里新建一个变量,类型选Query,数据源选你的Prometheus实例;
- 查询语句可以写
label_values({__name__=~"erlang_vm.*"}, __name__),自动拉取所有以erlang_vm开头的指标名,或者用label_values(__name__)获取所有指标; - 变量命名为
metric_name,之后在PromQL里直接用$metric_name替换原有的固定指标名:label_replace($metric_name{instance=~"[^.]*${host}.*",env="${env}",app="${app}"}, "host", "$1", "instance", "[^.]*?(\\d+).*") - 在仪表盘上选择不同的
metric_name值,查询就会自动对应到不同指标,完美复用逻辑。
2. 用查询片段(Query Snippets)保存通用逻辑(Grafana 8.0+)
如果需要跨仪表盘复用同一查询结构,用查询片段更方便:
- 在查询编辑器右上角点击「保存为片段」,把通用查询结构存起来,比如:
label_replace(__METRIC__{instance=~"[^.]*${host}.*",env="${env}",app="${app}"}, "host", "$1", "instance", "[^.]*?(\\d+).*") - 之后在其他面板编辑查询时,点击「插入片段」调用保存好的内容,再把
__METRIC__替换成实际指标名,或者直接替换成上面创建的$metric_name变量,实现灵活复用。
3. 进阶:变量+查询片段组合使用
把带变量的查询保存为片段,之后在任意仪表盘调用这个片段时,只要仪表盘里有同名变量(比如host、env、app、metric_name),片段会自动继承当前仪表盘的变量值,不用重复编写查询逻辑,最大化复用效率。
内容的提问来源于stack exchange,提问作者Adam Lindberg
相关产品推荐
相关产品推荐

