通过python脚本和zabbix配合监控zookeeper的节点数
需求描述:
在日常zabbix监控zookeeper的时候,无法通过shell来获取zookeeper的具体节点信息,没有开放具体的接口,只能通过交互式的shell获取
python提供了操作zookeeper的api,我们可以使用python脚本结合zabbix来监控zookeeper的服务端是否上线
1.安装相关的依赖
由于python客户端依赖c的客户端所以要先安装c版本的客户端
cd /usr/local/src
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz
cd /usr/local/src/zookeeper-3.4.6/src/c
./configure
make
make install
# 验证是否成功,测试是否能够连上zookeeper
[root@localhost c]# ./cli_mt 1.1.1.1:9181
Watcher SESSION_EVENT state = CONNECTED_STATE
Got a new session id: 0x35f2e9cf58103e6
2.下载安装zkpython
wget https://pypi.python.org/packages/source/z/zkpython/zkpython-0.4.2.tar.gz
tar -zxf zkpython-0.4.2.tar.gz
cd zkpython-0.4.2
python setup.py build
python setup.py install
# 加入环境变量
# vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
source /etc/profile
或者
# echo "/usr/local/lib" >> /etc/ld.so.conf
# /sbin/ldconfig
3.测试
使用ipython访问zookeeper
[root@localhost zkpython-0.4.2]# ipython
Python 2.7.5 (default, Aug 4 2017, 00:39:18)
Type "copyright", "credits" or "license" for more information.
IPython 5.5.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
import zookeeper as zoo
# 初始化连接到集群
zk = zoo.init("1.1.1.1:2181")
# 获取所有节点
zoo.get_children(zk, "/", None)
# 获取voice-server所有节点
nodes = zoo.get_children(zk, "/sdk/voice/server/info", None)
# 获取zookeeper节点中voice-server的个数
print len(nodes)
# 具体代码
#!/usr/bin/python
#encoding:utf-8
import zookeeper as zoo
import sys
# 设置zookeeper的日志等级,避免python输出大量无用信息
zoo.set_debug_level(zoo.LOG_LEVEL_ERROR)
DEFAULT_TIMEOUT = 30000
class zookServer():
def __init__(self, timeout=DEFAULT_TIMEOUT):
# 初始化连接到集群
self.timeout = timeout
self.zk = zoo.init("ip1:2181,ip2:2181,ip3:2181")
# 获取zookeeper所有的节点长度
def get_children_len(self, _path, watcher = None):
self.connected = True
# 获取voice-server所有节点
nodes = zoo.get_children(self.zk, _path, watcher)
# 获取zookeeper节点中voice-server的个数
return len(nodes)
if __name__ == "__main__":
z = zookServer()
print z.get_children_len('/sdk/voice/server/info')