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[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监控页面中创建监控项,来接收存放客户端发来的数据。

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

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

创建监控项:

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

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

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

 

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

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

 

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

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

 

 

最后生成模版:

zbx_export_templates.xml

 

posted @ 2017-06-26 11:45  ahaii  阅读(667)  评论(0编辑  收藏  举报