2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/jvm/jstat__gctime
2018-08-26 01:31:20 +02:00

154 lines
4.1 KiB
Bash
Executable File

#!/bin/sh
#
# Plugin for monitor JVM activity - GC Time -
#
# Usage:
#
# Symlink into /etc/munin/plugins/ and add the monitored
# alias name like :
#
# ln -s /usr/share/munin/plugins/jstat__gctime \
# /etc/munin/plugins/jstat_<jvm alias>_gctime
# This should, however, be given through autoconf and suggest.
#
# Requirements:
#
# You need to execute your Java program under jsvc provided by
# http://jakarta.apache.org/commons/daemon/
# which enables you to run your Java program with specified
# pid file with -pidfile option.
# A Brief setup documentation is also available at
# http://tomcat.apache.org/tomcat-5.5-doc/setup.html
#
# Target:
#
# Target Java Virtual Machine to monitor are:
# Sun JDK 5.0 (http://java.sun.com/javase/)
# Sun JDK 8.0 (http://java.sun.com/javase/)
# BEA JRockit 5.0 (http://dev2dev.bea.com/jrockit/)
#
# Parameters:
#
# config (required)
#
# Config variables:
#
# pidfilepath - Which file path use. Defaults to '/var/run/jsvc.pid'
# javahome - override automatic detection of JRE directory
# graphtitle - Title of the graph (defaults to PID file location)
#
default_java_home=/usr/lib/jvm/default-java
[ -e "$default_java_home" ] || default_java_home=/usr/local/java/jdk
pidfilepath=${pidfilepath:-/var/run/jsvc.pid}
graphtitle=${graphtitle:-$pidfilepath}
JAVA_HOME=${javahome:-$default_java_home}
export JAVA_HOME
get_jdk_type() {
local version
if "${JAVA_HOME}/bin/java" -version 2>&1 | grep -qi 'jrockit'; then
echo "bea"
else
version=$("${JAVA_HOME}/bin/java" -version 2>&1 | grep '^java version' | awk '{print $3}' | sed -e 's/\"//g' | cut -d'_' -f 1)
if echo "$version" | grep -q '^1\.5\.'; then
echo "sun15"
else
echo "sun"
fi
fi
}
print_config() {
echo "graph_title GC Time $graphtitle"
echo 'graph_args -l 0'
echo 'graph_vlabel GC Time(sec)'
echo 'graph_total total'
echo 'graph_info GC Time'
echo 'graph_category virtualization'
echo 'Young_GC.label Young_GC'
echo 'Young_GC.min 0'
if [ "${JDK_TYPE}" = "bea" ]; then
echo 'Old_GC.label Old_GC'
echo 'Old_GC.min 0'
echo 'Young_Pause.label Young_GC Pause'
echo 'Young_Pause.min 0'
echo 'Old_Pause.label Old_GC Pause'
echo 'Old_Pause.min 0'
else
echo 'Full_GC.label Full_GC'
echo 'Full_GC.min 0'
fi
}
print_stats() {
local pid_num="$1"
local awk_script
if [ "${JDK_TYPE}" = "bea" ]; then
# shellcheck disable=SC2016
awk_script='{
YCTime = $6;
OCTime = $7;
YCPauseTime = $9;
OCPauseTime = $10;
print "Young_GC.value " YCTime;
print "Old_GC.value " OCTime;
print "Young_Pause.value " YCPauseTime;
print "Old_Pause.value " OCPauseTime; }'
elif [ "${JDK_TYPE}" = "sun15" ]; then
# shellcheck disable=SC2016
awk_script='{
YGCT = $12;
FGCT = $14;
print "Young_GC.value " YGCT;
print "Full_GC.value " FGCT; }'
else
# example output of jstat for Java 1.8:
# S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
# 2048.0 2048.0 0.0 1344.0 694784.0 145013.5 1398272.0 414857.1 102400.0 96308.0 12544.0 11240.1 979 20.997 5 2.705 23.702
# shellcheck disable=SC2016
awk_script='{
YGCT = $14;
FGCT = $16;
print "Young_GC.value " YGCT;
print "Full_GC.value " FGCT; }'
fi
"${JAVA_HOME}/bin/jstat" -gc "$pid_num" | tail -1 | awk "$awk_script"
}
#
# autoconf
#
if [ "$1" = "autoconf" ]; then
if [ ! -x "${JAVA_HOME}/bin/jstat" ]; then
echo "no (No jstat found in ${JAVA_HOME}/bin)"
exit 1
fi
if [ ! -f "${pidfilepath}" ] || [ ! -r "${pidfilepath}" ]; then
echo "no (No such file ${pidfilepath} or cannot read ${pidfilepath}"
exit 1
fi
echo "yes"
exit 0
fi
JDK_TYPE=$(get_jdk_type)
if [ "$1" = "config" ]; then
print_config
fi
print_stats "$(cat "$pidfilepath")"