文章目录
zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,此文档为自定义监控项的方式。
zabbix获取键值的原理为:
zabbix-server请求zabbix-agent的key,agent的key向server端返回对应的值
1、编写自定义监控脚本
首先编写自定义监控脚本,本文以监控以太坊私链是否自动出块为例。
- 脚本名称:eth-height.sh
- 脚本目录(这个目录可以自定义):/etc/zabbix/script
- 脚本内容:
#!/bin/bash
# 获取前一个区块高度
frontblock=`cat /etc/zabbix/script/block.txt`
# 在宿主机中执行docker容器中/mnt目录下的脚本,获取miner服务区块高度
newblock1=$(docker exec -i bsc-miner /bin/bash -c 'bash /mnt/block.sh'|awk -F '"' '{print $10}')
# 将获取到的16进制区块高度转换为10进制
newblock2=`printf %d $newblock1`
#将获取的最新的区块高度与前一个值进行对比
value=$((newblock2-frontblock))
#输出差值
echo $value
# 将当前获取的最新区块高度重定向至/etc/zabbix/script/block.txt
echo $newblock2 > /etc/zabbix/script/block.txt
- 脚本说明:通过以太坊命令获取当前节点最新区块高度,并且输出节点当前最新区块高度与上一个高度的差值,通过zabbix判断是否实时出块
2、修改zabbix_agentd.conf配置文件
# vim /etc/zabbix/zabbix_agentd.conf
# 自定义监控键值文件路径
259 Include=/etc/zabbix/zabbix_agentd.d/*.conf
#默认为0,此处我们将它改为1,改为1以后,表示用户自定义的脚本中可以包含特殊字符
271 UnsafeUserParameters=1
3、自定义键值文件
# cd /etc/zabbix/zabbix_agentd.d/
# vim userparameter_blockheight.conf
# 获取bsc区块链miner服务最新区块高度与前一个区块高度的差值
UserParameter=eth.block,sh /etc/zabbix/script/eth-height.sh
注:
eth.block 为自定义的键值,
sh /etc/zabbix/script/eth-height.sh 获取键值的方式
4、重启zabbix agent
添加完成以后,重启zabbix_agentd才会生效。
# systemctl restart zabbix-agent
5、验证自定义key
使用zabbix_get命令看能否获取数据,该命令只能用于获取agent监控方式的key,不能获取sample check、JMX等其他监控方式的key数据
以下命令在zabbix-server服务器中执行测试
# zabbix_get -s 客户端IP地址 -p客户端端口 -k eth.block (自定义的键值)
6
可看到已获取到值,自定义键值成功
6、添加自定义监控过程中的报错及解决方法
- 6.1 zabbix自定义监控提示:ZBX_NOTSUPPORTED: Unsupported item key.
使用zabbix自定义监控内容,执行zabbix_get提示:ZBX_NOTSUPPORTED: Unsupported item key.
问题原因:添加键值后,未重启zabbix,zabbix-server不能获取该键值,将zabbix_agentd重启即可正常获取内容。
- 6.2 zabbix获取键值报错:cannot create /etc/zabbix/script/block.txt: Permission denied
出现的原因的是:没有权限进行读、写、创建文件、删除文件等操作
解决的办法:
# chmod -R 777 某一目录或文件
- 6.3、zabbix获取键值报错:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/btc/json: dial unix /var/run/docker.sock: connect: permission denied
docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。
解决方法1
使用sudo获取管理员权限,运行docker命令
解决方法2:
docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
cat /etc/gshadow|grep docker 查看docker用户组是否被创建,否则需要进行创建
groupadd docker # 添加docker用户组
gpasswd -a zabbix docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
重启zabbix客户端,重新获取键值,不再报错