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 RGBnagioshypericauditsurf
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 aHypericAuditSurf, 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).

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 tipoWarning 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 ;)

Comentarios

Entradas populares de este blog

Orange Pi IoT 2G Flashear memoria NAND

Usar datos gratis para proyectos IoT FreedomPop y Orange Pi 2G IoT (también Simyo).

Configurar modem GSM en la Orange Pi 2G IoT (Orange España)