13 Monitoratge JMX

Vista general

El monitoratge JMX es pot emprar per monitorar els comptadors JMX d'una aplicació Java.

El monitoratge JMX té suport nadiu a Zabbix en forma d'un dimoni de Zabbix anomenat ""Zabbix Java gateway", afegit després de la versió Zabbix 2.0.

Per recuperar el valor d'un comptador JMX particular d'un equip, el servidor Zabbix consulta el Java gateway, qui empra l'API de gestió JMX per fer consultes a l'aplicació a distància.

Per tindre més detalls sobre la instal·lació, veieu la secció Zabbix Java gateway.

La comunicació entre el Java gateway i l'aplicació JMX monitorada no ha de passar pas per un tallafocs.

Activació del monitoratge JMX remot per l'aplicació Java

Una aplicació Java no requereix la instal·lació de programari addicional, però s'ha d'iniciar amb les opcions de línia de comandes que s'especifiquen a continuació per admetre el monitoratge remot de JMX.

Com a mínim, si només voleu començar a monitorar una aplicació Java senzilla en un equip local sense seguretat, executeu-la amb les opcions següents:

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

Això fa que Java escolti les connexions JMX entrants al port 12345, només des de l'equip local, i li diu que no demani autenticació o SSL.

Si voleu permetre connexions a una altra interfície, configureu el paràmetre -Djava.rmi.server.hostname a l'adreça IP d'aquesta interfície.

Si voleu ser més estrictes en seguretat, hi ha moltes altres opcions de Java disponibles. L'exemple següent inicia l'aplicació amb un conjunt d'opcions més versàtil i l'obre a una xarxa més àmplia, no només a l'equip 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 /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

La majoria (si no tots) d'aquests paràmetres es poden especificar a /etc/java-6-openjdk/management/management.properties (o allà on es trobi aquest fitxer al vostre sistema).

Tingueu en compte que si voleu emprar SSL, heu de modificar l'script startup.sh afegint opcions -Djavax.net.ssl.* a la passarel·la java, de manera que sàpiga on trobar la clau i els magatzems de confiança.

Consulteu el monitoratge i gestió mitjançant JMX per obtindre una descripció detallada.

Configurant les interfícies i els elements JMX a la interficie de Zabbix

Amb el Java gateway executant-se, el servidor que sap on és el gateway i una aplicació de Java engegada amb suport de monitoratge JMX remot, ara podem configurar les interfícies i els elements des de la interfície web de Zabbix.

Configuració de la interfície JMX

Comencem creant una interfície de tipus JMX a l'equip :!

Tots els camps obligatoris són marcats amb un asterisc vermell.

Afegint un element d'agent JMX

Per cada comptador JMX en que siguem interessats, hem d'afegir l'element JMX agent, a aquella interfície.

La clau dins la captura de pantalla d'aquí sota diu jmx["java.lang:type=Memory","HeapMemoryUsage.used"].

Tots els camps obligatoris són marcats amb un asterisc vermell.

Els camps que necessiten informació específica per als elements JMX són:

Tipus Definiu JMX agent aquí.
Clau La clau de l'element jmx[] conté tres paràmetres:
object name - el nom de l'objecte d'un MBean
attribute name - el nom de l'atribut MBean amb els noms dels camps de dades compostes separades per punts.
unique short description - una descripció única que permet més elements JMX amb el mateix nom d'objecte i el mateix nom d'atribut de l'equip (opcional)
Veieu aquí sota més detalls de les claus d'elements JMX.
Des de la versió Zabbix 3.4, podeu descobrir els atributs MBeans i MBean emprant l'element de descoberta de baix nivell jmx.discovery[].
JMX endpoint Podeu especificar un punt de tancament JMX personalitzat. Assegureu-vos que els paràmetres de connexió del node final JMX corresponen a la interfície JMX. Això es pot fer emprant les macros {HOST.*} com al punt de tancament JMX per defecte.
Aquest camp es suporta des de la versió 3.4.0. Són admeses les macros i{HOST.*} i les macros d'usuari.
Nom d'usuari Especifiqueu el nom d'usuari, si heu configurat l'autenticació a la vostra aplicació Java.
Es permeten les macros d'usuari.
Paraula de pas Especifiqueu el mot de pas, si heu configurat l'autenticació a la vostra aplicació Java.
Es permeten les macros d'usuari.

Si voleu monitorar un comptador booleà que sigui "cert" o "fals", especifiqueu el tipus d'informació "Numèrica (no signada)" i trieu l'etapa "Booleà a decimal" dins la pestanya de preprocessament. El servidor emmagatzemarà els valors booleans com 1 o 0, respectivament.

Claus de l'element JMX detallats

Atributs simples

El nom d'un objecte MBean no és més que una cadena que definiu a la vostra aplicació Java. D'altra banda, un nom d'atribut pot ésser més complex. En cas que un atribut torni un tipus de dades primitiu (un nombre enter, una cadena, etc.), no ens hem d'amoïnar pas; la clau tindrà aquest aspecte:

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

En aquest exemple, el nom de l'objecte és "com.example:Type=Hello", el nom de l'atribut és "weight" i probablement el tipus de valor retornat hauria de ser "Numèric (flotant)".

Atributs que retornen dades compostes

Es complica més quan el vostre atribut retorna dades compostes. Per exemple: el nom del vostre atribut és "poma" i retorna un hash que representa els seus paràmetres, com ara "pes", "color", etc. La teva clau podria assemblar-se a:

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

Així és com es separen un nom d'atribut i una clau hash, emprant el símbol de punt. De la mateixa manera, si un atribut retorna dades compostes imbricades, les parts es separen per un punt:

jmx[com.example:Type=Hello,fruits.apple.weight]
Atributs que retornen informació tabulada

Els atributs de dades tabulars consisteixen en un o més atributs compostos. Si aquest atribut s'especifica al paràmetre de nom d'atribut, aquest valor d'element retornarà l'estructura completa de l'atribut en format JSON. Els valors dels elements individuals dins de l'atribut de dades tabulars es poden recuperar mitjançant el preprocessament.

Exemple d'atribut de dades tabulars:

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

Valor de l'element:

[
         {
           "a": "apple",
           "b": "banana",
           "c": "cherry"
         },
         {
           "a": "potato",
           "b": "lettuce",
           "c": "onion"
         }
       ]
Problema amb els punts

Fins ara, tot bé. Però, què passa si un nom d'atribut o una clau hash conté un punt? Aquí teniu un exemple:

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

És complicat. Com li diem al Zabbix que el nom de l'atribut és "all.fruits", no només "all"? Com es distingeix un punt que forma part del nom del punt que separa un nom d'atribut i les claus hash?

Abans de la versió 2.0.4, Zabbix Java Gateway no era capaç de gestionar aquestes situacions i els usuaris es quedaven amb elements NO ADMESOS. Des de la 2.0.4 això és possible; tot el que heu de fer és escapar dels punts que formen part del nom amb una barra invertida:

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

De la mateixa manera, si la vostra clau hash conté un punt, se n'escaparà:

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

S'ha d'escapar una barra invertida en un nom d'atribut:

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

Per gestionar altres caràcters especials a la clau d'element JMX, consulteu la secció format de clau d'element.

En realitat, això és tot el que hi ha. Bon monitoratge de JMX!

Tipus de dades no-primitives

Des de la versió de Zabbix 4.0.0, és possible treballar amb els MBeans personalitzables que retornen els tipus de dades no-primitives, que substituirà el métode toString().

Ús de les terminacions personalitzades amb JBoss EAP 6.4

Els punts finals personalitzats permeten treballar amb diferents protocols de transport diferents del RMI predeterminat.

Per il·lustrar aquesta possibilitat, provem de configurar el monitoratge JBoss EAP 6.4 com a exemple. Primer, fem algunes suposicions:

  • Ja heu instal·lat la passarel·la Zabbix Java. Si no, podeu fer-ho segons documentació.
  • El servidor Zabbix i la passarel·la Java s'instal·len amb el prefix /usr/local/
  • JBoss ja és instal·lat a /opt/jboss-eap-6.4/ i funciona en mode autònom
  • Suposarem que tots aquests components s'executen al mateix equip
  • El tallafoc i SELinux són desactivats (o configurats en conseqüència)

Fem algunes configuracions senzilles a zabbix_server.conf:

 JavaGateway=127.0.0.1
        StartJavaPollers=5

I al fitxer de configuració zabbix_java/settings.sh (o zabbix_java_gateway.conf):

 START_POLLERS=5

Verifiqueu que JBoss escolti per el seu port predeterminat:

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

Ara creem un equip amb la interfície JMX 127.0.0.1:9999 a Zabbix.

Com que sabem que aquesta versió de JBoss empra el protocol JBoss Remoting en lloc de RMI, podem actualitzar de manera massiva la configuració de l'equip destí JMX per als elements del nostre model JMX en conseqüència:

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

Actualitzem la memòria cau de configuració:

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

Tingueu en compte que és possible que trobeu una errada la primera vegada.

"Protocol no compatible: remoting-jmx" vol dir que la passarel·la Java no sap com treballar amb aquest protocol. Això es pot solucionar creant un fitxer `~/needed_modules.txt´ amb el contingut següent:

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

i després executeu la comanda:

 $ 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

Així, la passarel·la Java disposarà de tots els mòduls necessaris per treballar amb JMX-Remoting. Queda per reiniciar la passarel·la Java, espereu una mica i si ho heu fet tot correctament, podreu veure que les dades de monitoratge de JMX comencen a arribar a Zabbix (veieu també: darreres dades).