日前遇到dubbo注册到zookeeper服务失败的情况,失败后dubbo不会自动重新注册,会导致服务访问问题Not found export service....异常
研究后写了个Python脚本,利用telnetlib 监控dubbo状态,失败后重启tomcat重新注册。
利用zabbix 监控触发器,远程执行cmd脚本,重启通tomcat服务,dubbo会自动重新注册
#!/usr/bin/env python # coding:utf-8 #__Author: Evan __ """ 先用telnet命令登录dubbo 20880端口 如果dubbo端口不存在,即服务关闭,会有异常Exception 必须处理 try: xxx exception: xxx 然后判断一下dubbo状态 status 如果OK就正常,否则异常 我用了zabbix自定义监控项,正常返回1, 异常为0 """ import time from telnetlib import Telnet HOST = '192.168.100.31' PORT = 20880 status_cmd = 'status -l' def check_dubbo_status(Host=None, Port=None, status_cmd=''): tn = Telnet() try: tn.open(Host, Port) tn.write(status_cmd + '\n') time.sleep(2) tn.write('exit\n') res = tn.read_very_eager() return res except Exception as e: return 0 if __name__ == '__main__': result = check_dubbo_status(Host=HOST, Port=PORT, status_cmd=status_cmd) if result != 0: res = result.split('\n') restr = res[9].split('|') if restr[2].strip() == 'OK' print 1 print 'dubbo registry status ok' else: print 0 else: print 0
利用zabbix 自定义监控项,服务状态异常时返回0, 触发zabbix报警,远程执行cmd命令,在服务器上重启tomcat, dubbo重新注册到zookeeper上
1、将脚本放到alertscript目录中,在zabbix_agentd.conf 文件中添加自定义项
UserParameter=dubbo.status, /usr/local/zabbix/alertscripts/chk_dubbo.py
2、重启zabbix客户端服务
3、在zabbix 上添加新的监控项,设置触发器报警
4、设置触发器动作,在动作---操作中配置 在当前主机上执行远程命令
注意!:zabbix的脚本要赋执行权限,并且脚本的运行用户必须是zabbix,
但zabbix用户没有重启tomcat服务的权限,所以需要sudo授权,zabbix用户有sudo权限可以执行tomcat重启脚本命令