如何将Telegraf 1.30.0输出的嵌套JSON扁平化为ThingsBoard可用格式?
解决Telegraf输出嵌套JSON适配ThingsBoard的扁平格式问题
当前Telegraf输出的CPU监控数据为嵌套结构,fields子对象包含所有CPU使用率指标,需要将其展开为扁平JSON格式才能被ThingsBoard直接解析使用。以下是针对Telegraf 1.30.0版本的两种有效解决方案:
方法一:使用json_v2处理器(推荐,配置简洁)
在Telegraf配置文件中添加json_v2处理器,将嵌套的fields对象直接展开到顶层:
# 保留你的CPU输入配置 [[inputs.cpu]] percpu = true totalcpu = false collect_cpu_time = false report_active = false # 添加json_v2处理器,放在输入和输出节点之间 [[processors.json_v2]] # 展开fields下的所有指标到顶层 [[processors.json_v2.field]] path = "fields" rename = "" # 空值表示直接将子字段展开到当前层级 # 删除原有的fields字段,避免冗余数据 [[processors.json_v2.field]] path = "fields" operation = "delete" # 配置ThingsBoard HTTP输出 [[outputs.http]] url = "http://YOUR_THINGSBOARD_IP/api/v1/YOUR_DEVICE_TOKEN/telemetry" method = "POST" data_format = "json" json_timestamp_units = "s" # 匹配数据中的timestamp单位
处理后的数据格式示例:
{ "name": "yavar", "timestamp": 1716900420, "usage_guest": 0, "usage_guest_nice": 0, "usage_idle": 91.40585349348385, "usage_iowait": 0.1691761123329754, "usage_irq": 0, "usage_nice": 0.13534088986632262, "usage_softirq": 0.08458805616646366, "usage_steal": 0, "usage_system": 2.317712738961436, "usage_user": 5.887328709186236 }
方法二:使用starlark处理器(灵活适配复杂场景)
如果需要自定义处理逻辑,可通过starlark脚本实现字段展开:
[[processors.starlark]] source = ''' def apply(metric): # 移除嵌套的fields字段并获取其内容 nested_fields = metric.fields.pop("fields") # 将嵌套字段合并到顶层字段中 metric.fields.update(nested_fields) return metric '''
该脚本会直接将fields内的所有指标移到数据点顶层,并删除原fields字段,生成完全扁平的JSON结构。
生效验证
修改配置后重启Telegraf服务:
sudo systemctl restart telegraf
可通过查看Telegraf日志或抓包工具确认输出数据已转为扁平格式,此时ThingsBoard可直接解析并展示各CPU使用率指标。
内容的提问来源于stack exchange,提问作者Nithish kumar B
相关产品推荐
相关产品推荐

