3月 292019
 

Zabbix提供了开放的协议,因此可以根据协议,实现自定义的Zabbix Agent。Zabbix自带的Agent已经很很稳定,而且基本可以做到全平台的适配,建议使用官方Agent,这里只是学习,了解Zabbix协议,探索使用。

Zabbix 协议

在Zabbix官网文档中,可以找到Zabbix的协议详细说明,以及数据交互的详细过程。

Header Protocol

Zabbix通信的头部协议结构: https://www.zabbix.com/documentation/4.0/manual/appendix/protocols/header_datalen 每次通信都需要的。这个协议在zabbix 4.0版本中进行了更新,因此导致部分第三方不标准的采集客户端无法使用,这里就包括了使用普遍:Orabbix,部分人升级到Zabbix到4.0之后不能使用此组件,就是这个原因导致,具体修复方法请查看这个issue https://github.com/smartmarmot/DBforBIX/issues/62

Passive and active agent checks

主动与被动检查协议:https://www.zabbix.com/documentation/4.0/manual/appendix/items/activepassive 此协议介绍了如何实现Agent主动与被动检查,以及具体的数据交互过程

Zabbix sender protocol

Zabbix Trapper采集协议:https://www.zabbix.com/documentation/4.0/manual/appendix/items/trapper 使用此协议可以实现zabibx_sender命令的功能,之前我已经使用此协议实现了一个mysql 监控工具,工具介绍:https://blog.cactifans.com/2018/08/08/Zabbix%E7%9B%91%E6%8E%A7MySQL%E5%B7%A5%E5%85%B7/ 源码:https://github.com/canghai908/zabbix-mymon

Agent-go实现

了解Zabbix协议之后,就可以根据协议使用不同语言实现Zabbix Agent的各种功能。这里使用 https://github.com/fujiwara/go-zabbix-get 实现一个支持被动检查的Agent,源码及打包好的Agent的centos 7_x64rpm包
源码地址:https://github.com/canghai908/agent-go.git
RPM包:https://dl.cactifans.com/tools/agent-go-0.0.1-1.el7.x86_64.rpm
模版:https://dl.cactifans.com/tools/template_linux_agent_go.tar.gz

3c39e829e1611543170b3f26fad128a123270234  agent-go-0.0.1-1.el7.x86_64.rpm

目前一共实现里6个监控指标的被动采集,数据采集使用 https://github.com/shirou/gopsutil

ItemKey说明单位
system.info操作系统信息
agent.go.ping类似agent.ping检查agent状态
cpu.modelcpu类型
mem.total总内存MB
mem.used已使用内存MB
mem.usedper内存使用率%

源码编译

如需修改或编译生成二进制,可使用以下方法
golang版本1.11以上

git clone https://github.com/canghai908/agent-go.git
cd agent-go/src/
export GO111MODULE=on
export GOPROXY=https://goproxy.io
go build

即可编译成功

使用

目前只提供centos7_x64位rpm包,下载并安装RPM包

wget https://dl.cactifans.com/tools/agent-go-0.0.1-1.el7.x86_64.rpm
rpm -ivh agent-go-0.0.1-1.el7.x86_64.rpm

启动agent

systemctl start agent-go

查看Agent进程

ps -ef|grep agent-go

可以看到agent已经启动

root      5018     1  1 10:12 ?        00:00:00 /usr/bin/agent-go -c /etc/agent-go/agent-go.ini

Agent配置文件位于

/etc/agent-go/agent-go.ini

配置文件介绍

Debug 日志级别1-7
ListenIP agent监听的ip,默认为0.0.0.0所有ip
ListenPort agent监听的port,默认为10049
LogFile 日志路径,默认为/var/log/agent-go.log

Zabbix中导入模版,新建一个主机,并关联导入的模版,主机名可以随意,IP为部署agent的机器ip,端口为10049

添加并关联模版

不出意外一会就可以看到主机的Agent状态已变为可用状态

并能在Last data里看到最新的数据

Debug

如果想看到Agent返回的数据及交互,可以将配置文件里的Debug配置为最高模式7,使用

systemctl restart agent-go

重启agent,使用

tail -f /var/log/agent-go.log

即可看到数据的交互

2019/03/29 10:30:09.049 [D]  key: mem.total =======> 7982
2019/03/29 10:30:09.246 [D]  key: mem.used =======> 3854
2019/03/29 10:30:10.553 [D]  key: mem.usedper =======> 4.254296006902387E+01
2019/03/29 10:30:24.540 [D]  key: agent.go.ping =======> 1
2019/03/29 10:30:29.291 [D]  key: agent.go.ping =======> 1
2019/03/29 10:30:30.292 [D]  key: cpu.model =======> Intel(R) Xeon(R) CPU           L5520  @ 2.27GHz
2019/03/29 10:30:31.292 [D]  key: mem.total =======> 7982
2019/03/29 10:30:31.317 [D]  key: cpu.model =======> Intel(R) Xeon(R) CPU           L5520  @ 2.27GHz
2019/03/29 10:30:32.293 [D]  key: mem.used =======> 3854
2019/03/29 10:30:33.294 [D]  key: mem.usedper =======> 4.253503191571101E+01
2019/03/29 10:30:34.294 [D]  key: system.info =======> centos 7.6.1810
2019/03/29 10:30:35.295 [D]  key: agent.go.ping =======> 1
2019/03/29 10:30:36.297 [D]  key: cpu.model =======> Intel(R) Xeon(R) CPU           L5520  @ 2.27GHz
2019/03/29 10:30:37.297 [D]  key: mem.total =======> 7982
2019/03/29 10:30:38.297 [D]  key: mem.used =======> 3854
2019/03/29 10:30:39.298 [D]  key: mem.usedper =======> 4.2535080854928985E+01
2019/03/29 10:30:40.299 [D]  key: system.info =======> centos 7.6.1810
2019/03/29 10:30:40.800 [D]  key: system.info =======> centos 7.6.1810

压力测试

使用https://github.com/monitoringartist/zabbix-agent-stress-test 对agent进行压力测试,使用参数如下

./zabbix-agent-stress-test.py -s 127.0.0.1 -k "agent.go.ping" -t 20

压测结果

agent内存及cpu使用

总结

Zabbix提供完全开源的源码,因此如zabbix 自带功能无法实现,可以通过其协议实现自定义监控。

如果觉得我的文章对您有用,请关注我的公众号,有更多技术干货!

微信
打赏

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)