Telegraf使用tail插件解析JSON大数值出现精度丢失问题求助
Telegraf Tail插件读取JSON大数值精度丢失解决方案
问题根本原因
JSON规范未明确区分整数与浮点数类型,Telegraf默认JSON解析器会将所有数值以64位浮点数形式存储。当数值超过2^53-1(即9007199254740991,JavaScript安全整数范围)时,浮点数无法精确表示整数,就会出现末尾精度丢失的情况。你使用的RequestId值959011990586458245远大于该阈值,因此出现截断。
之前尝试的方案无效原因:
json_string_fields仅对JSON中原本为字符串类型的字段生效,数值类型字段会先被解析为浮点数再转字符串,精度已经丢失- 低版本Telegraf的
json_int64_fields存在兼容性问题,无法正确识别顶层数值字段
可行解决方案
方案1(推荐):使用json_v2解析器明确指定字段类型
升级Telegraf到1.24.0及以上版本,替换默认JSON解析器为json_v2,可灵活指定字段类型,从解析阶段避免精度丢失。
调整后的输入插件配置如下:
[[inputs.tail]] files = ["E:/Telegraph/MSTCIVRRequestLog_*.json"] from_beginning = true name_override = "tcivrrequest" data_format = "json_v2" [[inputs.tail.json_v2]] [[inputs.tail.json_v2.field]] path = "RequestId" # 不需要数值计算的场景下推荐存为字符串,彻底避免精度问题 type = "string" # 若确需存储为数值类型,可改为 type = "int64"
输出插件配置无需调整,修改后重启Telegraf即可正常获取完整的RequestId值。
方案2(低版本Telegraf兼容):自定义处理器解析
如果无法升级Telegraf版本,可先将整行内容作为原始字符串读取,再通过starlark处理器提取RequestId:
[[inputs.tail]] files = ["E:/Telegraph/MSTCIVRRequestLog_*.json"] from_beginning = true name_override = "tcivrrequest" # 直接读取整行作为字符串字段 data_format = "value" value_data_type = "string" value_field_name = "raw_line" [[processors.starlark]] source = ''' load("json.star", "json_parse") def apply(metric): raw = metric.fields.pop("raw_line") data = json_parse(raw) # 直接将RequestId作为字符串添加到字段 metric.fields["RequestId"] = str(data["RequestId"]) return metric '''
内容的提问来源于stack exchange,提问作者kamlesh jayaswal
相关产品推荐
相关产品推荐

