监控tomcat的jvm

线上要做zabbix监控jvm,但是使用一般的方法通常是要重新编译zabbix-server,让其增加java模块,然后安装jmx,这样做的代价就是要停止server,这期间,使用jmx多少也会对tomcat的性能有所影响,所以就自己用tomcat自带的jvm查询工具,通过自己收集,自定义jvm收集项目,但是要是通过shell函数编写的话,我大概算了下,下来得160多行,最后放弃了,感觉还是用python的字典弄比较简单:

#!/usr/bin/python
#coding: UTF-8
import psutil
import os
import sys
import re
import string
tttt='''

    NGCMN:新生代最小容量
    NGCMX:新生代最大容量
    NGC:当前新生代容量
    S0C:第一个幸存区大小
    S1C:第二个幸存区的大小
    EC:伊甸园区的大小
    OGCMN:老年代最小容量
    OGCMX:老年代最大容量
    OGC:当前老年代大小
    OC:当前老年代大小
    MCMN:最小元数据容量
    MCMX:最大元数据容量
    MC:当前元数据空间大小
    CCSMN:最小压缩类空间大小
    CCSMX:最大压缩类空间大小
    CCSC:当前压缩类空间大小
    YGC:年轻代gc次数
    FGC:老年代GC次数

'''
#获取tomcat程序pid
tt=os.popen('jps|grep -v "[a-zA-Z]"').read()
even=tt.split()

#print(tttt)
#pids = psutil.pids()
#count=0
#tt=[]
#for pid in pids:
#    count+=1
#    p = psutil.Process(pid)
#    t=p.name()
#    if t == "jsvc" and count <= '8':
#        print("pid:%d" %(pid))
#        tt.append(pid)
#    else:
#        pass

projt=os.popen('ls /usr/local/services/apache-tomcat/').readlines()
#上面这不也可以用os.listdir以及os的其他模块来获得
dd = ''.join(projt).split('\n')
#even=tt[1::2]
dictl={}
for i in even:
    proj=os.popen('ps aux|grep %s' %(i)).readlines()
    String=''.join(proj)
    for keyword in dd:
        result = String.find(keyword)
        if result == -1:
            break
        else:
           # print(keyword)

            dictl[keyword]=i
#根据ppid获取相应项目的jvm使用情况
ppid=dictl[sys.argv[1]]
ttt=os.popen('jstat -gccapacity %s' %(ppid)).readlines() 
name=ttt[0].split()
value=ttt[1].split()
all_dic=dict(zip(name,value))
print(all_dic[sys.argv[2]])      #其中sys.argv[1]是项目名称,sys.argv[2]是最上面的tttt变量的注释中的某一个值

如下执行结果:

[root@soa-prod-admin-glb-010177210101 /home/liujiangbo] 22:55:39 0
# python test5.py disconf  NGCMX
524288.0

你可能感兴趣的:(监控tomcat的jvm)