InfluxDB2中如何通过Flux创建关联多标签的变量
原代码失效原因
你写的查询跑不出结果,核心是两个语法和用法错误:
schema.measurementTagValues仅支持传入单个tag参数,用来指定你要查询值的目标标签,重复传入同名tag参数属于Flux语法错误,且最后一个tag参数值"CATEGORY"末尾多写了句点,语法直接不合法。- 该函数没有预留多标签过滤的参数位,无法直接通过传入多个tag参数的方式实现1.x中
WHERE多条件过滤的效果。
正确实现方案
你要实现的InfluxDB 1.x查询逻辑:
SHOW TAG VALUES WITH KEY = "CATEGORY" WHERE "RUNID" = "RUNID" AND "MEASUREMENT" = "MEASUREMENT" AND "DB" = "DB"
在Flux中可以用以下两种方式实现,两种写法的输出都符合InfluxDB 2仪表盘变量的格式要求:
方案1:schema包函数+链式过滤(性能更好,生产环境推荐)
调用schema包拿到目标标签的基础值集合后,通过filter函数叠加其他标签的过滤条件,最后去重输出即可:
import "influxdata/influxdb/schema" schema.measurementTagValues( bucket: "AUTOMATIONDB", measurement: "${MEASUREMENT}", tag: "CATEGORY" // 此处仅填写你最终要取值的目标标签,对应1.x语句中KEY后面的标签名 ) |> filter(fn: (r) => r.RUNID == "${RUNID}") // 需要加其他标签过滤条件时,继续追加filter规则即可,比如DB标签的过滤 // |> filter(fn: (r) => r.DB == "${DB}") |> distinct(column: "_value")
方案2:原始时序数据过滤(逻辑更直观,适合小数据量场景)
如果你的查询时间范围内数据量不大,可以直接查询原始时序数据,过滤后提取目标标签的去重值:
from(bucket: "AUTOMATIONDB") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "${MEASUREMENT}") |> filter(fn: (r) => r.RUNID == "${RUNID}") // 按需追加其他过滤条件 // |> filter(fn: (r) => r.DB == "${DB}") |> group() |> distinct(column: "CATEGORY") |> rename(columns: {CATEGORY: "_value"})
注意事项
- 在InfluxDB UI中创建Flux类型变量时,查询结果必须仅包含
_value列才能被变量正常识别,上述两种写法的输出结构都满足要求。 - Flux的字符串等值判断是大小写敏感的,传入筛选的变量值要和实际存储的标签值大小写完全一致。
- 不要给Flux函数传入同名的重复参数,Flux不会按参数传入顺序叠加逻辑,会直接抛出参数重复的语法错误。
内容的提问来源于stack exchange,提问作者RGV
相关产品推荐
相关产品推荐

