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

如何用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"])

代码说明

  1. 位配置管理:bitDefinitions集中管理所有需要提取的位信息,后续要新增或修改位时,直接修改这个数组即可,无需改动核心逻辑。
  2. 生成位记录数组:通过array.map遍历位配置,为每条原始状态字数据生成对应所有位的记录数组。
  3. 展开为多行:flatten函数将数组中的每条位记录展开成独立行,最终每条数据只包含单个位的名称和布尔值。

处理后的数据可以直接在Grafana中按bitName分组展示,也能针对特定bitName(比如bit02)设置告警规则,满足你的后续需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:52:37