何为自动发现?首先我们监控多tomcat实例,如果一个个实例地添加或许可以完成当前需求。但是日后随着实例的增多,再手动一个个去添加就十分不方便了。这时候需要自动发现这个功能,来帮助我们自动添加监控tomcat实例。本文就以监控tomcat线程为例,来实现这个自动发现的功能。这里zabbix版本为3.0。
可以理解为这个脚本能够打印出当前服务器上所有的tomcat实例名称。zabbix会定期执行这个脚本,做到自动发现当前所有的tomcat实例,脚本放在zabbix-agent安装路径的scripts目录下。而下一步就是给找到的tomcat实例添加所需要监控的值。下面先看脚本:
# cat discover_jvm.py #!/usr/bin/Python2.7 #Usage: discover tomcat_app #Last Modified: import subprocess import json #args为自己定义查找项目名字的方式,由于各自部署方式的不同,这里需要根据实际情况来写命令。 args="find /opt/app/applications -name 'catalina.properties' | sort -n | uniq | awk -F'/' '{print $5}'" t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0] apps=[] for app in t.split('\n'): if len(app) != 0: apps.append({'{#APP_NAME}':app}) #打印出zabbix可识别的json格式 print json.dumps({'data':apps},indent=4,separators=(',',':'))
执行打印结果如下所示:
# chmod a+x discover_jvm.py 赋予执行权限 # chown zabbix:zabbix discover_jvm.py 添加属主为zabbix用户 # ./discover_jvm.py { "data":[ { "{#APP_NAME}":"app1" }, { "{#APP_NAME}":"app2" } ] } 这里打印出app1、app2两个实例,以后要是有其他实例,也能够同样打印出来。
创建监控项脚本这个脚本的作用是打印出tomcat实例需要监控的项,本例为线程数。该脚本执行需要两个参数,$1为实例名,$2为监控项名。打印的结果为一个整型的数字。记得跟上面的脚本放在同样的位置,并赋予执行权限和正确的属主。
# cat app_status.sh #!/bin/bash #Usage: tomcat_app status #Last Modified: app=$1 status=$2 pid=`ps -ef | grep "$app" | grep -v grep | grep -v "$0"| awk '{print $2}'` case $status in thread.num) /opt/programs/jdk1.7.0_67/bin/jstack "$pid" | grep http | wc -l ;; *) echo "Usage:$0 {app_name status[thread.num]}" exit 1 ;; esac #执行 #./app_status.sh app_name thread.num
日后如果需要添加新的监控项,只需修改上面的脚本,改变$2的选择即可。
zabbix客户端配置在客户端配置文件中添加自定义监控的key,其实就是给我们监控选项取个名字,然后如何获取这个值。示例如下:
#变量1的key为custom.discover.jvm_app,为自动发现的tomcat实例名,获取方式即为执行dicover_jvm脚本 UserParameter=custom.discover.jvm_app,/opt/programs/bd-zabbix-agentd_3.0.4/scripts/discover_jvm.py #变量2的key为custom.app.thread_num,[*]表示需要变量支持,这里即为$1、$2(本例中$2的意义不同,监控项就不同)获取方式为执行app_status.sh脚本 UserParameter=custom.app.thread_num[*],/opt/programs/bd-zabbix-agentd_3.0.4/scripts/app_status.sh $1 $2