Zabbix应用五:Zabbix监控多Tomcat
利用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=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.split(' '):
if i != '':
kv.append(i)
for i in value.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
zbx_data="%s jstat[%s,%s] %s" %(HostName,TomcatName,cur_key,data_dict)
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
getJVMStatus(TomcatName,pid)
sendData()
代码大体思路就是:
.1、定义需要搜集项的数据名称
.2、收集系统中运行的tomcat实例,取名称和PID
.3、根据PID调用jstat命令生成jvm性能数据
.4、将生成的数据存放在临时文件中
.5、调用zabbix_sender命令,将临时文件发送给zabbix服务端
生成的临时文件内数据格式如下(节选):
192.168.154.6 jstat 34.38
192.168.154.6 jstat 0.00
192.168.154.6 jstat 6.342
192.168.154.6 jstat 0.221
192.168.154.6 jstat 75264.0
192.168.154.6 jstat 6.564
192.168.154.6 jstat 0.00
192.168.154.6 jstat 87.50
192.168.154.6 jstat 3990
192.168.154.6 jstat 22.918
192.168.154.6 jstat 1.597
192.168.154.6 jstat 131072.0
192.168.154.6 jstat 24.516
192.168.154.6 jstat 0.00
192.168.154.6 jstat 3.23
192.168.154.6 jstat 48.40
192.168.154.6 jstat 59.65
192.168.154.6 jstat 83.46
其中,第一列是主机名(注意:和zabbix配置文件中的Hostname相同),第二列是key(创建监控项时的key),第三列就是值了。
2、客户端采集到数据后,zabbix服务端需要接收这些数据。但是数据放在哪呢?监控项!需要在zabbix监控页面中创建监控项,来接收存放客户端发来的数据。
首先创建一个模版,方便套用:
配置-模版-创建模版,输入模版的名字和应用的主机即可。
创建监控项:
配置-模版-监控项-创建监控项,如下图:
注意其中类型、键值和信息类型几项。这里信息类型选择浮点行,是因为采集到的数据有小数。
按照以上创建所有需要监控的项。
2、添加计划任务,每分钟采集一次数据发送给zabbix服务端:
*/1 * * * * /scripts/zabbix_tomcat/jvmstatus.py
3、如果一切正常,在zabbix监控页面‘最新数据’中即可收到发来的数据,并且可自动生成图形,如下图:
点击右侧的图形,就可以看到趋势图了:
最后生成模版:
zbx_export_templates.xml
页:
[1]