Monitorizar servidores Tomcat con Cacti

Retomando la serie de posts dedicados a Cacti, en esta ocasión contaremos cómo podemos monitorizar servidores Tomcat con ayuda de Cacti. Para ello, nos basaremos en el post http://forums.cacti.net/about19744.html.
Antes de empezar a trabajar con Cacti, nos interesará saber si tenemos correctamente configurado nuestro servidor Apache Tomcat. Para ello accederemos con un navegador a la dirección http://IP_TOMCAT:PUERTO/manager/status?XML=true, donde IP_TOMCAT será la dirección IP de nuestro servidor tomcat, y PUERTO será el puerto de escucha del Connector-HTTP: en mi caso yo usé http://code.casa.tecnoquia.com:9080/manager/status?XML=true. Para ello, también será necesario tener desplegado el contexto manager que viene con la distribución del Tomcat. Cuando nos pregunte un Login y Password no estará pidiendo el nombre de un usuario y su contraseña que tenga el rol manager. Esto, como sabrás, viene configurado por defecto en el server.xml de tu tomcat (habitualmente se guardan tomcat-users.xml) dentro del Realm UserDatabase. Una vez consigas autenticarte, deberías podeer ver una pantall con una salida similar a la siguiente:
Lo más importante será que nos fijemos en los nombres de nuestros conectores, y de ellos, aquellos que queremos monitorizar.

En mi ejemplo se puede ver que tengo dos conectores: uno llamado jk-9009 con 8 conexiones en el momento de la captura y otro llamado http-9080 que recoge la conexión que hice desde mi navegador. Para ilustrar el ejemplo, usaré el conector jk-9009, que además es el que recibe las conexiones vía ModJK desde el Apache que hace de proxy inverso transparente.
Una vez ya sabemos el puerto, ip, usuario, contraseña y el nombre del conector que queremos monitorizar podemos empezar con Cacti.
  1. Descargar el fichero TomcatStats-0.1.zip, descomprimirlo. Copiar el script tomcatstats.pl al directorio los scrips, de nuestro servidor cacti y darle permisos de ejecución.
    scp tomcatstats.pl root@SERVIDOR_CACTI:/var/www/cacti/scripts/
    ssh root@SERVIDOR_CACTI chmod 755 /var/www/cacti/scripts/tomcatstats.pl
  2. Ahora nos conectaremos a nuestro servidor CACTI, e intentaremos lanzar la consulta que más tarde hará Cacti para dibujar las gráficas. Esto nos permitirá saber las librerías de perl que nos faltan por instalar al equipo. Una vez conectados ejecutar el comando...
    perl /var/www/cacti/scripts/tomcatstats.pl \
    IP_TOMCAT:PUERTO \
    USUARIO_CON_ROL_MANAGER \
    CONTRASEÑA_USUARIO \
    NOMBRE_CONECTOR
    Deberas obtener algo similar a lo siguiente, en una sóla línea.
    jvm_memory_free:28303544 jvm_memory_max:830013440 jvm_memory_total:55246848
    connector_max_time:183042 connector_error_count:0 connector_bytes_sent:83477881
    connector_processing_time:624695 connector_request_count:378
    connector_bytes_received:0 connector_current_thread_count:12
    connector_min_spare_threads:4 connector_max_threads:200
    connector_max_spare_threads:50 connector_current_threads_busy:9
    Si no lo obtienes, será porque te falta alguna librería de Perl. Al ejecutar el comando te dirá qué librería no encuentra. Busca el error en Google y es posible qe alguien le haya pasado algo similar y te de alguna pista. Hasta que no consigas ver la línea similar a la que te indico, no es necesario que sigas configurando porque no se dibujarán las gráficas. Por si si te srive de algo, yo algunas veces necesito instalar los paquetes perl-XML-Simple:
    yum -y install perl-XML-Simple perl-XML-Simple.noarch
  3. Una vez nos funcione el comando en la consola del servidor Cacti, accederemos como Administrador a la consola Web de Cacti y acceder a Console->Import/Export->Import Templates y cargar el fichero: cacti_host_template_tomcat_server.xml, que obtuvimos al descomprimir TomcatStats-0.1.zip. Luego pulsar el botón Save

Con esto tendremos lo básico para poder monitorizar tomcats, pero el autor de la plantilla no tuvo en cuenta que podríamos tener diferentes tomcats en la misma máquina y en diferentes puertos, usando diferentes nombres de conector, diferentes usuarios, etc. Vamos a modificar la plantilla para parametrizar todas estas variables. Para hacerlo:
  1. Ir a Console->Collection Methods->Data Input Methods y pulsar en la parte derecha en TomcatStatus.
  2. En el campo Input String, se le dice a Cacti que comando debe ejecutar para leer los datos con los que luego poder realizar la gráfica. Debemos cambiar los siguientes campos: "8444" por <tcpport> "admin" por tomcatadmin "passwords" por cocacola "http-8080" por <conname> * Pulsar el boton SAVE
    • 8444 por <TcpPort>
    • admin por <UserManager>
    • passwords por <Password>
    • http-8080 por <ConnectorName>
    Cuando lo hayamos hecho pulsar el botón Save.
  3. Nos devolverá a la pantalla anterior, con el mensaje Save Successful.. Volver hacer click en TomcatStatus
  4. En Input Fields hay que pulsar Add. En Field [Input], en el combobox elegir <TcpPort> y en Friendly Name escribir Puerto, Regular Expression -> escribir \d+ . Luego pulsar el botón Create...
  5. Volver a Input Fields y pulsar Add. En Field [Input], en el combobox elegir <UserManager> y en Friendly Name escribir Usuario. En Regular Expression escribir \S+ . Luego pulsar el botón Create...
  6. De nuevo en Input Fields, pulsar Add. En Field [Input], en el combobox elegir <Password> y en Friendly Name escribir Contraseña. En Regular Expression escribir \S+ . Luego pulsar el botón Create...
  7. Otra vez en Input Fields, pulsar Add. En Field [Input], en el combobox elegir <ConnectorName> y en Friendly Name escribir NombreConector. En Regular Expression escribir \S+ . Luego pulsar el botón Create...
  8. Pulsar el botón Save.
  9. Ahora, en la consola de Cacti, acceder a Console->Templates->Data Templates, y luego seleccionar Tomcat Status. En la parte de abajo de la página, dentro de la sección Custom Data, marcar las casillas hostname, Puerto, Usuario, Contraseña y NombreConector. Cuando lo hayamos hecho pulsar el botón Save, que está muy a la derecha de la página (tendremos que usar la barra de desaplazamiento horizontal). Con esta acción, permitimos poder personalizar estas variables, cuando incluyamos las gráficas para algún Host.

La importación del XML, nos creó una plantilla de Host llamada TomcatServer con las cuatro gráficas. La usaremos porque en el mismo servidor Linux/Windows podríamos tener diferentes Tomcats configurados ejecutándose en diferentes puertos. Así, en vez de dar de alta las cuatro gráficas para un servidor (Linux/Windows), podríamos crear un nuevo Device que tuviera sólo estas cuatro gráficas, y estaríamos dando de alta un Tomcat: Cacti no tiene problema en que se repitan las direcciones IP, siempre que no se repitan los nombres de dispositivo. Me he encontrado clientes que tienen servidores Tomcat dedicados a una sóla aplicación, y que ejecutan varios de estos en el mismo servidor.
Ya sólo nos queda dar de alta una nueva aplicación o tomcat:
  1. Ir a Console->Devices->Add
  2. En la ventana que nos aparecerá rellenar los siguientes campos:
    • Description: app-NOMBRE_APLICACION-SERVIDOR
    • Hostname: Escribir la dirección IP del servidor.
    • Host Template: Seleccionar Tomcat Server
    • Downed Device Detection: Seleccionar Ping or SNMP
    Pulsar en el botón Create. Cambiará la página y nos dirá Save Successful.. Haremos click en Create Graphs for this Host.
  3. Cambiará la página. Ahora nos aparecerán las 4 gráficas de la plantilla: Create: Tomcat - Connection Rate, Create: Tomcat - Heap Statistics, Create: Tomcat - Thread Statistics y Create: Tomcat - Throughput.Marcar las casillas de verificación de cada fila y luego el botón Create.
  4. Ahora llega la hora de darle valor a las variables que hemos estado configurando para sean parametrizables. Lo bueno es que podremos monitorizar los tomcats que queramos y cómo queramos (puerto, usuario, conector, etc). Lo malo es que cada vez que demos de alta un nuevo Tomcat tendremos que rellenar estos campos cuatro veces, aunque podremos hacerlo copiando y pegando.Para completar estos campos necesitaremos saber los datos del tomcat que queremos monitorizar, y que averguamos al principio del post, cuando accedimos a http://IP_TOMCAT:PUERTO/manager/status?XML=true.
    • Hostname: escribir la dirección IP del servidor Tomcat
    • Puerto: Escribir el puerto en el que escucha HTTP ese Tomcat para poder llamar a la URL http://IP_TOMCAT:PUERTO/manager/status?XML=true.
    • Usuario: Escribir el login del usuario con el Rol Manager que puede acceder http://IP_TOMCAT:PUERTO/manager/status?XML=true
    • Contraseña: escribir la password de acceso para ese usuario.
    • NombreConector: escribir el nombre del conector que queremos monitorizar. En mi ejemplo usaré jk-9009.
    Esto debemos hacerlo para las cuatro gráficas: Copiando y pegando podemos ir bastante rápido. Cuando terminemos pulsar el botón Create.
  5. Ahora crearemos la entrada en el árbol de gráficas. Vamos a Graph Trees y desplegamos el árbol. Luego en Tree Items pinchamos en (Add) de Produccion->Aplicaciones_Java, o la rama que nos interese.
  6. Cambiar Tree Item Type y seleccionar Host. Luego buscar en Host el device que acabamos de crear y pinchar en el botón Create para guardar los cambios.
Después de esperar algunos minutos, podremos empezar a ver el resultado. Si por lo que sea alguna de las gráficas no se dibujara, deberíamos entrar en modo debug de la gráfica y ver cuál es la causa. Yo tuve este problema con las gráficas Connection Rate y Heap Statistics y según del depurador se debía a invalid y-grid. Fui a Console-<Templates-<Graph Templates de cada una y eliminé el valor que venía establecido por defecto, dejando el campo vacío. Alfonso, perdona por el retraso. Espero que os sirva.
La foto la he sacado del album de Katey Nicosia en flickr

2 comentarios:

bersuit.vera dijo...

¿Retraso? te pedí ayuda ayer a las 19 y las 00:30 ya estaba publicado :-)

Carlos dijo...

Hola,

Me llamo Carlos, soy de murcia tambien, y además trabajo en estas cosas de las que hablas.
He encontrado tu blog por casualidad y me parece interesante.
Soy administrador de sistemas. Me muevo en RHEL3-4-5, servidores HP DL o BL, eva4400, etc... A nivel software apache, tomcat, mrtg, nagios, cacti, ldap, QMAIL(*), etc.

Un saludo y encantado de 'conocerte'

Le echaré vistazos a tu blog de vez en cuando.

Carlos García.
cgg1234@gmail.com