Grafana重复行中链式变量未按行局部值计算问题如何解决
问题原因
Grafana的全局模板变量只会在仪表板加载、变量值手动修改时全局计算一次,不会针对重复行的局部上下文重新执行查询,所以你拿到的$running_sessions永远是全局$clients选择All时返回的全量会话ID集合,自然所有行的面板都会展示全量数据。
可行解决方案
方案1:调整查询逻辑,移除全局$running_sessions依赖
这是改造成本最低的方案,不需要修改现有变量和行重复配置:
- 你当前配置了按
$clients逐行重复,展开后每一行上下文内的$clients是对应当前行的单个客户值,而非全局的All值集合 - 直接在面板的PromQL中嵌入对应当前客户的实时MySQL查询,替换原有的全局
$running_sessions变量:
sum without(instance) (metrics{ module="XXX", category="XXX", name="RunStatus", id=~"[[你的MySQL数据源名称:select group_concat(id separator '|') from sessions where client_id = $clients]]" })
把语句中的你的MySQL数据源名称替换为实际配置的MySQL数据源名即可,Grafana渲染每一行面板时,会针对当前行的$clients局部值实时执行这条MySQL查询,拿到对应当前客户的会话ID列表拼接为正则匹配格式,实现只展示当前客户会话数据的效果。
方案2:给Prometheus指标新增client_id标签(更推荐,性能更好)
如果可以调整Prometheus的采集规则,给metrics指标增加client_id标签,就可以完全去掉MySQL查询的依赖,查询性能更高:
修改后的PromQL直接按当前行的客户值过滤即可:
sum without(instance) (metrics{ module="XXX", category="XXX", name="RunStatus", client_id="$clients" })
方案3:使用面板重复替代行重复(备选)
如果以上方案不适用,你可以删除原有重复行配置,直接对行内的面板配置重复规则,重复维度选择$clients,同时将$running_sessions变量的刷新规则修改为「随时间范围刷新」,也可以实现按客户拆分展示对应数据的效果。
内容的提问来源于stack exchange,提问作者Callixte Cauchois
相关产品推荐
相关产品推荐

