从EMQX到InfluxDB:Telegraf插件的胡乱应用

一、引言

1. 背景介绍

1.1 EMQX是一个高性能的MQTT消息服务器,在当前场景用于处理大规模物联网设备的连接和上报的数据。

1.2 Telegraf是一个收集、处理数据的组件,在当前场景用于收集物联网设备上报到EMQX服务器的数据,并且转发存储到InfluxDB数据库中。

1.3 InfluxDB是一个时序数据库,专门用于存储和查询由时间索引的大量数据,在当前场景用于存储物联网设备上报的数据。

(三者的关系如下图,图中箭头指向为数据的流向)

在这里插入图片描述

2. 目标

通过IOT设备上报报文携带的租户信息,实现IOT设备数据在InfluxDB中的分表(分measurement)存储。

3. 实现方式

利用Telegraf的Processor插件来处理Input插件收集到的租户信息,根据租户信息将数据存储到指定measurement中。(此方法适用于EMQX开源版本,如果使用EMQX企业版可以不需要Telegraf组件直接将数据写入到InfluxDB中,具体方法没有去探究!)

二、准备工作

1. 安装(参考官方文档便可)

2. 配置(Telegraf的配置文件中需要使用)

  • 添加EMQX连接的账号密码
  • 添加InfluxDB的连接Token、创建organization、创建默认的bucket。

三、Telegraf配置详解(重点!)

1. 处理流程(重点中的重点!上图!)

在这里插入图片描述

这是telegraf官网搞来的流程图,大家只需要关注中间telegraf这块就行了,简而言之就是外包公司,左手收集金童玉女(数据),右手外包到指定的公司(存储服务器),我恨阿!

telegraf神通广大他可以从boss招(MQTT收集)、也可以从拉勾招(CPU收集),这些招聘路径相当于上图中的Input插件了,你爱从哪里收集就选用什么插件。毕竟telegraf是有良心的包包,对boy and girl们还得细细培训(Process)、对他们掌握的技能聚合统计(Aggregate)一番,才能给他们分配到合适的岗位,不然牛头不对马嘴人家都不爱跟他合作了。

整个过程就是:数据输入(input) -> 数据处理(Process) -> 数据聚合统计(Aggregate)-> 数据输出(output)

(这个过程千万!千万!千万要记住!掌握这个过程才能知道自己该如何处理收集到的数据)

2. Telegraf基础配置

接下来我们就是要配置Telegraf了,仅需小小一个telegraf.conf就能够把telegraf掌握在手掌中。

说来说去就这几点… 具体大家可以看看这个链接

我们此次主要用到的是它的input、Process、Output插件。

3. Input、Process、Output插件的配置(重中之重 之 重中之重!!

我们按照数据处理的流程来配置一下telegraf(仅展示了主题相关的字段),

首先是input插件:

###############################################################################
#                            INPUT PLUGINS                                    #
###############################################################################

# boy
 [[inputs.mqtt_consumer]]
   alias = "boy"
   servers = ["tcp://host.docker.internal:1883"]
   # 监听的emqx主题
   topics = ["/boy/+"]
   username = "emqx_username"
   password = "emqx_password"

   # 输入数据的格式
   data_format = "json"
   
   # 配置该input的名字,官方文档中是写“the base name of the measurement”,此measurement不仅仅    # 可以指InfluxDB中的measurement,还可以指代该input的名字,可以在Process插件中指定该名字进行处理
   name_override = "boy"
   
   #字段配置(通过该字段形成measurement名,例如boy_java、boy_go..)
   json_string_fields = ["language"]
   tags = {tag1="language"}
   

# girl
 [[inputs.mqtt_consumer]]
   alias = "girl"
   servers = ["tcp://host.docker.internal:1883"]
   # 监听的emqx主题
   topics = ["/girl/+"]
   username = "emqx_username"
   password = "emqx_password"

   # 输入数据的格式
   data_format = "json"
   
   # 配置该input的名字,官方文档中是写“the base name of the measurement”,此measurement不仅仅    # 可以指InfluxDB中的measurement,还可以指代该input的名字,可以在Process插件中指定该名字进行处理
   name_override = "girl"
   
   #字段配置(通过该字段形成measurement名,例如girl_java、girl_go..)
   json_string_fields = ["language"]
   tags = {tag1="language"}

数据收集到了,接着处理一下数据吧,配置Process插件:


###############################################################################
#                            PROCESSOR PLUGINS                                #
###############################################################################

# 调试时可以打开查看input插件收集到的数据
# [[processors.printer]]

[[processors.template]]
  # 这里的作用是只处理名为boy的input插件收集的数据
  namepass=["boy"]
  # 这里的作用是新增一个key为real_measurement_name的tag,并且赋值为template
  tag = "real_measurement_name"
  # 提取input收集的数据中key为language的value,并且和boy_进行拼接
  template = 'boy_{{ .Tag "language" }}'
  
[[processors.template]]
  # 这里的作用是只处理名为girl的input插件收集的数据
  namepass=["girl"]
  tag = "real_measurement_name"
  # 提取input收集的数据中key为language的value,并且和girl_进行拼接
  template = 'girl_{{ .Tag "language" }}'

# 该插件的作用是将所有数据girl、 boy这两个插件的measurement改成key为real_measurement_name的值,
# 也就是girl_java、girl_go、boy_java、boy_go..
[[processors.converter]]
  namepass=["girl", "boy"]
  [processors.converter.tags]
    measurement = ["real_measurement_name"]

# 调试时可以打开查看经过Process插件处理过后的数据
#[[processors.printer]]


配好处理,接下来就要配置数据输出到influxDB了,也就是配置output插件:

[[outputs.influxdb_v2]]
  urls = ["http://host.docker.internal:8087"]
  token = "apiToken"
  organization = "organization"
  bucket = "bucketname"
  # 当前分measurement是在同一个bucket中,如果需要分bucket的话,可以研究一下bucket_tag这个配置
  # bucket_tag = ""

配置好基础参数和上面的内容后,就可以打开telegraf的日志查看它的处理数据的情况了,或许你看不懂,那不要怕,我们再来了解一下数据在telegraf插件之间流转时的Line Protocol格式,了解完以后就看得懂日志了。

4. 数据传输过程的Line Protocol协议

面对大量的金童玉女,telegraf如果一个个去给他们填简历,那可忙不过来,因此他想了一个Line Protocol协议。协议如下:

男 名字=大鼻涕,身高=188 爱好=挖鼻屎 骗进来的时间20240606

怕大家看不懂中文下面翻译一个英文版的:

boy(measurement), name(tag)=big_bi_ti body_length(field)=188 pi_hao(field)=pick_shit 20240606(timestamp)

简而言之,这个Line Protocol协议的结构如下

测量(Measurement):数据的名称,用于对不同类型的数据进行分类和标识。

标签(Tags):键值对,可选但强烈推荐使用。标签在数据库中被索引,查询速度较快。

字段(Fields):键值对,必填项。字段包含实际的数据值,与标签不同,字段不会被索引。

时间戳(Timestamp):可选项,指定数据点记录的时间。如果未指定,InfluxDB 使用服务器的当前时间。

知道了进来的数据都遵守这个协议就好办了,我们…

=.= 接下来等再更吧,打这么多字累了…

(上面只是我最近使用时,翻阅官方文档和搜索所构建的知识体系,内容大都来自官方文档,尽量做到有据可依,如描述有误或者不准确,欢迎指正!不胜感激!!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值