Un aspecto fundamental en el mantenimiento y prevención de desastres
en un sistema es la monitorización de los diferentes servicios que
proporciona. Un herramienta muy popular es este campo dentro del mundo
opensource es Nagios debido a la
gran comunidad de usuarios y plugins existentes. Uno de ellos es check_jmx,
que permite la monitorización de variables de un servidor de
aplicaciones java, activando la consola jmx.
En primer lugar es necesario configurar el acceso via jmx en el
servidor de aplicaciones a monitorizar, y reiniciarlo. Basicamente hay
que localizar el punto del script de arranque de Jboss o Tomcat donde
especificamos las opciones de java $CATALINA_OPTS de modo:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote=true" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=9999" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=true" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=/opt/liferay/jmxremote.password" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.access.file=/opt/liferay/jmxremote.access" CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=tomcat.zylk.net"
También es necesario editar los archivos jmxremote.access:
admin readwrite zylk readonly
y jmxremote.password:
admin secret zylk secret
Podemos probar que el jmx está listo con jconsole, una vez
reiniciado el servidor de aplicaciones:
Luego nos descargamos el plugin para Nagios, y configuramos los
comandos y servicios correspondientes. Por cierto, es un script de
shell que invoca a un jar, luego para ejecutarlo en el servidor de
monitorización es necesario instalar java.
La configuración del comando (commands.cfg) y
la del servicio (services.cfg) en Nagios:
define command { command_name check_jmx_HeapMemoryUsage_Used command_line /usr/local/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$HOSTADDRESS$:$ARG1$/jmxrmi -O java.lang:type=Memory -A HeapMemoryUsage -K used -username "$ARG2$" -password "$ARG3$" -w "$ARG4$" -c "$ARG5$" } define service { use generic-service host_name baco service_description heap memory used check_command check_jmx_HeapMemoryUsage_Used!9999!zylk!secret!750000000!800000000 }
En el caso específico que nos ocupa, monitorizamos la memoria
heap de un contenedor de servlets Tomcat con un gestor de portales
Liferay, aunque podría ser cualquier aplicación java, como Alfresco ECM o Nuxeo. En el blog de Toni de la Fuente, hay un
detallado artículo de monitorización
de Alfresco a través de varios métodos, entre los que incluye Nagios.
Como complemento a este artículo en la parte que se refiere a
Nagios, es posible graficar la evolución temporal de las variables
java en PNP4Nagios mediante
performance data. Para ello necesitamos modificar un poco el script el
check_jmx, añadiéndole los datos de rendimiento, de modo que tendremos
en Nagios gráficas diarias, semanales, mensuales tipo Cacti (rrdtool) en nuestro Nagios.
El cambio en la parte final del script es el siguiente:
DIR=`dirname $0` JMX=`$JAVA_CMD -jar $DIR/check_jmx.jar "$@"` JMXVAL=$? VAL=`echo $JMX | awk '{print $5}'` echo $JMX "|$6=$VAL;;;" exit $JMXVAL
Y este sería el resultado para la memoria heap de java del servidor Liferay:
Y esto es todo.