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

如何在Grafana中基于其他查询结果过滤Prometheus序列?

解决方案

你的需求完全可行,推荐两种实现方式,按优先级排序:

方案一:通过查询变量预获取手机号(最简洁高效)

这个方法在变量层面完成unit_id到phone_number的映射,避免面板内复杂的数据源混合操作:

  1. 进入Grafana的变量管理页面,新建一个查询变量:
    • 数据源选择存储设备-手机号映射的数据库
    • 查询语句:SELECT phone_number FROM units WHERE unit_id='$unit_id'($unit_id是你已有的设备ID变量)
    • 变量类型选「查询」,设置「刷新」为「随变量变化」(确保unit_id改变时,手机号自动更新)
    • 若每个unit_id对应唯一手机号,可勾选「单值」选项
  2. 在设备详情面板的Prometheus查询中,直接使用这个新变量过滤指标:
    remaining_fup{phone_number="${phone_number_var}"}
    
    (把phone_number_var替换成你新建的变量名)

方案二:面板内通过Transform实现关联(适合无法新增变量的场景)

如果无法修改变量配置,可在混合数据源面板内通过Transform完成过滤,但注意此方法仅适合Prometheus返回数据量较小的场景:

  1. 添加数据库查询(数据源A):
    SELECT phone_number FROM units WHERE unit_id='$unit_id'
    
    确保查询返回单条手机号结果
  2. 添加Prometheus查询(数据源B):
    remaining_fup
    
    先拉取全量剩余FUP数据(若数据量过大,此方法会影响性能)
  3. 添加「Filter by value」Transform:
    • 目标数据集选择Prometheus的查询结果(数据源B)
    • 字段选择phone_number(Prometheus指标的标签字段)
    • 操作选择「等于」
    • 值填写${__data.fields.phone_number[0]}(引用数据库查询返回的第一条手机号结果)

为什么原方案失败?

Grafana混合数据源的多个查询是并行执行的,在Prometheus查询执行时,数据库查询的结果还未生成,因此无法直接在Prometheus查询中引用A.phone_number。必须通过变量预获取(变量查询优先于面板查询执行),或在所有查询完成后用Transform进行事后过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:01:00