• 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('
    '))
            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监控页面‘最新数据’中即可收到发来的数据,并且可自动生成图形,如下图:

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

    最后生成模版:

    zbx_export_templates.xml

  • 相关阅读:
    Kubernetes实战总结
    Kubernetes实战总结
    Kubesnetes实战总结
    Kubernetes实战总结
    【转载】Nginx、HAProxy、LVS三者的优缺点
    Kubernetes实战总结
    【解决】 Streaming server stopped unexpectedly: listen tcp: lookup localhost on 114.114.114.114:53: no such host
    Kubernetes实战总结
    (转载)常用正则表达式大全——包括校验数字、字符、一些特殊的需求
    css选择器参考手册
  • 原文地址:https://www.cnblogs.com/ahaii/p/7079796.html
Copyright © 2020-2023  润新知