利用Zabbix Trapper方式监控多Tomcat实例
Zabbix自带的模版(JMX Tomcat、JMX Generic)默认只能在一台机器上监控一个tomcat实例(因为监控项中的key不能重复),而实际生产环境中一台服务器往往会启动多个tomcat实例,这就显得比较鸡肋。
然而,我们可以自定义监控项,将搜集到的jvm数据发送给zabbix服务端,然后创建监控项、图形等。
基本思路:
1、在tomcat服务器中编写自动发现tomcat服务的脚本,并搜集每个tomcat实例的名称(作为辨别)和PID(便于使用jstat工具搜集JVM数据)。
2、调用JAVA的jstat工具,分别获取每个tomcat的性能参数,保存到临时文件中。
3、在Zabbix服务端设置监控项,填写监控名称、key等信息
4、调用zabbix_sender命令,将保存数据的文件通过Zabbix Trapper通道发送给Zabbix服务端。
5、Zabbix服务端收到数据,根据数据创建图形。
好,思路捋清后,接下来就是撸撸撸起袖子加油干干干:
1、Tomcat服务上运行的数据搜集脚本如下:
#!/usr/bin/python import os import sys import commands tomcats=[] tomcat_pid={} jstat='/data/java/jdk1.7/bin/jstat' jstack='/data/java/jdk1.7/bin/jstack' zbx_sender='/usr/local/zabbix/bin/zabbix_sender' zbx_tmp_file='/tmp/zbx_tmp_file' HostName='192.168.154.6' jstat_dict = { "S0":"Young.Space0.Percent", "S1":"Young.Space1.Percent", "E":"Eden.Space.Percent", "O":"Old.Space.Percent", "P":"Perm.Space.Percent", "FGC":"Old.Gc.Count", "FGCT":"Old.Gc.Time", "YGC":"Young.Gc.Count", "YGCT":"Young.Gc.Time", "GCT":"Total.Gc.Time", "PGCMN":"Perm.Gc.Min", "PGCMX":"Perm.Gc.Max", "PGC":"Perm.Gc.New", "PC":"Perm.Gc.Cur", "Tomcat.Thread":"Tomcat.Thread" } #1,get tomcat name & pid def discoveryNamePid(): getTomcatName_cmd="ps -ef | grep '.service'| grep -v grep | awk -F '/' '{print $(NF-1)}'| awk -F '.' '{print $1}'" ResName=os.popen(getTomcatName_cmd).readlines() for name in ResName: tomcats.append(name.strip(' ')) for i in tomcats: cmd="ps -ef | grep %s | grep -v grep | awk '{print $2}'" % i pid=os.popen(cmd).read() tomcat_pid[i]=pid.strip(' ') return tomcat_pid #2,get tomcat status def getStatus(cmd,args,pid): value=commands.getoutput('%s -%s %s' % (cmd,args,pid)).strip().split(' ') kv=[] vv=[] for i in value[0].split(' '): if i != '': kv.append(i) for i in value[1].split(' '): if i != '': vv.append(i) data=dict(zip(kv,vv)) return data def getThread(pid): value=commands.getoutput('%s %s | grep http | wc -l' % (jstack,pid)) data={"Tomcat.Thread":value} return data def fileEmpty(): with open(zbx_tmp_file,'w') as f: f.truncate() def getJVMStatus(TomcatName,pid): gcutil_data=getStatus(jstat,"gcutil",pid) gccapacity_data=getStatus(jstat,"gccapacity",pid) thread_data=getThread(pid) data_dict=dict(gcutil_data.items()+gccapacity_data.items()+thread_data.items()) for jmxkey in data_dict.keys(): if jmxkey in jstat_dict.keys(): cur_key=jstat_dict[jmxkey] zbx_data="%s jstat[%s,%s] %s" %(HostName,TomcatName,cur_key,data_dict[jmxkey]) with open(zbx_tmp_file,'a') as file_obj: file_obj.write(zbx_data + ' ') def sendData(): send_cmd="%s -z 192.168.153.12 -s '192.168.154.6' -i %s" % (zbx_sender,zbx_tmp_file) os.system(send_cmd) if len(zbx_tmp_file) !=0: fileEmpty() for TomcatName in discoveryNamePid().keys(): pid=tomcat_pid[TomcatName] getJVMStatus(TomcatName,pid) sendData()
代码大体思路就是:
.1、定义需要搜集项的数据名称
.2、收集系统中运行的tomcat实例,取名称和PID
.3、根据PID调用jstat命令生成jvm性能数据
.4、将生成的数据存放在临时文件中
.5、调用zabbix_sender命令,将临时文件发送给zabbix服务端
生成的临时文件内数据格式如下(节选):
192.168.154.6 jstat[content,Young.Space1.Percent] 34.38 192.168.154.6 jstat[content,Young.Space0.Percent] 0.00 192.168.154.6 jstat[content,Young.Gc.Time] 6.342 192.168.154.6 jstat[content,Old.Gc.Time] 0.221 192.168.154.6 jstat[content,Perm.Gc.New] 75264.0 192.168.154.6 jstat[content,Total.Gc.Time] 6.564 192.168.154.6 jstat[product,Young.Space1.Percent] 0.00 192.168.154.6 jstat[product,Young.Space0.Percent] 87.50 192.168.154.6 jstat[product,Young.Gc.Count] 3990 192.168.154.6 jstat[product,Young.Gc.Time] 22.918 192.168.154.6 jstat[product,Old.Gc.Time] 1.597 192.168.154.6 jstat[product,Perm.Gc.New] 131072.0 192.168.154.6 jstat[product,Total.Gc.Time] 24.516 192.168.154.6 jstat[order,Young.Space1.Percent] 0.00 192.168.154.6 jstat[order,Young.Space0.Percent] 3.23 192.168.154.6 jstat[order,Eden.Space.Percent] 48.40 192.168.154.6 jstat[order,Old.Space.Percent] 59.65 192.168.154.6 jstat[order,Perm.Space.Percent] 83.46
其中,第一列是主机名(注意:和zabbix配置文件中的Hostname相同),第二列是key(创建监控项时的key),第三列就是值了。
2、客户端采集到数据后,zabbix服务端需要接收这些数据。但是数据放在哪呢?监控项!需要在zabbix监控页面中创建监控项,来接收存放客户端发来的数据。
首先创建一个模版,方便套用:
配置-模版-创建模版,输入模版的名字和应用的主机即可。
创建监控项:
配置-模版-监控项-创建监控项,如下图:
注意其中类型、键值和信息类型几项。这里信息类型选择浮点行,是因为采集到的数据有小数。
按照以上创建所有需要监控的项。
2、添加计划任务,每分钟采集一次数据发送给zabbix服务端:
*/1 * * * * /scripts/zabbix_tomcat/jvmstatus.py
3、如果一切正常,在zabbix监控页面‘最新数据’中即可收到发来的数据,并且可自动生成图形,如下图:
点击右侧的图形,就可以看到趋势图了:
最后生成模版: