Si se desea monitorear un servidor GlassFish, collectd cuenta con el plugin GenericJMX, el cual permite recolectar estadísticas de un servidor de aplicación Java mediante el framework de administración JMX (Java Management Extensions). Este artículo explica detalladamente cómo compilar y configurar collectd para recolectar datos estadísticos de un servidor GlassFish que cuente con el conector JMX habilitado, con el objetivo de graficar métricas de desempeño utilizando InfluxDB+Grafana.

El plugin "GenericJMX" lee Managed Beans (MBeans) desde un servidor MBeanServer utilizando JMX. El framework JMX (Java Management Extensions) permite definir y consultar información de manejo varia. Se trata de una interfaz a través de la cual la máquina virtual de Java (JVM) provee información acerca de la cantidad de memoria utilizada, hilos en ejecución, etc. De esta forma, estos valores de rendimiento básicos pueden ser recolectados de cualquier proceso Java, sin necesidad de soporte alguno por parte del proceso en sí.

Este plugin está escrito en Java, con lo cual se requiere contar con el plugin "java" para su funcionamiento.

Configuración de JMX

Antes de comenzar con la configuración de collectd, es necesario verificar si JMX se encuentra habilitado en el servidor GlassFish.

Para ello simplemente es posible comprobar si se encuentra el mensaje de inicio del servicio JMX en el log del servidor GlassFish (server.log). Por ejemplo:

JMXStartupService had Started JMXConnector on JMXService URL service:jmx:rmi://glassfish.linuxito.com:8686/jndi/rmi://glassfish.linuxito.com:8686/jmxrmi

Al mismo tiempo, el puerto 8686 se encuentra abierto y aceptando peticiones:

[root@glassfish ~]# netstat -tulpn | grep 8686
tcp        0      0 0.0.0.0:8686                0.0.0.0:*                   LISTEN      2027/java

La configuración del conector JMX se encuentra en el archivo de configuración del dominio domain.xml:

      <admin-service system-jmx-connector-name="system" type="das-and-server">
        <jmx-connector port="8686" address="0.0.0.0" security-enabled="false" auth-realm-name="admin-realm" name="system"></jmx-connector>
        <property name="adminConsoleContextRoot" value="/admin"></property>
        <property name="adminConsoleDownloadLocation" value="${com.sun.aas.installRoot}/lib/install/applications/admingui.war"></property>
        <property name="ipsRoot" value="${com.sun.aas.installRoot}/.."></property>
        <das-config></das-config>
      </admin-service>

Configuración de collectd

Como se mencionaba al comienzo del artículo, a fin de dar soporte al plugin GenericJMX es necesario a su vez contar con el plugin "java". Por ende es necesario compilar collectd con soporte para el mismo agregando la opción --enable-java.

Una vez instalado (ver el artículo enlazado), configurar el plugin "GenericJMX":

# cd /usr/local/collectd/etc/
# nano collectd.conf

Primero es necesario habilitar el plugin "java":

LoadPlugin java

Luego configurar el plugin java, y a su vez dentro del mismo el plugin GenericJMX:

<Plugin java>
        JVMArg "-verbose:jni"
        JVMArg "-Djava.class.path=/usr/local/collectd/share/collectd/java/collectd-api.jar:/usr/local/collectd/share/collectd/java/generic-jmx.jar"

  LoadPlugin "org.collectd.java.GenericJMX"
  <Plugin "GenericJMX">
    # Memory usage by memory pool.
    <MBean "memory_pool">
      ObjectName "java.lang:type=MemoryPool,*"
      InstancePrefix "memory_pool-"
      InstanceFrom "name"
      <Value>
        Type "memory"
        #InstancePrefix ""
        #InstanceFrom ""
        Table true
        Attribute "Usage"
      </Value>
    </MBean>

    <Connection>
      Host "glassfish.linuxito.com"
      ServiceURL "service:jmx:rmi://glassfish.linuxito.com:8686/jndi/rmi://glassfish.linuxito.com:8686/jmxrmi"
      Collect "memory_pool"
      User "collectd"
      Password "****"
    </Connection>
  </Plugin>

#       LoadPlugin "org.collectd.java.Foobar"
#       <Plugin "org.collectd.java.Foobar">
#         # To be parsed by the plugin
#       </Plugin>
</Plugin>

La sección "Connection" se definen los parámetros del conector JMX.

Luego en la configuración del plugin GenericJMX se definen diferentes bloques MBeans, los cuales especifican qué dato es traído desde qué MBean (y cómo se mapean a tipos de datos de collectd).

En el ejemplo se utiliza un único bloque MBean para recuperar información de uso de memoria por cada pool (objeto MemoryPool).

En la página de configuración del plugin GenericJMX se encuentran ejemplos para cada tipo de MBean disponible.

Configuración de GlassFish

Notar que la conexión con JMX utiliza autenticación (ver "User" y "Password" dentro de la sección "Connection"). Si no se dispone de un usuario válido (que no sea "admin") será necesario crear uno para collectd.

Abrir la consola de administración del servidor GlassFish (vía HTTP en el puerto 4848) y acceder al menú "Configuraciones > server-config > Seguridad > Dominios > admin-realm":

Editar el dominio de seguridad presionando el botón "Gestionar Usuarios":

Luego presionar "Nuevo..." para crear un nuevo usuario:

Ingresar el ID de usuario y contraseña, las cuales serán configuradas en la sección "Connection" del plugin java de colectd.

Graficando métricas de memoria en Grafana

A partir de los datos recolectados utilizando la configuración anterior, es posible obtener las siguientes gráficas del heap de Java:

A fin de comprender cómo está estructurado el heap de Java recomiendo leer el siguiente artículo: Basics of Java Garbage Collection.

Referencias


Tal vez pueda interesarte


Compartí este artículo