专家专栏|使用agent2自定义插件采集通过MQTT协议发送的数据

2020-09-16 16:16:33 浏览数 (1)

感谢社区专家Wanger供稿!

Wanger | Zabbix开源社区活跃用户

Zabbix运维工程师,熟悉Zabbix开源监控系统的架构。乐于分享Zabbix运维经验,个人公众号“运维开发故事”。

擅长领域:Zabbix基础设施运维以及Zabbix图形化展示。

MQTT协议简介

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的物联网通信协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。MQTT被广泛用于汽车,制造业,电信,石油和天然气等行业以及通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器。

MQTT有两个组件:

  • MQTT代理:MQTT代理是通信的中心点。代理负责在客户端之间分派所有消息。
  • MQTT客户端:MQTT客户端是连接到broker的任何设备。发送消息的客户端是发布者。接收消息的客户端是订阅者。要接收消息,客户端必须订阅该消息的主题。

部署mqtt协议的服务

实现了mqtt协议的服务器有很多种,这里我使用了mosquitto服务在centos上部署

代码语言:javascript复制
mkdir data && cd data
wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz
tar -zxvf mosquitto-1.6.8.tar.gz 
cd mosquitto-1.6.8 
make && make install
ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
ldconfig

我们可以编辑配置文件mosquitto.conf,修改监听地址,并设置认证用户密码,并在启动的时候使用-c 参数指定配置文件

部署完成后启动borker服务,我这里使用默认配置

代码语言:javascript复制
mosquitto -v

订阅sensor主题

代码语言:javascript复制
mosquitto_sub -v -t sensor

向sensor主题发布内容

代码语言:javascript复制
mosquitto_pub -t sensor  -m 12

发布完之后便会在订阅者客户段接收到

使用zabbxi agent2收集发布者发布的消息

zabbix agent2在这里扮演的是一个订阅者的角色,zabbix agent2使用GO语言开发,这样我们可以通过go语言编写一些自定义插件来实现我们的监控需求,插件相对于自定义脚本优点之一是插件是长连接的,而自定义脚本每次处理用户指标时都会fork一个新进程,关于agent与agent2的区别可以查看官方文档

点击查看官方文档

本文通过zabbix自定义插件实现mqtt协议的消息采集,关于agent2自定义插件介绍可查看官方文档

点击查看官方文档

或者查看Zabbix认证专家米宏翻译的文章(特别好)

官方博文 | 为Zabbix Agent 2 开发插件

01-下载zabbix agent2源码并将自定义插件编译

mqtt插件由维塔利·朱拉夫列夫(Vitaly Zhuravlev)编写,地址https://github.com/v-zhuravlev/zbx_plugin_mqtt,就是下面这位大神,其实刮了胡子还是挺帅的,当然仅次于我。

代码语言:javascript复制
yum install golang
git clone https://git.zabbix.com/scm/zbx/zabbix.git --depth 1 zabbix-agent2
cd zabbix-agent2
git submodule add https://github.com/v-zhuravlev/zbx_plugin_mqtt.git src/go/plugins/mqtt

02-导入mqtt插件

代码语言:javascript复制
vi src/go/plugins/plugins.go
代码语言:javascript复制
package plugins
  
import ( 
_ "zabbix.com/plugins/log" 
_ "zabbix.com/plugins/systemrun" 
_ "zabbix.com/plugins/zabbix/async" 
_ "zabbix.com/plugins/zabbix/stats" 
_ "zabbix.com/plugins/zabbix/sync" 
_ "zabbix.com/plugins/mqtt"
)

03-编译安装zabbix agent2

代码语言:javascript复制
./bootstrap.sh 
pushd . 
cd src/go/ 
go mod vendor 
popd 
./configure --enable-agent2 --enable-static 
make install

04-编辑配置文件

这里我调整了日志级别,方便前台调试

可选参数

  1. Plugins.MQTTSubscribe.Username = <mqtt用户名>
  2. Plugins.MQTTSubscribe.Password = <mqtt密码>
  3. Plugins.MQTTSubscribe.ClientID = zabbix-agent2-mqtt-client //如果未设置将自动生成ClientID
  4. Plugins.MQTTSubscribe.Timeout = 5 //定义此插件的连接超时时间,如果不定义将使用zabbix agent2的超时时间

05- 启动zabbix_agent2

代码语言:javascript复制
cd /root/zabbix_agent/src/go/bin 
./zabbix_agent2 -c ../conf/zabbix_agent2.conf

MQTT插件实现了一个Watcher接口,Watcher接口使用的push模型,当有新数据产生,会主动push给服务器

08- Zabbix创建监控项

键值示例如下

代码语言:javascript复制
mqtt.subscribe[<MQTT broker URL>,<MQTT topic>]

注意监控项类型必须是主动式

我们可以通过mqtt client来发送一些数据

可以在zabbix agent2前台看到数据实时推送给了zabbix server,当没有新数据产生的时候,agent2也会每隔两分钟(默认)连接server的10051端口来请求有关监控项的信息

0 人点赞