systemadmin.es > LAMP y web > Monitorización de tomcat por JMX

Monitorización de tomcat por JMX

Mediante check_jmx para Nagios podemos monitorizar varios parámetros del tomcat.

Primero deberemos instalar el plugin check_jmx, suponiendo que tenemos los checks de nagios en /usr/local/nagios/libexec:

cd /usr/local/src/
wget http://snippets.syabru.ch/nagios-jmx-plugin/download/nagios-jmx-plugin.zip
unzip nagios-jmx-plugin.zip 
cd nagios-jmx-plugin-1.2.3/
cp check_jmx* /usr/local/nagios/libexec/
cd /usr/local/nagios/libexec/
dos2unix check_jmx

A continuación, si mediante el comando which java no encuentra el binario:

# which java
/usr/bin/which: no java in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/jprats/bin)

Deberemos editar el fichero check_jmx y definir la variable JAVA_CMD con el path a java:

JAVA_CMD=/opt/java/bin/java

Para probar el plugin, deberemos buscar las credenciales de acceso, si la tiene habilitadas, para ello deberemos fijarnos en los parámetros del proceso tomcat:

# ps -fea | grep tomcat
(...)
tomcat   26176 26173  1 Oct10 ?        00:17:58 /apps/java/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/apps/tomcat/conf/logging.properties -Xmx2048m -XX:MaxPermSize=2048m -server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Djava.endorsed.dirs=/apps/tomcat/endorsed -classpath :/apps/tomcat/bin/bootstrap.jar -Dcatalina.base=/apps/tomcat -Dcatalina.home=/apps/tomcat -Djava.io.tmpdir=/apps/tomcat/temp org.apache.catalina.startup.Bootstrap start
root     27823  4461  0  2011 ?        00:00:11 supervise tomcat2

En el caso que -Dcom.sun.management.jmxremote.authenticate sea false, no se requiere autenticación, sino deberemos fijarnos en el resto de parámetros:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 
-Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.password.file=/opt/tomcat/conf/jmx-access/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/opt/tomcat/conf/jmx-access/jmxremote.access

En caso que sea autenticado, podemos mirar las credenciales en dichos ficheros:

# cat jmxremote.access 
systemadmin      readwrite
# cat jmxremote.password 
systemadmin     vaqrcraqrapvncrepngnyhaln

El comando para ver la memoria en uso quedaría:

# /usr/local/nagios/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi -O "java.lang:type=Memory" -A HeapMemoryUsage -K used --username systemadmin --password vaqrcraqrapvncrepngnyhaln
JMX OK - HeapMemoryUsage.used = 956346064 | 'HeapMemoryUsage used'=956346064;;;;

Para facilitar la tarea para luego ver los gráficos, podemos crear un script que muestre al mismo tiempo el heap commited y el heap used a partir del propio check_jmx (falta añadir las credenciales si son necesarias):

#!/bin/sh
#
# Nagios JMX plugin.
#

JAVA_CMD=`which java`

if [ -z $JAVA_CMD ]
then

  if [ -x $JAVA_HOME/bin/java ]
  then
    JAVA_CMD=$JAVA_HOME/bin/java 
  else
    echo JMX CRITICAL - java not found.
    exit 2
  fi

fi


DIR=`dirname $0`
FIRST_VALUE=$($JAVA_CMD -jar $DIR/check_jmx.jar -U service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi -O "java.lang:type=Memory" -A HeapMemoryUsage -K used)
SECOND_VALUE=$($JAVA_CMD -jar $DIR/check_jmx.jar -U service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi -O "java.lang:type=Memory" -A HeapMemoryUsage -K committed)


if [ "${FIRST_VALUE:0:6}" = "JMX OK" ] ;
then
	if [ "${SECOND_VALUE:0:6}" = "JMX OK" ] ;
	then
	
		
		RESULT=`echo ${FIRST_VALUE:8} | sed "s/|.*//g"`
		RESULT=${RESULT}`echo ${SECOND_VALUE:8} | sed "s/|.*//g"`
		RESULT=${RESULT}" | "
		RESULT=${RESULT}`echo ${FIRST_VALUE:8}|sed "s/.*|//g" | sed "s/;//g"`";"
		RESULT=${RESULT}`echo ${SECOND_VALUE:8}|sed "s/.*|//g" | sed "s/;//g"`";"
	fi
fi	

echo $RESULT | sed 's/HeapMemoryUsage./heap/g'

Creamos el fichero y luego asignamos los permisos:

# chmod +x /usr/local/nagios/libexec/check_tomcat_mem

Al ejecutarlo obtendremos ambos valores:

# /usr/local/nagios/libexec/check_tomcat_mem
heapused = 1365657520 heapcommitted = 2130051072 | 'heapused'=1365657520; 'heapcommitted'=2130051072;

Si los graficamos, podremos ver un gráfico similar al siguiente:

Apache Tomcat heap commited vs used

Apache Tomcat heap commited vs used

En este caso podemos apreciar las caídas de este tomcat por falta de memoria. Mediante dicho plugin podemos también obtener otros valores, como por ejemplo los threads con:

-O "java.lang:type=Threading" -A ThreadCount

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>