#!/bin/bash # # Plugin for monitor JVM activity - GC Count - # # Usage: # # Symlink into /etc/munin/plugins/ and add the monitored # alias name like : # # ln -s /usr/share/munin/plugins/jstat__gccount \ # /etc/munin/plugins/jstat__gccount # 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 Count' $graphtitle echo 'graph_args -l 0' echo 'graph_vlabel GC Count(times)' echo 'graph_total total' echo 'graph_info GC Count' 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' 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='{ YC = $4; OC = $5; print "Young_GC.value " YGC; print "Old_GC.value " FGC; }' elif [ "${JDK_TYPE}" = "sun15" ]; then # shellcheck disable=SC2016 awk_script='{ YGC = $11; FGC = $13; print "Young_GC.value " YGC; print "Full_GC.value " FGC; }' else # shellcheck disable=SC2016 awk_script='{ YGC = $13; FGC = $15; print "Young_GC.value " YGC; print "Full_GC.value " FGC; }' 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}" -o ! -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 exit 0 fi print_stats "$(cat "$pidfilepath")"