首页 > 编程问答 >将来自 Telegraf 的 JSON 数据扁平化,以便在 ThingsBoard 中使用

将来自 Telegraf 的 JSON 数据扁平化,以便在 ThingsBoard 中使用

时间:2024-06-04 15:42:56浏览次数:20  
标签:telegraf thingsboard telegraf-output-plugins

我连接了 ThingsBoard 和 Telegraf 以可视化 CPU 使用率,但收到的数据是嵌套 JSON 格式。我尝试了不同的方法,但无法以扁平化的 JSON 格式获取数据。

使用 Telegraf 1.30.0 版本,数据以以下格式返回:

[
{
  "fields":{
    "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
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":91.94207836457213,
    "usage_iowait":0.9028960817717189,
    "usage_irq":0、
    "usage_nice":0.30664395229985647,
    "usage_softirq":0.11925042589437249,
    "usage_steal":0、
    "usage_system":1.8568994889266988,
    "usage_user":4.872231686542196
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":91.22272957889072,
    "usage_iowait":0.8963301200743917,
    "usage_irq":0、
    "usage_nice":0.35514967021814886,
    "usage_softirq":0.05073566717402127,
    "usage_steal":0、
    "usage_system":2.130898021308797,
    "usage_user":5.344156942329791
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":92.3648648648699,
    "usage_iowait":0.4222972972973181,
    "usage_irq":0、
    "usage_nice":0.3209459459459579,
    "usage_softirq":0.05067567567566809,
    "usage_steal":0、
    "usage_system":1.2837837837838315,
    "usage_user":5.557432432432644
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":92.40399255626502,
    "usage_iowait":0.16917611233301705,
    "usage_irq":0、
    "usage_nice":0.11842327863312155,
    "usage_softirq":0.033835222466601006,
    "usage_steal":0、
    "usage_system":1.3364912874308539,
    "usage_user":5.938081542887148
    },
  "name":"cpu4"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":92.9369918699103,
    "usage_iowait":0.5928184281842386,
    "usage_irq":0、
    "usage_nice":0.16937669376690467,
    "usage_softirq":0.016937669376688058,
    "usage_steal":0、
    "usage_system":1.1856368563684772,
    "usage_user":5.09823848238449
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":93.07888040712137,
    "usage_iowait":0.25445292620872184,
    "usage_irq":0、
    "usage_nice":0.15267175572520417,
    "usage_softirq":0.06785411365564227,
    "usage_steal":0、
    "usage_system":1.5436810856660335,
    "usage_user":4.902459711620043
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":92.3622845555872,
    "usage_iowait":0.33795201081445,
    "usage_irq":0、
    "usage_nice":0.15207840486649526,
    "usage_softirq":0.03379520108144139,
    "usage_steal":0、
    "usage_system":1.824940858397751,
    "usage_user":5.288948969245875
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
},
{
  "fields":{
    "usage_guest":0、
    "usage_guest_nice":0、
    "usage_idle":92.21845893310595,
    "usage_iowait":0.4678238780693211,
    "usage_irq":0、
    "usage_nice":0.21168501270109033,
    "usage_softirq":0.05503810330228156,
    "usage_steal":0、
    "usage_system":1.682895850973822,
    "usage_user":5.364098221845659
    },
  "name":"yavar"、
  "tags":{}、
  "timestamp":1716900420
}
]
但我需要从 Telegraf 到 ThingsBoard 的扁平化 JSON 格式数据。


可以使用 Telegraf 的 starlark 处理器来将嵌套的 JSON 数据扁平化为 ThingsBoard 可接受的格式。下面是一个配置示例:

# ... 其他 Telegraf 输入插件配置 ...

[[processors.starlark]]
  source = '''
  def apply(metric):
    fields = metric.fields.copy()
    for k, v in fields.items():
      metric.fields[f"{metric.name}_{k}"] = v
    metric.fields.pop("usage_guest", None)
    metric.fields.pop("usage_guest_nice", None)
    metric.fields.pop("usage_idle", None)
    metric.fields.pop("usage_iowait", None)
    metric.fields.pop("usage_irq", None)
    metric.fields.pop("usage_nice", None)
    metric.fields.pop("usage_softirq", None)
    metric.fields.pop("usage_steal", None)
    metric.fields.pop("usage_system", None)
    metric.fields.pop("usage_user", None)
    return metric
  '''

# ... ThingsBoard 输出插件配置 ...

解释:

  1. [[processors.starlark]] : 这行定义了一个新的 Starlark 处理器。
  2. source : 包含要执行的 Starlark 脚本。
  3. apply(metric) : 这个函数接收一个 metric 对象,该对象代表 Telegraf 收集到的单个数据点。
  4. fields = metric.fields.copy() : 复制 fields 字典以避免修改原始数据。
  5. for k, v in fields.items(): : 遍历 fields 字典中的每个键值对。
  6. metric.fields[f"{metric.name}_{k}"] = v : 使用 name 和原始键名创建一个新的扁平化键名,并将值赋给它。
  7. metric.fields.pop("key", None) : 删除原始的嵌套键。
  8. return metric : 返回修改后的 metric 对象。

使用此配置,Telegraf 将输出以下格式的扁平化 JSON 数据:

[
  {
    "name": "yavar",
    "tags": {},
    "timestamp": 1716900420,
    "yavar_usage_guest": 0,
    "yavar_usage_guest_nice": 0,
    "yavar_usage_idle": 91.40585349348385,
    "yavar_usage_iowait": 0.1691761123329754,
    "yavar_usage_irq": 0,
    "yavar_usage_nice": 0.13534088986632262,
    "yavar_usage_softirq": 0.08458805616646366,
    "yavar_usage_steal": 0,
    "yavar_usage_system": 2.317712738961436,
    "yavar_usage_user": 5.887328709186236
  },
  # ... 其他数据点 ...
]

请确保根据的实际需求调整 starlark 处理器中的代码,例如修改键名或添加其他逻辑。

标签:telegraf,thingsboard,telegraf-output-plugins
From: 78544286

相关文章

  • docker快速部署 influxdb+telegraf+grafana 推送主机及docker容器监控数据 并展示图
    简述1、InfluxDBInfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。 2、TelegrafTelegraf是一个插件驱动的服务器代理,用于收集和报告指标,并且是TICKStack的第一部分。Telegraf插件可以直接从它运行的系统中获取各种指标,从第三方API中提取指标,甚......
  • 从零实战本地服务器部署 Docker 安装 ThingsBoard PE 专业版(适用于Cassandra + Kafka
    目录1、准备工作2、本地服务器LinuxCentos7.9系统安装docker2.1、检查Linux的内核版本2.2、卸载Docker旧版本(若有需要)2.3、安装Docker2.4、安装Docker引擎2.5、 启动docker和设置开机⾃启动3、使用Docker安装ThingsBoardPE3.1、 拉取ThingsBoardPE镜像3.2......
  • ThingsBoard 开源物联网平台
    文章目录1.ThingsBoard介绍2.ThingsBoard架构2.1.单体架构2.2.微服务架构3.物联网网关4.边缘计算ThingsBoard#ThingsBoardhttps://iothub.org.cn/docs/iot/https://iothub.org.cn/docs/iot/thingsboard-ce/1.ThingsBoard介绍ThingsBoard是一个开源物联......
  • macOS下安装telegraf记录
    一、通过homebrew安装influxdb官网上说通过homebrew安装,命令如下:brewupdate&&brewinstalltelegraf我执行后,发现报错:dialtcp142.251.42.241:443:i/otimeo 网上说,解决办法:换一个国内能访问的代理地址goproxy.cngoenv-wGOPROXY=https://goproxy.cn对我没用......
  • telegraf解析嵌套json遇到的问题
    问题描述kafka中的数据格式如下:{"customerId":1652,"deviceId":"13011304383","timestamp":1705637828000,"parameters":{"acc":0,"locationStatus":1,&......
  • ThingsBoard 入门
    必备条件 方法一:使用LiveDemo服务器。这是ThingsBoard官方提供的一个免费的服务器,您可以直接在网上访问它,不需要自己安装任何东西。您只需要打开浏览器,输入https://demo.thingsboard.io/signup这个网址,就可以看到ThingsBoard的界面。您可以用[email protected]这个......
  • ThingsBoard 前端项目轮播图部件开发
    前言ThingsBoard是目前Github上最流行的开源物联网平台(14.6kStar),可以实现物联网项目的快速开发、管理和扩展,是中小微企业物联网平台的不二之选。本文介绍如何在ThingsBoard前端项目中开发轮播图部件。产品需求最近接到产品经理一个需求,在TB仪表板中添加轮播图部件,......
  • 钡铼技术助力Thingsboard平台国内发展,特价网关为用户带来超值体验
    钡铼技术作为Thingsboard官方合作伙伴,致力于推动TB平台在国内的推广和应用。为了让国内用户更好的体验Thingsboard平台,钡铼技术联合Thingsboard中文网推出一批特价网关,不为赚钱只为交个朋友!钡铼技术Thingsboard硬网关南向可以采集PLC、Modbus、楼宇BACnet、电力IEC103、104、DL/......
  • 国产开发板上打造开源ThingsBoard工业网关--基于米尔芯驰MYD-JD9X开发板
    本篇测评由面包板论坛的优秀测评者“JerryZhen”提供。本文将介绍基于米尔电子MYD-JD9X开发板打造成开源的Thingsboard网关。Thingsboard网关是一个开源的软件网关,采用python作为开发语言,可以部署在任何支持python运行环境的主机上,灵活性很高,修改代码相对比较方便。它可以作为一......
  • Thingsboard网关总结
    1概述Thingsboard网关是一个开放源代码的解决方案可让您使用Thingsboard集成连接到旧系统和第三方系统的设备。运行需要python3.7+的环境。2安装一般使用源码进行安装,其步骤如下:1、从代码仓库克隆代码, 2、进入代码目录,使用setup.py脚本安装python模块,python3setup.pyinsta......