上篇最后提到了jstat,jstat可以查看统计JVM内存信息,那么结合Zabbix,就可以监控多实例的JVM内存了。
1、下面两个脚本部署在被监控主机:
vm.py
用于JVM实例PID查找,ps命令亦可以换成jdk自带的jps工具:
#!/usr/bin.python#import osimport json data = {}tcp_list = []port_list = []command = "ps -ef | grep weblogic.Server | grep -v \"grep web\" | awk '{print $2}'"lines = os.popen(command).readlines()for line in lines: port=line.strip('\n')# port = line.split(':')[1] port_list.append(port) for port in list(set(port_list)): port_dict = {} port_dict['{#PID}'] = port tcp_list.append(port_dict) data['data'] = tcp_listjsonStr = json.dumps(data, sort_keys=True, indent=4)print jsonStr
getvm.sh
统计内存使用情况脚本,需修改JAVA_HOME环境变量:
#!/bin/bash#JAVA_HOME="/u01/Middleware/jdk1.6.0_45"javapid=$2#S0function s0 { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $1}')}#S1function s1 { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $2}')}#Edenfunction eden { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $3}')}#Oldfunction old { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $4}')}#Permfunction perm { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $5}')}#YGCfunction ygc { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $6}')}#YGCTfunction ygct { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $7}')}#FGCfunction fgc { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $8}')}#FGCTfunction fgct { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $9}')}#GCTfunction gct { echo $(sudo -u weblogic ${JAVA_HOME}/bin/jstat -gccause $javapid | awk '{if(NR!=1) print $10}')}$1exit $?
2、增加被监控主机zabbix_agentd配置文件
/etc/zabbix/zabbix_agentd.d下添加配置文件,jvm.conf
根据脚本实际目录配置:
UserParameter=java.pid,/home/weblogic/zabbix/vm.py
UserParameter=java.memory[*],/home/weblogic/zabbix/getvm.sh $1 $2
3、 为zabbix运行脚本授权
zabbix ALL=(user) NOPASSWD: /u01/Middleware/jdk1.6.0_45/bin/jstat,/usr/bin/python
Defaults !requiretty
4、 zabbix server端测试
./zabbix_get -s 192.168.1.109 -p 10050 -k 'java.pid'{ "data": [ { "{#PID}": "8817" }, { "{#PID}": "9041" }, { "{#PID}": "3929" }, { "{#PID}": "8620" } ]} ./zabbix_get -s 192.168.1.109 -p 10050 -k 'java.memory[old,8817]'5.83
5、zabbix导入模板(在最后),监控即可,如果要自己配置自动发现,
xml模板:
3.2 2017-06-13T05:25:25Z Templates JVM Memory JVM Memory Templates JVM Get weblogic pid 0 java.pid 60 0 0 0 0 0 0 7 JVM EDEN MEMORY USED ON PID {#PID} 0 0 java.memory[eden,{#PID}] 60 30 365 0 0 % 0 0 0 0 1 0 0 Heap上的 Eden space 区已使用空间的百分比 0 JVM JVM FGC MEMORY USED ON PID {#PID} 0 0 java.memory[fgc,{#PID}] 60 30 365 0 3 次 0 0 0 0 1 0 0 从应用程序启动到采样时发生 Full GC 的次数 0 JVM JVM FGCT MEMORY USED ON PID {#PID} 0 0 java.memory[fgct,{#PID}] 60 30 365 0 0 s 0 0 0 0 1 0 0 从应用程序启动到采样时 Full GC 所用的时间(单位秒) 0 JVM JVM GCT MEMORY USED ON PID {#PID} 0 0 java.memory[gct,{#PID}] 60 30 365 0 0 s 0 0 0 0 1 0 0 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) 0 JVM JVM OLD MEMORY USED ON PID {#PID} 0 0 java.memory[old,{#PID}] 60 30 365 0 0 % 0 0 0 0 1 0 0 Heap上的 Old space 区已使用空间的百分比 0 JVM JVM PERM MEMORY USED ON PID {#PID} 0 0 java.memory[perm,{#PID}] 60 30 365 0 0 % 0 0 0 0 1 0 0 Perm space 区已使用空间的百分比 0 JVM JVM S0 MEMORY USED ON PID {#PID} 0 0 java.memory[s0,{#PID}] 60 30 365 0 0 % 0 0 0 0 1 0 0 s0区内存大小 0 JVM JVM S1 MEMORY USED ON PID {#PID} 0 0 java.memory[s1,{#PID}] 60 30 365 0 0 % 0 0 0 0 1 0 0 s1区内存大小 0 JVM JVM YGC MEMORY USED ON PID {#PID} 0 0 java.memory[ygc,{#PID}] 60 30 365 0 3 次 0 0 0 0 1 0 0 从应用程序启动到采样时发生 Young GC 的次数 0 JVM JVM YGCT MEMORY USED ON PID {#PID} 0 0 java.memory[ygct,{#PID}] 60 30 365 0 0 s 0 0 0 0 1 0 0 从应用程序启动到采样时 Young GC 所用的时间(单位秒) 0 JVM JVM GC FREQUENCY ON {#PID} 900 200 0.0000 100.0000 1 1 0 1 0 0.0000 0.0000 0 0 0 0 0 0 1A7C11 0 2 0 JVM Memory java.memory[fgc,{#PID}] 1 0 F63100 0 2 0 JVM Memory java.memory[ygc,{#PID}] JVM GC TIME ON {#PID} 900 200 0.0000 100.0000 1 1 0 1 0 0.0000 0.0000 0 0 0 0 0 1 1A7C11 0 2 0 JVM Memory java.memory[fgct,{#PID}] 1 1 F63100 0 2 0 JVM Memory java.memory[gct,{#PID}] 2 1 2774A4 0 2 0 JVM Memory java.memory[ygct,{#PID}] JVM MEMORY USED PID {#PID} 900 200 0.0000 100.0000 1 1 0 1 0 0.0000 0.0000 1 1 0 0 0 0 1A7C11 0 2 0 JVM Memory java.memory[old,{#PID}] 1 0 F63100 0 2 0 JVM Memory java.memory[perm,{#PID}] 2 0 2774A4 0 2 0 JVM Memory java.memory[eden,{#PID}] 3 0 A54F10 0 2 0 JVM Memory java.memory[s0,{#PID}] 4 0 FC6EA3 0 2 0 JVM Memory java.memory[s1,{#PID}]