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客户端,重新获取键值,不再报错