Telegraf/InfluxDB - 将整数拆分为位或布尔值

问题描述 投票:0回答:2

我有以下情况:我正在使用 Telegraf 从 ModBUS 获取数据并将其存储到 InfluxDB 中。 一个度量是一个整数,它们实际上都是布尔/位值。 例如,int 9 是 true (1)、 false (0)、 false (0) 和 true (1) 值。 获取该整数并将其作为单独的位/布尔值再次保存到 InfluxDB 中的最佳方法是什么? 安装的工具有 Telegraf、InfluxDB 和 Kapacitor。它还具有 Grafana,但希望将后处理的布尔值保存到 InfluxDB 中,以便以后使用其他工具进行分析。 预先感谢!

grafana influxdb modbus telegraf kapacitor
2个回答
1
投票

您可以使用 Telegraf 的 starlark 处理器插件和 Python 的 bitshift 运算符

完成您想要的操作

0
投票

这是 Telegraf 配置示例:

[[inputs.modbus]]
 interval = "10s"
 name_override="TestModbusDevice"
 tagexclude = ["type", "name", "host", "slave_id"]
 name = "NOT USED"
 slave_id = 12
 timeout = "3s"
 controller = "tcp://127.0.0.1:502"
 holding_registers = [     
    { name = "Status1",   byte_order = "AB",   data_type = "UINT16",  scale=1.0,   address = [32008]},     
]
[inputs.modbus.tags]
location="Test Location"

[[processors.starlark]]
    namepass = ["*Modbus*"]
    source = '''
def apply(metric):
    data1 = metric.fields.get("Status1")
    metric.fields["bit00"] = bool(data1 & 1)
    metric.fields["bit01"] = bool(data1 >> 1 & 1)
    metric.fields["bit02"] = bool(data1 >> 2 & 1)
    metric.fields["bit03"] = bool(data1 >> 3 & 1)
    metric.fields["bit04"] = bool(data1 >> 4 & 1)
    metric.fields["bit05"] = bool(data1 >> 5 & 1)
    metric.fields["bit06"] = bool(data1 >> 6 & 1)
    metric.fields["bit07"] = bool(data1 >> 7 & 1)
    metric.fields["bit08"] = bool(data1 >> 8 & 1)
    metric.fields["bit09"] = bool(data1 >> 9 & 1)
    metric.fields["bit10"] = bool(data1 >> 10 & 1)
    metric.fields["bit11"] = bool(data1 >> 11 & 1)
    metric.fields["bit12"] = bool(data1 >> 12 & 1)
    metric.fields["bit13"] = bool(data1 >> 13 & 1)
    metric.fields["bit14"] = bool(data1 >> 14 & 1)
    metric.fields["bit15"] = bool(data1 >> 15 & 1)
    return metric
'''

[[outputs.file]]
   files = ["stdout"]

输出示例:

TestModbusDevice,location=Test\ Location Status1=9i,bit00=true,bit01=false,bit02=false,bit03=true,bit04=false,bit05=false,bit06=false,bit07=false,bit08=false,bit09=false,bit10=false,bit11=false,bit12=false,bit13=false,bit14=false,bit15=false 1704120270000000000
TestModbusDevice,location=Test\ Location Status1=5i,bit00=true,bit01=false,bit02=true,bit03=false,bit04=false,bit05=false,bit06=false,bit07=false,bit08=false,bit09=false,bit10=false,bit11=false,bit12=false,bit13=false,bit14=false,bit15=false 1704120280000000000

如果您不需要原始整数(上例中的 Status1)并且只需要结果指标中的位,只需将 metric.fields.get 更改为 metric.fields.pop

© www.soinside.com 2019 - 2024. All rights reserved.