13 Monitoreando JMX

Visión general

El monitoreo JMX se puede usar para monitorear los contadores JMX de una aplicación Java.

El monitoreo JMX tiene soporte nativo en Zabbix en forma demonio llamado "Zabbix Java gateway", introducido desde Zabbix 2.0.

Para recuperar el valor de un contador JMX en particular en un host, El servidor Zabbix consulta la puerta de enlace Java de Zabbix, que a su vez usa [JMX administración API] (http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/) para consultar la aplicación de interés de forma remota.

Para obtener más detalles y configuración, consulte Zabbix Java puerta de enlace.

::: nota de advertencia Comunicación entre la puerta de enlace de Java y la aplicación JMX monitoreada no debe estar con cortafuegos. :::

Habilitación del monitoreo JMX remoto para aplicaciones Java

Una aplicación Java no necesita ningún software adicional instalado, pero debe iniciarse con las opciones de línea de comandos especificadas a continuación para tener soporte para monitoreo JMX remoto.

Como mínimo, si sólo desea comenzar monitoreando una aplicación Java simple en un equipo local sin seguridad, comience con estas opciones:

java\
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345\
       -Dcom.sun.management.jmxremote.authenticate=false \
       -Dcom.sun.management.jmxremote.ssl=false \
       -Dcom.sun.management.jmxremote.registry.ssl=false \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

Esto hace que Java escuche las conexiones JMX entrantes en el puerto 12345, desde el equipo local únicamente y le indica que no requiera autenticación ni SSL.

Si desea permitir conexiones en otra interfaz, configure el parámetro -Djava.rmi.server.hostname a la IP de esa interfaz.

Si desea ser más estricto con la seguridad, existen muchas otras opciones de Java disponibles para usted. Por ejemplo, el siguiente ejemplo inicia la aplicación con un conjunto más versátil de opciones y la abre a un público más amplio de red, no solo al equipo local.

java\
       -Djava.rmi.server.hostname=192.168.3.14\
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345\
       -Dcom.sun.management.jmxremote.authenticate=true \
       -Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
       -Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
       -Dcom.sun.management.jmxremote.ssl=true\
       -Dcom.sun.management.jmxremote.registry.ssl=true \
       -Djavax.net.ssl.keyStore=$TU_TIENDA_LLAVES \
       -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
       -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
       -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
       -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

La mayoría (si no todas) de estas configuraciones se pueden especificar en /etc/java-6-openjdk/management/management.properties (o donde sea que el archivo este en su sistema).

Tenga en cuenta que si desea utilizar SSL, debe modificar el script startup.sh. agregando opciones -Djavax.net.ssl.* a la puerta de enlace Java, para que sepa dónde encontrar las tiendas de claves y de confianza.

Consulte Monitoreo y gestión utilizando JMX para una descripción detallada.

Configuración de interfaces JMX y elementos en la interfaz de Zabbix

Con la puerta de enlace de Java ejecutándose, el servidor sabe dónde encontrarla y una aplicación Java comenzó con soporte para monitoreo JMX remoto, es hora para configurar las interfaces y los elementos en Zabbix GUI.

Configuración de la interfaz JMX

Comienza creando una interfaz de tipo JMX en el host de interés.

Todos los campos de entrada obligatorios están marcados con un asterisco rojo.

Agregar elemento de agente JMX

Para cada contador JMX que le interese, agregue el elemento Agente JMX conectado a esa interfaz.

La clave en la captura de pantalla a continuación dice jmx["java.lang:type=Memory","HeapMemoryUsage.used"].

Todos los campos de entrada obligatorios están marcados con un asterisco rojo.

Los campos que requieren información específica para artículos JMX son:

Escriba Establezca agente JMX aquí.
Clave La clave de elemento jmx[] contiene tres parámetros:
nombre de objeto: el nombre de objeto de un MBean
nombre de atributo: un nombre de atributo de MBean con compuesto opcional nombres de campos de datos separados por puntos
descripción breve única: una descripción única que permite múltiples elementos JMX con el mismo nombre de objeto y nombre de atributo en el host (opcional)
Consulte a continuación para obtener más detalles sobre el elemento JMX claves.
Desde Zabbix 3.4, puede descubrir MBeans y atributos de MBean usando un elemento jmx.discovery[] descubrimiento de bajo nivel.
Punto final JMX Puede especificar un punto final JMX personalizado. Asegúrese de que los parámetros de conexión del extremo JMX coincidan con la interfaz JMX. Esto se puede lograr mediante el uso de macros {HOST.*} como se hace en el punto final JMX predeterminado.
Este campo es compatible desde 3.4.0. Se admiten {HOST.*} macros y macros de usuario.
Nombre de usuario Especifique el nombre de usuario, si ha configurado la autenticación en su aplicación Java.
Se admiten macros de usuario.
Contraseña Especifique la contraseña, si ha configurado la autenticación en su aplicación Java.
Se admiten macros de usuario.

Si desea monitorear un contador booleano que es "verdadero" o "falso", luego especifica el tipo de información como "Numérico (sin firmar)" y seleccione el paso de preprocesamiento "Booleano a decimal" en el Preprocesamiento pestaña. El servidor almacenará valores booleanos como 1 o 0, respectivamente.

Claves de elementos JMX con más detalle

Atributos simples

El nombre de un objeto MBean no es más que una cadena que usted define en su Aplicación Java. Por otro lado, el nombre de un atributo puede ser más complejo. En caso de que un atributo devuelva un tipo de datos primitivo (un número entero, una cadena, etc.) no hay nada de qué preocuparse, la clave se verá así:

jmx[com.example:Type=Hello,weight]

En este ejemplo, el nombre del objeto es "com.example:Type=Hello", el atributo del nombre es "peso", y el tipo de valor devuelto probablemente debería ser "Numérico (flotante)".

Atributos que devuelven datos compuestos

Se vuelve más complicado cuando su atributo devuelve datos compuestos. Por ejemplo: el nombre de su atributo es "manzana" y devuelve un hash representando sus parámetros, como "peso", "color", etc. Su clave puede se parece a esto:

jmx[com.ejemplo:Tipo=Hola,apple.peso]

Así es como se separan un nombre de atributo y una clave hash, utilizando un símbolo de punto De la misma manera, si un atributo devuelve datos compuestos anidados, el las partes están separadas por un punto:

jmx[com.ejemplo:Tipo=Hola,frutas.manzana.peso]
Atributos que devuelven datos tabulares

Los atributos de datos tabulares constan de uno o varios atributos compuestos. Si dicho atributo se especifica en el parámetro de nombre de atributo, entonces este valor del elemento devolverá la estructura completa del atributo en formato JSON. Los valores de los elementos individuales dentro de los datos tabulares El atributo se puede recuperar mediante preprocesamiento.

Ejemplo de atributo de datos tabulares:

 jmx[com.ejemplo:tipo=Hola,foodinfo]

Valor del ítem:

[
         {
           "una manzana",
           "b": "plátano",
           "c": "cereza"
         },
         {
           "una papa",
           "b": "lechuga",
           "c": "cebolla"
         }
       ]
Problema con los puntos

Hasta aquí todo bien. Pero, ¿Qué pasa si un nombre de atributo o una clave hash contiene un punto? ¿símbolo? Aquí hay un ejemplo:

jmx[com.ejemplo:Tipo=Hola,todas.frutas.manzana.peso]

Eso es un problema. Cómo decirle a Zabbix que el nombre del atributo es "todas las frutas", no solo "todas"? Cómo distinguir un punto que es parte de el nombre del punto que separa un nombre de atributo y claves hash?

Antes de ** 2.0.4 **, la puerta de enlace Zabbix Java no podía manejar tales situaciones y los usuarios se quedaron con elementos NO COMPATIBLES. Desde 2.0.4 esto es posible, todo lo que necesita hacer es escapar de los puntos que son parte de el nombre con una barra invertida:

jmx[com.ejemplo:Tipo=Hola,todos\.frutas.manzana.peso]

De la misma manera, si su clave hash contiene un punto, escápelo:

jmx[com.ejemplo:Tipo=Hola,todas\.frutas.manzana.total\.peso]
Otros temas

Se debe utilizar como carácter de escape un carácter de barra invertida en el nombre de un atributo:

jmx[com.example:type=Hello,c:\\documents]

Para manejar cualquier otro carácter especial en la clave de elemento JMX, consulte la sección del formato de clave de la métrica.

En realidad, esto es todo lo que hay que hacer. ¡Feliz monitoreo JMX!

Tipos de datos no primitivos

Desde Zabbix 4.0.0 es posible trabajar con MBeans personalizados que regresan tipos de datos no primitivos, que anulan el método toString().

Uso de un punto final personalizado con JBoss EAP 6.4

Los puntos finales personalizados permiten trabajar con diferentes protocolos de transporte, distintos al RMI predeterminado.

Para ilustrar esta posibilidad, intentemos configurar el monitoreo de JBoss EAP 6.4 como ejemplo. Primero, hagamos algunas suposiciones:

  • Ya ha instalado la puerta de enlace Java Zabbix. Si no, entonces hágalo de acuerdo con la documentación.
  • El servidor Zabbix y la puerta de enlace Java se instalan con el prefijo /usr/local/
  • JBoss ya está instalado en /opt/jboss-eap-6.4/ y se está ejecutando en modo independiente
  • Supondremos que todos estos componentes funcionan en el mismo equipo.
  • Firewall y SELinux están deshabilitados (o configurados en consecuencia)

Hagamos algunas configuraciones simples en zabbix_server.conf:

JavaGateway=127.0.0.1
       StartJavaPollers=5

Y en el archivo de configuración zabbix_java/settings.sh (o zabbix_java_gateway.conf):

START_POLLERS=5

Verifique que JBoss escuche su puerto de administración estándar:

$ netstat -natp | grep 9999
       tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 10148/java

Ahora creemos un equipo con la interfaz JMX 127.0.0.1:9999 en Zabbix.

Como sabemos, esta versión de JBoss utiliza el protocolo JBoss Remoting en lugar de RMI, podemos actualizar masivamente el parámetro del punto final JMX para las métricas de nuestra plantilla JMX en consecuencia:

service:jmx:remoting-jmx://{HOST.CONN}:{HOST.PORT}

Actualicemos la caché de configuración:

$ /usr/local/sbin/zabbix_server -R config_cache_reload

Tenga en cuenta que puede encontrar un error primero.

"Protocolo no compatible: remoting-jmx" significa que la puerta de enlace Java no saber trabajar con el protocolo especificado. Eso se puede arreglar creando un archivo ~/needed_modules.txt con el siguiente contenido:

jboss-as-remoting
       jboss-logging
       jboss-logmanager
       jboss-marshalling
       jboss-remoting
       jboss-sasl
       jcl-over-slf4j
       jul-to-slf4j-stub
       log4j-jboss-logmanager
       remoting-jmx
       slf4j-api
       xnio-api
       xnio-nio

y luego ejecutando el comando:

$ for i in $(cat ~/needed_modules.txt); do find /opt/jboss-eap-6.4 -iname "${i}*.jar" -exec cp '{}' /usr/local/sbin/zabbix_java/lib/ \; ; done

Por lo tanto, la puerta de enlace Java tendrá todos los módulos necesarios para trabajar con jmx-remoto. Lo que queda es reiniciar el gateway Java, esperar un poco y si lo hizo todo bien, verá que los datos de monitoreo de JMX comienzan a llegar a Zabbix (ver también: Últimos datos).