1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-21 02:33:18 +00:00
Munin-Contrib/plugins/jvm/jstat__gccount
Stefan Huehner f0548a37de Fix jstat* plugins to work again with java 6+7, fix PU reporting for
Java8.

jstat column output is not stable across JVM versions (technically
version of jstat binary used).
New columns are added not add the end of column list but in the middle
breaking access via constant index.

Following table shows the known columns per version:
Oracle JDK / OpenJDK 1.5 .. 1.7
   S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC    YGCT   FGC     FGCT    GCT
Openjdk 1.8 .. 10
   S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
Openjdk 11  .. 12
   S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     CGC    CGCT     GCT

Earlier commit here added support for java8+ but using version checking
if version == 1.5 > Use pre-java8 column format, else new format.

As fixing java6+7 would mean more version comparison which is ugly this
cmomit changes retrival logic to the following;
a.) Parse first line jstat output to find position for each label
b.) Then use that position to fetch value from 2nd line

That way code auto-adjusts to any ordering change without needing any
java version specific code or checks.

On the way fix 'Permanent Used' value reporting for java8 which was
broken (missing variable rename from PU -> MU when java8 support was
added).
2018-12-13 15:20:34 +01:00

132 lines
3.4 KiB
Bash
Executable file

#!/bin/sh
#
# 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_<jvm alias>_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/)
# 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 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; }'
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["YGC"];
print "Full_GC.value " $idx["FGC"];
}'
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
exit 0
fi
print_stats "$(cat "$pidfilepath")"