[comment]: # ({f8c9b9d8-627e4087})
# 13 agent JMX

[comment]: # ({/f8c9b9d8-627e4087})

[comment]: # ({c24e6196-e3fddc4c})
#### Descripción general

La monitorización JMX puede utilizarse para monitorizar contadores JMX de una aplicación Java.

La monitorización JMX tiene soporte nativo en Zabbix en forma de un demonio de Zabbix llamado "Java gateway de Zabbix".

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

Para más detalles y configuración, consulte la sección [Java gateway de Zabbix](/manual/concepts/java).

::: notewarning
La comunicación entre el Java gateway y la aplicación JMX monitorizada no debe estar bloqueada por el firewall.
:::

[comment]: # ({/c24e6196-e3fddc4c})

[comment]: # ({a779159e-7feef73e})
#### Habilitar la monitorización remota JMX para una aplicación 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 la monitorización remota JMX.

Como mínimo, si solo desea comenzar monitorizando una
aplicación Java simple en un equipo local sin seguridad aplicada, iníciela
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 /ruta/a/su/aplicacion.jar

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

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

Si desea ser más estricto con la seguridad, hay muchas otras
opciones de Java disponibles para usted. Por ejemplo, el siguiente ejemplo inicia la
aplicación con un conjunto de opciones más versátil y la abre a una red más amplia,
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=$YOUR_KEY_STORE \
    -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 /ruta/a/su/aplicacion.jar

La mayoría (si no todas) de estas configuraciones pueden especificarse en
`$JRE/lib/management/management.properties` (o dondequiera que
se encuentre ese archivo en su sistema).

Tenga en cuenta que si desea usar SSL, debe modificar el script startup.sh
agregando las opciones `-Djavax.net.ssl.*` al Java gateway, para que sepa
dónde encontrar los almacenes de claves y de confianza.

Consulte [Monitorización y gestión usando
JMX](http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html)
para una descripción detallada.

[comment]: # ({/a779159e-7feef73e})

[comment]: # ({4b8fd32c-4b8fd32c})
#### Configuración de interfaces y métricas JMX en el frontend de Zabbix

Con el Java gateway en ejecución, el servidor sabiendo dónde encontrarlo y una aplicación Java iniciada con soporte para la monitorización remota de JMX, es momento de configurar las interfaces y métricas en la interfaz gráfica de Zabbix.

[comment]: # ({/4b8fd32c-4b8fd32c})

[comment]: # ({1b504993-01c1becc})
##### Configuración de la interfaz JMX

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

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_interface.png){width="600"}

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

[comment]: # ({/1b504993-01c1becc})

[comment]: # ({80acb0d4-f55573f5})
##### Añadir un item de agente JMX

Para cada contador JMX que le interese, añada un **item de agente JMX** adjunto a esa interfaz.

La clave en la captura de pantalla de abajo dice
`jmx["java.lang:type=Memory","HeapMemoryUsage.used"]`.

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_item.png){width="600"}

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

Los campos que requieren información específica para los items JMX son:

|   |   |
|--|--------|
|*Tipo*|Establezca **agente JMX** aquí.|
|*Clave*|La clave del item `jmx[]` contiene tres parámetros:<br>**nombre del objeto** - el nombre del objeto de un MBean<br>**nombre del atributo** - un nombre de atributo de MBean con nombres de campos de datos compuestos opcionales separados por puntos<br>**descripción corta única** - una descripción única que permite múltiples items JMX con el mismo nombre de objeto y nombre de atributo en el host (opcional)<br>Consulte más abajo para obtener más detalles sobre las claves de los items JMX.<br>Puede descubrir MBeans y atributos de MBean utilizando un item de [descubrimiento de bajo nivel](/manual/discovery/low_level_discovery/examples/jmx) `jmx.discovery[]`.|
|*JMX endpoint*|Puede especificar un endpoint JMX personalizado. Asegúrese de que los parámetros de conexión del endpoint JMX coincidan con la interfaz JMX. Esto se puede lograr utilizando macros {HOST.\*} como se hace en el endpoint JMX por defecto.<br>Se admiten [macros](/manual/appendix/macros/supported_by_location) {HOST.\*} y macros de usuario.|
|*Nombre de usuario*|Especifique el nombre de usuario (hasta 255 caracteres), si ha configurado autenticación en su aplicación Java.<br>Se admiten macros de usuario.|
|*Contraseña*|Especifique la contraseña (hasta 255 caracteres), si ha configurado autenticación en su aplicación Java.<br>Se admiten macros de usuario.|

Si desea monitorizar un contador Booleano que sea "true" o "false", debe especificar el tipo de información como "Numérico (sin signo)" y seleccionar el paso de preprocesamiento "Booleano a decimal" en la pestaña Preprocesamiento. El servidor almacenará los valores Booleanos como 1 o 0, respectivamente.

[comment]: # ({/80acb0d4-f55573f5})

[comment]: # ({9430cb1d-9430cb1d})
#### Claves de métricas JMX en detalle

[comment]: # ({/9430cb1d-9430cb1d})

[comment]: # ({2fbbf1c5-105cc785})
##### Atributos simples

Un nombre de objeto MBean no es más que una cadena que usted define en su
aplicación Java. Un nombre de atributo, por otro lado, puede ser más
complejo. En caso de que un atributo devuelva un tipo de dato primitivo (un entero, una
cadena, etc.), no hay 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 nombre del atributo
es "weight", y el tipo de valor devuelto probablemente debería ser "Numérico
(flotante)".

[comment]: # ({/2fbbf1c5-105cc785})

[comment]: # ({00e3fc9b-00e3fc9b})
##### Atributos que devuelven datos compuestos

Se vuelve más complicado cuando su atributo devuelve datos compuestos.
Por ejemplo: el nombre de su atributo es "apple" y devuelve un hash
que representa sus parámetros, como "weight", "color", etc. Su clave podría
verse así:

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

Así es como se separan el nombre del atributo y la clave del hash, utilizando un
punto. De la misma manera, si un atributo devuelve datos compuestos anidados, las
partes se separan por un punto:

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

[comment]: # ({/00e3fc9b-00e3fc9b})

[comment]: # ({ae61b0e7-ae61b0e7})
##### Atributos que devuelven datos tabulares

Los atributos de datos tabulares consisten en uno o varios atributos compuestos.
Si dicho atributo se especifica en el parámetro de nombre de atributo, entonces
el valor de esta métrica devolverá la estructura completa del atributo en
formato JSON. Los valores de los elementos individuales dentro del atributo de datos tabulares
pueden recuperarse utilizando preprocesamiento.

Ejemplo de atributo de datos tabulares:

     jmx[com.example:type=Hello,foodinfo]

Valor de la métrica:

``` {.javascript}
[
  {
    "a": "manzana",
    "b": "plátano",
    "c": "cereza"
  },
  {
    "a": "patata",
    "b": "lechuga",
    "c": "cebolla"
  }
]
```

[comment]: # ({/ae61b0e7-ae61b0e7})

[comment]: # ({1c76819e-3a5802d2})
##### Problema con los puntos

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

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

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

Esto es posible, todo lo que necesitas hacer es escapar los puntos que forman parte del
nombre con una barra invertida:

    jmx[com.example:Type=Hello,all\.fruits.apple.weight]

De la misma manera, si tu clave de hash contiene un punto, escápalo:

    jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]

[comment]: # ({/1c76819e-3a5802d2})

[comment]: # ({1fba2ed6-80aedcd9})
##### Otros problemas

Un carácter de barra invertida en un nombre de atributo debe escaparse:

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

Para manejar cualquier otro carácter especial en la clave del item JMX, consulte
la sección sobre el formato de la clave del item
[section](/manual/config/items/item/key#parameter--quoted-string).

En realidad, eso es todo. ¡Feliz monitorización JMX!

[comment]: # ({/1fba2ed6-80aedcd9})

[comment]: # ({0a7df462-1813b2fc})
##### Tipos de datos no primitivos

Es posible trabajar con MBeans personalizados que devuelven
tipos de datos no primitivos, que sobrescriben el método **toString()**.

[comment]: # ({/0a7df462-1813b2fc})

[comment]: # ({f719c9d8-ffdec0f9})
#### Uso de un endpoint personalizado con JBoss EAP 6.4

Los endpoints personalizados permiten trabajar con diferentes protocolos de transporte además del RMI por defecto.

Para ilustrar esta posibilidad, intentemos configurar la monitorización de JBoss EAP 6.4 como ejemplo. Primero, hagamos algunas suposiciones:

-   Ya ha instalado Zabbix Java gateway. Si no es así, puede hacerlo de acuerdo con la [documentación](/manual/concepts/java).
-   El servidor Zabbix y Java gateway están instalados con el prefijo `/usr/local/`
-   JBoss ya está instalado en `/opt/jboss-eap-6.4/` y se está ejecutando en modo standalone
-   Supondremos que todos estos componentes funcionan en el mismo equipo
-   El firewall y SELinux están deshabilitados (o configurados en consecuencia)

Hagamos algunos ajustes 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

Compruebe que JBoss escucha en su puerto de gestión estándar:

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

Ahora vamos a crear un equipo con interfaz JMX 127.0.0.1:9999 en Zabbix.

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example.png){width="600"}

Como sabemos que esta versión de JBoss utiliza el protocolo JBoss Remoting en lugar de RMI, podemos actualizar masivamente el parámetro endpoint JMX para las métricas en nuestra plantilla JMX de la siguiente manera:

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

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example_b.png)

Actualicemos la caché de configuración:

    /usr/local/sbin/zabbix_server -R config_cache_reload

Tenga en cuenta que puede encontrar un error al principio.

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example4.png){width="600"}

"Unsupported protocol: remoting-jmx" significa que Java gateway no sabe cómo trabajar con el protocolo especificado. Esto se puede solucionar 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

De este modo, Java gateway tendrá todos los módulos necesarios para trabajar con jmx-remoting. Lo que queda es reiniciar Java gateway, esperar un poco y, si hizo todo correctamente, verá que los datos de monitorización JMX comienzan a llegar a Zabbix (ver también: [Últimos datos](/manual/web_interface/frontend_sections/monitoring/latest_data)).

[comment]: # ({/f719c9d8-ffdec0f9})
