物联网终端telegraf采集设备信息

背景

低功耗设备上资源有限,但又比较重要。对其的管理难度很大,有些时候又必须时刻了解其运行状况。我们自然想到的是能否有办法监控它呢?当时是有的!而且很成熟的解决方案。TICK技术栈,那TICK是什么呢?
TICK是由InfluxData开源的监控技术栈,由 Telegraf, InfluxDB, Chronograf, Kapacitor 四个工具的首字母组成。

  • Telegraf:go语言开发的数据采集工具;
  • InfluxDB:go语言开发的时序数据库;
  • Chronograf:数据可视化报表展示;
  • Kapacitor:时序数据的监控告警;
    在这里插入图片描述
    以上只是做个了解,不在本文重点。而且每个人遇到的工作场景不同,这样的架构也不一定适合自己。取其所需整合到自己的系统中,可以完美的满足业务需求最好。当然了解这个解决方案也是必须的。自己去花时间吧。

问题

在我的尝试中使用telegraf+influxdb+业务系统去跟踪并管理终端设备,通过交叉编译环境–现场设备–数据采集–数据入库–设备管理等正式环境运行后,欣喜的发现数据上来了。但是没过多久telegraf数据时断时续,最终挂掉而导致数据出现中断。个人模糊的感觉可能是入库时出现了什么我不知道的问题。通过抓包分析发现,其在对influxdb建立网络连接时网络不稳定,主程序进程占用的内存也多,多方面因数导致数据不能及时发出去最终撑爆了telegraf。也有一种通过限制telegraf连接失败时Telegraf将尝试重新连接InfluxDB的最大次数,influx_max_retry_interval参数指定了重试连接的最大时间间隔。但这样不能解决我数据丢失的问题呀。

架构图
项目摘取部分架构

解决

针对上面的问题决定替换直接连接influxdb的想法,利用终端本身与mqtt交互的方式,将数据回传到系统中。于是有了上面的截图。再一番修改后,数据到了server时又出现了问题。telegraf采集时,上报到mqtt过程中设置了数据格式为“json”,想着通过server转手时再做点自动分析处理的工作。然后再将数据直接入库!想法是好的,也是可行的。就是数据格式中出现了integer与float的交替出现导致了influxdb入库失败。查阅资料时发现可以直接配置数据的类型为influx,Telegraf数据格式配置
在这里插入图片描述

于是我修改配置如下:

root@lm70:/tffs0a# cat telegraf.conf
## 配置在采集终端的telegraf.conf,注意配置信息的正确性

# Telegraf Configuration
# Global tags can be specified here in key="value" format.
[global_tags]
  device="3"
# Configuration for telegraf agent
[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  debug = false
  quiet = false
  hostname = ""
  omit_hostname = false

# CPU input plugin
[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false
# Memory input plugin
[[inputs.mem]]
# Disk input plugin
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs"]
# System input plugin (for boot time)
[[inputs.system]]
# Net input plugin (for network traffic)
#[[inputs.net]]  已放弃使用nstat替代
[[inputs.nstat]]

# 配置influxdb信息,出现数据中断的,后改为下面的mqtt方式接收数据
# InfluxDB v2 output plugin
#[[outputs.influxdb_v2]]
#  urls = ["http://remote_ip:port"]
#  token = "token"
#  organization = "org"
#  bucket = "bucket"

# 配置mqtt的数据接收方式,第一次选择了data_format="json"的格式入库,出现了数据类型不匹配的情况,
# 当然可以自行处理,如果不想处理也是可以直接设置data_format=“influx”这种方式去规避
[[outputs.mqtt]]
  servers = ["tcp://remote_ip:port"]
  topic = "topic"
  qos = 1
  username = "admin"
  password = "passwd"
  data_format = "influx"

通过这么配置后,就能在server中直接转存到infludb中即可

# 对着上图的Server中运行的python代码片段

import paho.mqtt.client as mqtt
from influxdb_client import InfluxDBClient
from concurrent.futures import ThreadPoolExecutor
from influxdb_client.client.write_api import SYNCHRONOUS

# 线程池
executor = ThreadPoolExecutor(max_workers=20)
# Influxdb连接信息,此处版本2.x
client = InfluxDBClient(url=ENV_INFLUX_URL, token=ENV_INFLUX_TOKEN, org=ENV_INFLUX_ORG, timezone='Asia/Shanghai')
write_api = client.write_api(write_options=SYNCHRONOUS)

def save_data(bytes_array):
	try:
        print(bytes_array)
        write_api.write("bucket", 'org', bytes_array)
        
        # 你可以对数据在做点什么也不是不可以....
        # dosomething...
        
    except Exception as e:
        print(f"监控数据入库失败...{e}")

def on_connect(client, userdata, flags, rc):
    """订阅设备监控数据的topic"""
    print("MQTT连接成功")
    client.subscribe(ENV_MQTT_MT)
  
def on_message(client, userdata, msg):
    if "mt_device" in msg.topic:
        executor.submit(save_data, msg.payload)
  	else:
  		pass

if __name__ == '__main__':
	# mqtt配置信息根据自己的配置
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(ENV_MQTT_IP, int(ENV_MQTT_PORT), 60)
    client.loop_forever()

官方链接:
https://github.com/influxdata/telegraf/tree/master/plugins

        到这里我遇到的问题就解决了,而且没有再出现断断续续的情况,一直很稳定。这就不禁让我感到疑惑。同样的网络环境下为什么这种方式可以安全平稳的运行,而直接配置influxdb数据库就会出现问题呢?

讨论

如果你有好的解决办法,请在评论区告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/457927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云仓酒庄2024年培训专业化:强化销售与品酒技能,酒业新动态

云仓酒庄2024年培训专业化:强化销售与品酒技能,共筑酒业新动态 在风云变幻的市场竞争中,云仓酒庄始终秉持着创新、进取的理念,不断探索与实践,以推动酒业行业的持续健康发展。2024年,云仓酒庄在培训专业化…

SpringBoot(自定义转换器+处理Json+内容协商)

文章目录 1.自定义转换器1.代码实例1.save.html2.编写两个bean1.Car.java2.Monster.java 3.WebConfig.java 配置类来自定义转换器4.测试 2.注意事项和细节1.debug查看转换器总数1.打断点2.执行到断点后,选左边的1923.可以看出,加上自定义的转换器一共125…

Day63:WEB攻防-JS应用算法逆向三重断点调试调用堆栈BP插件发包安全结合

目录 前置知识 JS调试分析 JS分析调试结合Burp JS分析调试知识点: 1、JavaScript-作用域&调用堆栈 2、JavaScript-断点调试&全局搜索 3、JavaScript-Burp算法模块使用 前置知识 JS加密数据走向 浏览器调试 1、作用域:(本地&全…

论文阅读——RingMo

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling 与自然场景相比,RS图像存在以下困难。 1)分辨率和方位范围大:受遥感传感器的影响,图像具有多种空间分辨率。此外,与自然图像的实例通常由于重…

《1w实盘and大盘基金预测 day3》

上贴指数预测拉满,上证最低位置和最高位置预测的八九不离十,个人预测最高3062实际3060,最低3017实际3020 昨天的预测 3017-3031-3062 低开反抽,回落下杀 明天看是否能阳包阴,得看蓝筹、证券发力。(AI板块…

对OceanBase进行 sysbench 压测前,如何用 obdiag巡检

有一些用户想对 OceanBase 进行 sysbench 压测,并向我询问是否需要对数据库的各种参数进行调整。我想起有一个工具 obdiag ,具备对集群进行巡检的功能。因此,我正好借此机会试用一下这个工具。 obdiag 功能的比较丰富,详细情况可参…

【机器学习300问】37、什么是迁移学习?

一、什么是迁移学习? (1)它的出现是为了解决什么问题? 迁移学习是为了解决深度学习中由于数据不足导致的学习效果受限以及跨领域知识的有效利用等问题而发展起来的一种重要技术手段。 ① 缺少训练数据 在许多实际应用中&#xf…

手动创建线程池各个参数的意义?

今天我们学习线程池各个参数的含义,并重点掌握线程池中线程是在什么时机被创建和销毁的。 线程池的参数 首先,我们来看下线程池中各个参数的含义,如表所示线程池主要有 6 个参数,其中第 3 个参数由 keepAliveTime 时间单位组成。…

DM数据库安装(Linux)

Linux安装 操作系统CPU数据库CentOS7x86_64 架构dm8_20230418_x86_rh6_64 先把压缩包扔过去 新建 dmdba 用户 创建用户所在的组,命令如下: groupadd dinstall 创建用户,命令如下: useradd -g dinstall -m -d /home/dmdba -s /…

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2

MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS(Quality of Service)等级,用于确保消息的可靠性和传输效率。本文将详细…

java数据结构与算法刷题-----LeetCode47. 全排列 II

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 暴力回溯2. 分区法回溯 此题为46题的衍生题,在46题…

Android14之报错:error:add its name to the whitelist(一百九十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Vscode 修改C++版本

1. 首先要检查GCC版本,有的gcc版本过低会导致C版本升级不成功 可以用cmd,用gcc --version命令查看gcc版本 我这里就是gcc版本较低,不支持c17 需要先升级gcc版本 gcc与c对应的版本,大家可以在这位大佬的博客中看,写…

json-server库的使用,实现数据模拟

项目目录 安装 npm i json-server -g 启动单个json服务,在cookbook目录下执行命令: json-server ./mock/a.json -p 9000 待实现

本地调试 Github Actions:维护纯净代码,减少调测记录 | 开源日报 No.200

nektos/act Stars: 47.6k License: MIT act 是一个可以在本地运行 GitHub Actions 的工具。 快速反馈:无需每次都提交/推送更改到 .github/workflows/ 文件(或嵌入式 GitHub actions),使用 act 可以在本地运行 actions&#xff…

【华为 ICT HCIA eNSP 习题汇总】——题目集16

1、下面哪一个最适合使用室内分布方式部署 WLAN? A、运动场 B、办公室 C、高校单排宿舍 D、广场 考点:无线局域网 解析:(C) 室内分布方式部署 WLAN 一般适用于需要大面积、高密度、高质量无线覆盖的场所,从…

<JavaEE> 数据链路层 -- 以太网协议、MTU限制、ARP协议

目录 以太网协议 什么是以太网? 以太网的帧格式 什么是MAC地址? MAC地址和IP地址的对比? MTU(最大传输单元)限制 什么是MTU限制? MTU对IP协议有什么影响? MTU对UDP协议有什么影响&…

Css提高——flex布局及其相关属性

目录: 1、传统布局与flex布局的区别 2、flex的布局原理 3、flex常见的父项属性 3.1、flex-direction :设置主轴的方向 3.2、justify-content 设置主轴上的子元素排列方式 3.3、flex-wrap 设置子元素是否换行 3.4、align-items 设置侧轴上的子元素排…

电阻器的等效电路与高频无感电阻的性能

电阻器的结构比较简单,但在高频情况下,不能简单地把电阻器看成只是一个电阻分量的理想元件。电阳器实际上是由许多电阻、电感和电容分量组成的复杂阻抗系统,电阻只是其中的一个主要成分。因此必须研究电阻器的直流等效电路、高频等效电路和集…

面试题系列一之-css画三角形(原理解析)

用html写一个三角形的图标算是一个比较简单的,但是工作中用的还是比较多的&#xff0c;面试也可能会问&#xff0c;但了解背后的原理才能熟练使用 我们首先写一个div,设置边框 <body><div class"border"></div> </body> <style> .bo…