Monitoring Alfresco: Nagios/Icinga, Hyperic, AuditSurf… JMX rocks!

Si tenemos Alfresco en producción (versión Enterprise), posiblemente queramos tener la aplicación controlada de la mejor forma posible y sobre todo que ese control nos aporte una visión real de lo que está pasando en el servidor y en la aplicación. Una monitorización efectiva nos permite controlar los problemas con el servicio, atisbar problemas futuros de rendimiento, detectar cuellos de botella, anomalías, etc.

Basic RGBnagios hypericauditsurf

La necesidad estaba ahí, necesitamos una solución de monitorización potente para Alfresco. Las versiones 3.X de Alfresco Enterprise permite ver y modificar muchos propiedades de la aplicación en tiempo real, por ejemplo:

  • Cambiar el nivel de log
  • Activar o desactivar FTP, CIFS o NFS
  • Poner el repositorio en solo lectura.
  • Poner el servidor en mono-usuario.
  • Limitar el número máximo de usurios o evitar accesos adicionales.
  • Ver número de sesiones y tickets de usuarios.
  • Ver número de sesiones y tickets no válidos.
  • Y muchos parámetros más.

Todo esto es gracias al soporte de JSR-160 vía JMX.

Vamos a ver qué opciones existen y cómo podemos implementarlas. Haremos un repaso a Hyperic, AuditSurf, cómo conectar a Alfresco con Jconsole y por último cómo implementar este tipo de monitorización con Nagios o Icinga (nuevo fork de Nagios).

ACTUALIZACION: No olvides ver este y este post. A partir de este artículo hice el módulo de Nagios para Alfresco.

HYPERIC

El software de monitorización Hyperic, recientemente adquirido por la compañía Spring Source, tiene un plugin para su versión 4.0 que permite autodiscovering y monitorización de Alfresco Enterprise a través de un agente instalado en el servidor donde reside la aplicación. La monitorización que nos ofrece es bastante completa y visual (ver captura). Hyperic es una aplicación en crecimiento, su modelo y funcionalidades han hecho que su base de usuarios crezca en los últimos años. Para monitorización completa con Hyperic se necesita una suscripción de soporte con Alfresco.

cap-hyperic-alfresco

AUDITSURF

Gracias a la ampliación de las funcionalidades a las que podemos acceder por JMX de Alfresco, han salido aplicaciones como AuditSurf, de descarga gratuita en forge.alfresco.com, que nos dan una visión gráfica de lo que ocurre en el servidor en tiempo real. Su instalación es muy sencilla, hay que copiar un par de archivos al directorio extension, desplegar el war de la aplicación auditsurf.war y aplicar el módulo AMP a nuestro alfresco.war, el comando podría ser como este (depende del PATH):

# java -jar alfresco-mmt.jar install auditsurf.amp ruta-hacia/alfresco.war

Una vez realizada la instalación podremos acceder vía http://localhost/auditsurf el usuario y contraseña de admin.

audit_graph

audit_dashboard

audit_monitoring

JCONSOLE

Para acceder a los servicios que ofrece Alfresco por JMX, vía RMI, una de las herramientas gráficas que nos permiten ver las opciones que nos aporta Alfresco en este sentido es jconsole (binario que incorpora con la JDK), aunque hay otros igual de válidos.

Vamos a ver como conectar con Alfresco con jconsole:

Ejecutamos el comando jconsole y en la URL de conexión (Remote process) deberíamos escribir:

service:jmx:rmi:///jndi/rmi://servername:50500/alfresco/jmxrmi

Una vez conectados veríamos algo así, captura de pantalla de dos sesiones, la de atrás de Alfresco Community Labs 3.2r y la de alante de Alfresco Enterprise, las diferencias son obvias.

jconsole

El usuario y contraseña por defecto para acceder por JMX son controlRole/change_asap. Es recomendable cambiarlos por un usuario con sólo permisos de lectura y una contraseña diferente a la por defecto, podemos hacerlo en los siguientes ficheros y reiniciar Alfresco:

TOMCAT_PATH/webapps/alfresco/WEB-INF/classes/alfresco/alfresco-jmxrmi.access

monitorRole   readonly
#controlRole   readwrite

TOMCAT_PATH/webapps/alfresco/WEB-INF/classes/alfresco/alfresco-jmxrmi.password

monitorRole  nuevopassword
#controlRole  change_asap

NAGIOS e ICINGA

Pasamos a la parte más interesante, cómo monitorizar Alfresco con Nagios/Icinga (a partir de ahora Icinga, pero recuerda que estos pasos son válidos para ambos y los plugins también). Instalar Icinga es bastante fácil, basta con seguir los pasos que se marcan en esta página y en 20 minutos tendrás un servidor de monitorización funcionando. Como he comentado anteriormente, los plugins de Icinga son los mismos que los de Nagios y la configuración, ubicación y uso son idénticos, así que no tendremos ningún problema en usarlos.

Buscando, buscando, encontramos un plugin llamado “nagios-jmx-plugin” que se puede descargar desde aquí, que nos permite consultar valores y aplicar umbrales para alertas tipo Warning o Critical. Veamos un ejemplo para consultar la memoria heap usada desde la línea de comandos con el plugin:

Memoria heap usada:

# ./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O java.lang:type=Memory -A HeapMemoryUsage -K used -username controlRole -password change_asap -w 100000000 -c 200000000
JMX OK -HeapMemoryUsage.used = 91618296

En algunos de los ejemplos que vamos a ver uso dos umbrales en bytes, 100000000 para los Warnings y 200000000 para los Critical, por su puesto, tu deberás adaptarlos a tus necesidades.

Otros checks que se pueden hacer a Alfresco o al sistema pueden ser como los siguientes (probados con Alfresco Enterprise 3.1):

Carga media del sistema:
# ./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O java.lang:type=OperatingSystem -A SystemLoadAverage -username controlRole -password change_asap -w 100000000 -c 200000000
JMX OK -SystemLoadAverage = 0.0

Memoria no heap usada:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O java.lang:type=Memory -A NonHeapMemoryUsage -K used -username controlRole -password change_asap -w 100000000 -c 200000000
JMX OK -NonHeapMemoryUsage.used = 87816024

Numero total de usuarios existentes en Alfresco:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=Authority -A NumberOfUsers -username controlRole -password change_asap -w 500 -c 600

Numero total de grupos existentes en Alfresco:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=Authority -A NumberOfGroups -username controlRole -password change_asap -w 100 -c 200

Conexiones activas con la BBDD:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=ConnectionPool -A NumActive -username controlRole -password change_asap -w 100000000 -c 200000000

Tamaño del repositorio en bytes (usar audit.contentstore o contentstore.deleted para ver su uso de disco):
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=ContentStore,Type=org.alfresco.repo.content.filestore.FileContentStore,Root=/Alfresco-3.1.1E/alf_data/contentstore -A TotalSize -username controlRole -password change_asap -w 100000000 -c 200000000

Hibernate (consulta uno de los muchos valores de los que disponemos):
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=Hibernate -A ConnectCount -username controlRole -password change_asap -w 100000000 -c 200000000

Lucene (tamaño de los índices del workspace/SpacesStore)
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=LuceneIndexes,Index=workspace/SpacesStore -A UsedSize -username controlRole -password change_asap -w 100000000 -c 200000000

Lucene (numero de documentos indexados en workspace/SpacesStore)
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=LuceneIndexes,Index=workspace/SpacesStore -A NumberOfDocuments -username controlRole -password change_asap -w 100000000 -c 200000000

Sesiones abiertas:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=RepoServerMgmt -A TicketCountAll -username controlRole -password change_asap -w 100000000 -c 200000000

Usuarios conectados:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=RepoServerMgmt -A UserCountAll -username controlRole -password change_asap -w 1000 -c 2000

Memoria total usada por Alfresco en bytes:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=Runtime -A TotalMemory -username controlRole -password change_asap -w 100000000 -c 200000000

Memoria libre disponible para Alfresco en bytes:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Alfresco:Name=Runtime -A FreeMemory -username controlRole -password change_asap -w 100000000 -c 200000000

Caché usada por el servidor de aplicaciones Tomcat para Alfresco:
./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:50500/alfresco/jmxrmi -O Catalina:type=Cache,host=localhost,path=/alfresco -A cacheSize -username controlRole -password change_asap -w 100000000 -c 200000000

Comprobados esos comandos, primer paso antes de implementar un nuevo plugin de Icinga, pasamos a crear los ficheros de definición de comandos de Icinga, por ejemplo contenido del fichero “alfresco-jmx.cfg“, ojo, revisa las rutas sobre todo del repositorio para que todo funcione correctamente en estos commands:

# ‘check_alfresco_HeapMemoryUsage_Used’ command definition
define command {
command_name    check_alfresco_HeapMemoryUsage_Used
command_line    /usr/local/icinga/libexec/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$’
}

# ‘check_alfresco_NoHeapMemoryUsage_Used’ command definition
define command {
command_name    check_alfresco_NoHeapMemoryUsage_Used
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O java.lang:type=Memory -A NonHeapMemoryUsage -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_SystemLoadAverage’ command definition
define command {
command_name    check_alfresco_SystemLoadAverage
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O java.lang:type=OperatingSystem -A SystemLoadAverage -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_NumberOfUsers’ command definition
define command {
command_name    check_alfresco_NumberOfUsers
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=Authority -A NumberOfUsers -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_NumberOfGroups’ command definition
define command {
command_name    check_alfresco_NumberOfgroups
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=Authority -A NumberOfGroups -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_ConnectionPool’ command definition
define command {
command_name    check_alfresco_ConnectionPool
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=ConnectionPool -A NumActive -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_ContentStoreSize’ command definition
define command {
command_name    check_alfresco_ContentStoreSize
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=ContentStore,Type=org.alfresco.repo.content.filestore.FileContentStore,Root=/Alfresco-3.1.1E/alf_data/contentstore -A TotalSize -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_HibernateConnectCount’ command definition
define command {
command_name    check_alfresco_HibernateConnectCount
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=Hibernate -A ConnectCount -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_LuceneIndexesSpacesStoreUsed’ command definition
define command {
command_name    check_alfresco_LuceneIndexesSpacesStoreUsed
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=LuceneIndexes,Index=workspace/SpacesStore -A UsedSize -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_LuceneIndexesSpacesStoreNumDocs’ command definition
define command {
command_name    check_alfresco_LuceneIndexesSpacesStoreNumDocs
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=LuceneIndexes,Index=workspace/SpacesStore -A NumberOfDocuments -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_RepoServerMgmtSessions’ command definition
define command {
command_name    check_alfresco_RepoServerMgmtSessions
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=RepoServerMgmt -A TicketCountAll -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_RepoServerMgmtUsersConnected’ command definition
define command {
command_name    check_alfresco_RepoServerMgmtUsersConnected
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=RepoServerMgmt -A UserCountAll -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_TotalMemoryUsed’ command definition
define command {
command_name    check_alfresco_TotalMemoryUsed
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=Runtime -A TotalMemory -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_FreeMemory’ command definition
define command {
command_name    check_alfresco_FreeMemory
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Alfresco:Name=Runtime -A FreeMemory -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

# ‘check_alfresco_AlfrescoCache’ command definition
define command {
command_name    check_alfresco_AlfrescoCache
command_line    /usr/local/icinga/libexec/check_jmx -U service:jmx:rmi:///jndi/rmi://’$HOSTADDRESS$’:’$ARG1$’/jmxrmi -O Catalina:type=Cache,host=localhost,path=/alfresco -A cacheSize -username ‘$ARG2$’ -password ‘$ARG3$’ -w ‘$ARG4$’ -c ‘$ARG5$’
}

El uso o invocación de dichos comandos sería algo así como:

check_alfresco_HeapMemoryUsage_Used!PORT!USERNAME!PASSWORD!750000000!800000000
check_alfresco_NoHeapMemoryUsage_Used!PORT!USERNAME!PASSWORD!750000000!800000000
check_alfresco_SystemLoadAverage!PORT!USERNAME!PASSWORD!0.8!0.9
check_alfresco_NumberOfUsers!PORT!USERNAME!PASSWORD!400!500
check_alfresco_NumberOfgroups!PORT!USERNAME!PASSWORD!50!70
check_alfresco_ConnectionPool!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_ContentStoreSize!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_HibernateConnectCount!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_LuceneIndexesSpacesStoreUsed!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_LuceneIndexesSpacesStoreNumDocs!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_RepoServerMgmtSessions!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_RepoServerMgmtUsersConnected!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_TotalMemoryUsed!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_FreeMemory!PORT!USERNAME!PASSWORD!100000000!200000000
check_alfresco_AlfrescoCache!PORT!USERNAME!PASSWORD!100000000!200000000

Espero vuestros comentarios, sugerencias, correcciones y demás. Seguro que todo esto se puede mejorar bastante.

Posiblemente este artículo pueda desembocar en un proyecto que permita instalar y usar este plugin de una forma más rápida y sencilla, y sobre todo sin tener que leer este blog 😉

Gracias Vaik, por la revisión y comentarios.

Nos vemos a la vuelta de la ruta.

20 thoughts to “Monitoring Alfresco: Nagios/Icinga, Hyperic, AuditSurf… JMX rocks!”

  1. hola toni, disculpa no se si sepas de algunas herramientas de monitoreo para windows con alfresco..seria de mucha ayuda gracias..el articulo es bastante ilustrativo me da un norte para lo que necesito

  2. Hola Luis, la versión Community exporta menos información por JMX que la Enterprise por lo que algunos chequeos no funcionarán.

    Saludos.

  3. Hola Toni,

    Yo usé JMX en la versión 3.2r y no tuve que configurar gran cosa para accender, sin embargo después actualicé a 3.3.4 y ya no puedo conectar.

    Sabes si hay alguna configuración especial que hacer con esta versión?

    Ya apliqué todo lo que encontré en la wiki y en jira pero no funciona.

    Saludos.

  4. Hola Rob, no debería haber ningún cambio pero igual deberías revisar los ficheros de propiedades por si viene configurado por defecto a que escuche en localhost y por eso no puedes conectar.

    Comprueba que está el puerto 50500 abierto en el servidor y que tienes acceso a él por TCP.

    Saludos.

  5. Hola Toni gracias por tu aporte he logrado integrar nagios con alfresco
    pero no entiendo a que se refiere esta información ya que no son números de documentos cargados desde alfresco.

    Alfresco – Number of Docs Alfresco Core
    OK 07-04-2013 17:45:21 0d 0h 22m 11s 1/4 JMX OK -NumDocuments = 2157
    ********************************
    Alfresco – Number of Docs Archive Core
    OK 07-04-2013 17:45:36 0d 0h 23m 27s 1/4 JMX OK -NumDocuments = 509

    Espero me puedas ayudar con esta duda.

  6. Hola Miguel,

    Se refiere al numero total de nodos en cada core, es decir, en el Alfresco Workspace (donde están todos los contenidos) y en el Archive Core que se refiere a la papelera.

    Saludos.

  7. Gracias toni por tu pronta respuesta en cuanto al workspace te refieres a la carpeta contentstore y el archive core seria contentstore.deleted en ninguno de los casos coinciden los número de archivos almacenados ejm:contentstore.deleted no contiene archivo alguno y en nagios muestra 509. Me corriges si estoy equivocado en cuando a la interpretación de las carpetas que mencionas.

    Saludos y gracias nuevamente

  8. Hi Toni
    i’m kind of new to Linux, i did manage to install Nagios and downloaded the nagios-jmx-plugin and put it in the correct directory. now what i would like to know is, where do i configure the rest so that i can see all the checks.

    regards

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.