Zabbix_get的结果是contacting
在监控zookeeper的时候,我写了一个简单的脚本checkZKrole.sh
来获取当前的角色,如下:
1
2
3
4[root@zookeeper1 ~]# cat checkZKrole.sh
#!/bin/bash
role=$(sh /usr/zookeeper/bin/zkServer.sh status| cut -d" " -f2)
echo $role
执行效果如下:
本地执行没问题,然后在zabbix-agentd.conf
里也把这个脚本添加到自定义监控项里:
重启了zabbix-agent
后,发现一个很奇怪的现象,在zabbix-server里使用zabbix-get
去拿值的时候拿到的是contacting
,如图:
从上图可见,同样在127.1.1.28里取值,proc.num
没问题,而且是秒取,但是这个自定义项就取不到。
我怀疑是脚本的问题,于是我改成一个单纯的echo
,如下:
1
2
3
4
5[root@zookeeper1 ~]# cat checkZKrole.sh
#!/bin/bash
role=$(sh /usr/zookeeper/bin/zkServer.sh status| cut -d" " -f2)
#echo $role
echo woshinibaba
这一次的返回值是正常的,可见不是脚本的问题:
那是他妈的什么问题,真是见了鬼了…后来想干脆写一个crontab,让crontab把角色写到本地,然后再用cut命令切开把结果当做zabbix_get的目标。但是在这里发现了问题所在,当我的crontab是* * * * * cd /usr/zookeeper/bin/; ./zkServer.sh status > /tmp/role.txt > /dev/null 2>&1
,发现/tmp/role.txt
里根本没有值,应该是crontab在执行有参数的命令的时候出现了问题。
后来发现了,原来是sudo搞得鬼,如果是由于zookeeper是root用户启动的,所以只有root用户能成功访问,如果是sudo的话,那么就会返回“Error contacting service. It is probably not running.”,所以截取出来的部分就是contacting,如图:
zabbix_get执行脚本超时
在监控mq队列时候,同样也需要到了自定义监控项,我写了几个简单的脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[root@dahuatech zabbix]# cat monitor_mq.sh
#!/bin/sh
ip=$1
queuename=$2
type=$3
case ${type} in
Pending)
curl -s -u 'admin:admin' "http://${ip}:8161/admin/queues.jsp"|grep "${queuename}</a></td>" -A 5|sed -n '2p'|egrep -o '[0-9]+'
;;
Enqueued)
curl -s -u 'admin:admin' "http://${ip}:8161/admin/queues.jsp"|grep "${queuename}</a></td>" -A 5|sed -n '4p'|egrep -o '[0-9]+'
;;
Dequeued)
curl -s -u 'admin:admin' "http://${ip}:8161/admin/queues.jsp"|grep "${queuename}</a></td>" -A 5|sed -n '5p'|egrep -o '[0-9]+'
;;
esac
配置了UserParameter=activemq.check[*],sh /etc/zabbix/monitor_mq.sh $1 $2 $3
放到zabbix-agentd.conf
里,重启了zabbix-agent。在zabbix-server配置了对应的item,如图:
然后在本地执行这个脚本,发现回值秒取,但是同样在zabbix-get里使用,就是timeout:
后来发现原来自己摆了一个乌龙,在zabbix-get的时候不能使用{HOST.IP}
,因为zabbix-get
不识别他,但是zabbix-server
是识别的,所以在脚本里把ip=$1
改成ip=真实的IP地址即可。