Repository
Munin (contrib)
Last change
2018-12-13
Graph Categories
Keywords
Language
Shell

jstat__gctime

Sadly there is no documentation for this plugin.

#!/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/)
#         OpenJDK 1.7 .. 11 (https://openjdk.java.net/)
#         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
        echo "sun"
  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; }'
    else
        # List & Order of columns of jstat changes with java versions
        # idx["YGC"] is index of YGC column in output (i.e. 13)
        # $idx["YGC"] then accesses the value at this position (taken from 2nd line of the output)
        # shellcheck disable=SC2016
       awk_script='
            (NR==1) { 
                for (i=1;i<=NF;i++) idx[$i]=i
            }
            (NR==2) {
                print "Young_GC.value " $idx["YGCT"];
                print "Full_GC.value " $idx["FGCT"];
            }'
    fi
    "${JAVA_HOME}/bin/jstat" -gc "$pid_num" | awk "$awk_script"
}


#
# autoconf
#
if [ "$1" = "autoconf" ]; then

  if [ ! -x "${JAVA_HOME}/bin/jstat" ]; then
    echo "no (No jstat found in ${JAVA_HOME}/bin)"
  elif [ ! -f "$pidfilepath" ]; then
    echo "no (missing file $pidfilepath)"
  elif [ ! -r "$pidfilepath" ]; then
    echo "no (cannot read $pidfilepath)"
  else
    echo "yes"
  fi
  exit 0
fi


JDK_TYPE=$(get_jdk_type)


if [ "$1" = "config" ]; then
    print_config
fi

print_stats "$(cat "$pidfilepath")"