如何用Flux从InfluxDB整数中按行提取位以适配Grafana
在Flux中将状态字的位按行提取(而非按列)
要把状态字的每个位转换成独立行输出,你可以结合array.map和flatten函数实现,替代原来按列生成的方式。以下是具体实现方案:
完整Flux示例代码
import "bitwise" import "array" // 定义需提取的位配置:位编号、掩码、显示名称,可按需扩展 bitDefinitions = array.from(rows: [ {bitNum: 0, mask: 1, name: "bit00"}, {bitNum: 1, mask: 2, name: "bit01"}, {bitNum: 2, mask: 4, name: "bit02"}, {bitNum: 3, mask: 8, name: "bit03"}, {bitNum: 4, mask: 16, name: "bit04"}, // 继续添加更多位的配置 ]) // 替换为你的实际数据源查询逻辑 rawData = from(bucket: "your-bucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "your-measurement" and r._field == "Alarm") // 将每个状态字拆分为多行(每行对应一个位) rawData |> map(fn: (r) => { // 为当前状态字的每个位生成一条记录 bitRows = array.map( fn: (bitDef) => ({ _time: r._time, _measurement: r._measurement, // 保留原始数据的所有标签,按需调整 device: r.device, location: r.location, bitName: bitDef.name, bitValue: bool(v: bitwise.sand(a: r._value, b: bitDef.mask) / bitDef.mask) }), arr: bitDefinitions ) return {bits: bitRows} }) |> flatten(path: ["bits"])
代码说明
- 位配置管理:
bitDefinitions集中管理所有需要提取的位信息,后续要新增或修改位时,直接修改这个数组即可,无需改动核心逻辑。 - 生成位记录数组:通过
array.map遍历位配置,为每条原始状态字数据生成对应所有位的记录数组。 - 展开为多行:
flatten函数将数组中的每条位记录展开成独立行,最终每条数据只包含单个位的名称和布尔值。
处理后的数据可以直接在Grafana中按bitName分组展示,也能针对特定bitName(比如bit02)设置告警规则,满足你的后续需求。
内容的提问来源于stack exchange,提问作者ebabeshko
相关产品推荐
相关产品推荐

