线上要做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
网友评论