如何在Grafana单表格中合并两个InfluxDB Flux查询结果?
解决Grafana对接InfluxDB时多Flux查询结果合并为单表格的问题
给你两个靠谱的解决办法,直接搞定把两个指标合并成三列表格的需求:
方法一:在Flux查询层面直接合并(推荐)
不用分开写两个查询,直接在Flux里一次性获取两个字段并转成列,效率更高。替换原来的两个查询为下面这段代码:
from(bucket: "telegraf") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "mem") // 同时筛选出已用内存(used)和百分比(used_percent)两个字段 |> filter(fn: (r) => r["_field"] == "used" or r["_field"] == "used_percent") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) // 把_field的不同值转成单独列,host和_time作为行标识 |> pivot(rowKey: ["_time", "host"], columnKey: ["_field"], valueColumn: "_value") // 给列重命名成你要的中文名称 |> rename(columns: {used: "已用内存(GB)", used_percent: "已用内存百分比"}) |> yield(name: "mem_stats")
这段代码的逻辑是:
- 一次性拉取两个指标的数据
- 聚合后用
pivot函数把原来的行数据(每个host+时间点对应一条指标)转成列数据(每个host+时间点对应一行,包含两个指标列) - 最后重命名列名,直接在Grafana表格里就能得到你要的三列结构。
方法二:用Grafana的转换功能处理现有查询
如果不想改查询,保留原来的两个Flux查询,通过Grafana的面板转换来合并:
- 把两个查询都添加到Grafana面板的数据源中
- 添加Merge转换:把两个查询的结果合并成一个数据集(此时数据还是行追加的形式,每个host对应两行数据,分别是used和used_percent)
- 添加Pivot转换:
- Row fields:勾选
host和_time(如果不需要按时间维度,只勾选host即可) - Column field:选择
_field - Value field:选择
_value
- Row fields:勾选
- 添加Organize fields转换:
- 把列名
used改成已用内存(GB),used_percent改成已用内存百分比 - 调整列的顺序,把
host放在第一列
- 把列名
之前你用Merge、Organize没成功,大概率是漏了关键的Pivot步骤——只有通过Pivot才能把不同的_field值转成单独的列,而不是行追加。
内容的提问来源于stack exchange,提问作者Falke
相关产品推荐
相关产品推荐

