sergio-b
6/26/2016 - 10:43 AM

Munin jstat__heap plugin for Oracle Java 7/8

Munin jstat__heap plugin for Oracle Java 7/8

#!/bin/bash
#
# Plugin for monitor JVM activity - Heap Usage -
#
# Usage:
#
#       Symlink into /etc/munin/plugins/ and add the monitored
#	alias name like :
#
#       ln -s /usr/share/munin/plugins/jstat_heap \
#	  /etc/munin/plugins/jstat_heap


#
# Functions
#
chk_jdk()
{
  Version=`java -version 2>&1 | egrep '^java version' | awk '{print $3}' | sed -e 's/\"//g' | cut -d'_' -f 1`
  if [ "${Version}" != "1.7.0" ]; then
    JDK_TYPE="jdk8"
  else
    JDK_TYPE="jdk7"
  fi
}

config_common()
{
  echo "graph_title Heap Usage"
  echo "graph_args --base 1024 -l 0"
  echo "graph_vlabel Heap Usage(Bytes)"
  echo "graph_info Heap Usage"
  echo "graph_category JVM"
}

config_oracle_jdk7()
{
  config_common

  echo "Eden_Used.label Eden_Used"
  echo "Eden_Free.label Eden_Free"
  echo "Survivor0_Used.label Survivor0_Used"
  echo "Survivor0_Free.label Survivor0_Free"
  echo "Survivor1_Used.label Survivor1_Used"
  echo "Survivor1_Free.label Survivor1_Free"
  echo "Old_Used.label Old_Used"
  echo "Old_Free.label Old_Free"
  echo "Permanent_Used.label Permanent_Used"
  echo "Permanent_Free.label Permanent_Free"

  echo "Eden_Used.draw AREA"
  echo "Eden_Free.draw STACK"
  echo "Survivor0_Used.draw STACK"
  echo "Survivor0_Free.draw STACK"
  echo "Survivor1_Used.draw STACK"
  echo "Survivor1_Free.draw STACK"
  echo "Old_Used.draw STACK"
  echo "Old_Free.draw STACK"
  echo "Permanent_Used.draw STACK"
  echo "Permanent_Free.draw STACK"
}

config_oracle_jdk8()
{
  config_common

  echo "Eden_Used.label Eden_Used"
  echo "Eden_Free.label Eden_Free"
  echo "Survivor0_Used.label Survivor0_Used"
  echo "Survivor0_Free.label Survivor0_Free"
  echo "Survivor1_Used.label Survivor1_Used"
  echo "Survivor1_Free.label Survivor1_Free"
  echo "Old_Used.label Old_Used"
  echo "Old_Free.label Old_Free"
  echo "Metaspace_Used.label Metaspace_Used"
  echo "Metaspace_Free.label Metaspace_Free"
  echo "Compressed_Class_Space_Capacity_Used.label Compressed_Class_Space_Capacity_Used"
  echo "Compressed_Class_Space_Capacity_Free.label Compressed_Class_Space_Capacity_Free"

  echo "Eden_Used.draw AREA"
  echo "Eden_Free.draw STACK"
  echo "Survivor0_Used.draw STACK"
  echo "Survivor0_Free.draw STACK"
  echo "Survivor1_Used.draw STACK"
  echo "Survivor1_Free.draw STACK"
  echo "Old_Used.draw STACK"
  echo "Old_Free.draw STACK"
  echo "Metaspace_Used.draw STACK"
  echo "Metaspace_Free.draw STACK"
  echo "Compressed_Class_Space_Capacity_Used.draw STACK"
  echo "Compressed_Class_Space_Capacity_Free.draw STACK"
}

print_oracle_jdk7_stats()
{
jstat -gc ${PidNum} | tail -1 | awk \
'{\
	S0C = $1; \
	S1C = $2; \
	S0U = $3; \
	S1U = $4; \
	EC  = $5; \
	EU  = $6; \
	OC  = $7; \
	OU  = $8; \
	PC  = $9; \
	PU  = $10; \
	\
	S0F = S0C - S0U; \
	S1F = S1C - S1U; \
	EF  = EC  - EU;  \
	OF  = OC  - OU;  \
	PF  = PC  - PU;  \
	\
	print "Eden_Used.value " EU * 1024; \
	print "Eden_Free.value " EF * 1024; \
	print "Survivor0_Used.value " S0U * 1024; \
	print "Survivor0_Free.value " S0F * 1024; \
	print "Survivor1_Used.value " S1U * 1024; \
	print "Survivor1_Free.value " S1F * 1024; \
	print "Old_Used.value " OU * 1024; \
	print "Old_Free.value " OF * 1024; \
	print "Permanent_Used.value " PU * 1024; \
	print "Permanent_Free.value " PF * 1024; \
}'
}

print_oracle_jdk8_stats()
{
jstat -gc ${PidNum} | tail -1 | awk \
'{\
	S0C  = $1;  \
	S1C  = $2;  \
	S0U  = $3;  \
	S1U  = $4;  \
	EC   = $5;  \
	EU   = $6;  \
	OC   = $7;  \
	OU   = $8;  \
	MC   = $9;  \
	MU   = $10; \
	CCSC = $11; \
	CCSU = $12; \
	\
	S0F  = S0C  - S0U;  \
	S1F  = S1C  - S1U;  \
	EF   = EC   - EU;   \
	OF   = OC   - OU;   \
	MF   = MC   - MU;   \
	CCSF = CCSC - CCSU; \
	\
	print "Eden_Used.value " EU * 1024; \
	print "Eden_Free.value " EF * 1024; \
	print "Survivor0_Used.value " S0U * 1024; \
	print "Survivor0_Free.value " S0F * 1024; \
	print "Survivor1_Used.value " S1U * 1024; \
	print "Survivor1_Free.value " S1F * 1024; \
	print "Old_Used.value " OU * 1024; \
	print "Old_Free.value " OF * 1024; \
	print "Metaspace_Used.value " MU * 1024; \
	print "Metaspace_Free.value " MF * 1024; \
	print "Compressed_Class_Space_Capacity_Used.value " CCSU * 1024; \
	print "Compressed_Class_Space_Capacity_Free.value " CCSF * 1024; \
}'
}

#
# common for all argument
#
PidNum=$(pidof java)
chk_jdk

#
# autoconf
#
if [ "$1" = "autoconf" ]; then
  if [ ! $(whereis jstat | awk '{print $2}') ]; then
    echo "no (No jstat found)"
    exit 1
  fi

  echo "yes"
  exit 0
fi

#
# config
#
if [ "$1" = "config" ]; then
  if [ "${JDK_TYPE}" == "jdk8" ]; then
    config_oracle_jdk8
  else
    config_oracle_jdk7
  fi
  exit 0
fi

#
# Main
#

if [ "${JDK_TYPE}" == "jdk8" ]; then
  print_oracle_jdk8_stats
else
  print_oracle_jdk7_stats
fi