Zabbix应用五:Zabbix监控多Tomcat

时间:2022-03-06 16:22:26

利用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('\n'))
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('\n')
return tomcat_pid #2,get tomcat status def getStatus(cmd,args,pid):
value=commands.getoutput('%s -%s %s' % (cmd,args,pid)).strip().split('\n')
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 + '\n')
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监控页面中创建监控项,来接收存放客户端发来的数据。

首先创建一个模版,方便套用:

配置-模版-创建模版,输入模版的名字和应用的主机即可。

创建监控项:

配置-模版-监控项-创建监控项,如下图:

Zabbix应用五:Zabbix监控多Tomcat

注意其中类型、键值和信息类型几项。这里信息类型选择浮点行,是因为采集到的数据有小数。

按照以上创建所有需要监控的项。

2、添加计划任务,每分钟采集一次数据发送给zabbix服务端:

*/1 * * * * /scripts/zabbix_tomcat/jvmstatus.py

3、如果一切正常,在zabbix监控页面‘最新数据’中即可收到发来的数据,并且可自动生成图形,如下图:

Zabbix应用五:Zabbix监控多Tomcat

点击右侧的图形,就可以看到趋势图了:

Zabbix应用五:Zabbix监控多Tomcat

最后生成模版:

zbx_export_templates.xml