Telegraf MQTT Consumer传JSON至InfluxDB时64位整数精度丢失问题
Telegraf MQTT JSON解析大整数精度丢失解决方案
你遇到的精度丢失问题确实是JSON默认解析规则导致的:标准JSON没有细分整数、浮点数类型,Telegraf默认的JSON解析器会将所有数值统一转换为float64类型,而float64仅能精确表示不超过2^53(约9007199254740992)的整数,你用到的bsEui数值已经远大于这个阈值,因此出现末尾精度丢失的情况。
可行解决方案
- 方案1:修改MQTT数据源的输出格式,将大整数字段转为字符串类型传输。仅需要在数据上报时将
bsEui的数值用引号包裹即可,Telegraf会将其识别为字符串类型写入InfluxDB,完全不会出现精度损失,后续需要数值运算时可在查询阶段做类型转换。 - 方案2:开启Telegraf JSON解析器的int64解析配置。Telegraf 1.16及以上版本的JSON parser支持
json_int64参数,开启后会将所有JSON数值优先解析为int64类型,你的bsEui数值在int64的取值范围内(int64最大值为9223372036854775807),完全可以被准确解析。对应配置参考如下:
[[inputs.mqtt_consumer]] # 其余原有MQTT连接、主题等配置保持不变 data_format = "json" json_int64 = true
- 方案3:使用Starlark处理器自定义字段类型。如果后续存在超出int64范围的数值,或者需要针对不同字段指定不同类型,可以添加Telegraf的Starlark处理器,手动指定
bsEui的字段类型,覆盖默认解析逻辑。
内容的提问来源于stack exchange,提问作者danberg13
相关产品推荐
相关产品推荐

