13 agent JMX

Panoramica

Il monitoraggio JMX può essere utilizzato per monitorare i contatori JMX di un'applicazione Java.

Il monitoraggio JMX dispone del supporto nativo in Zabbix sotto forma di un demone Zabbix chiamato "Zabbix Java gateway".

Per recuperare il valore di un particolare contatore JMX su un host, il server Zabbix interroga lo Java gateway di Zabbix, che a sua volta utilizza la API di gestione JMX per interrogare da remoto l'applicazione di interesse.

Per maggiori dettagli e per la configurazione, vedere la sezione Zabbix Java gateway.

La comunicazione tra Java gateway e l'applicazione JMX monitorata non deve essere bloccata da firewall.

Abilitazione del monitoraggio JMX remoto per un'applicazione Java

Un'applicazione Java non richiede l'installazione di software aggiuntivo, ma deve essere avviata con le opzioni da riga di comando specificate di seguito per supportare il monitoraggio JMX remoto.

Come requisito minimo, se desideri semplicemente iniziare monitorando una semplice applicazione Java su un host locale senza alcuna sicurezza abilitata, avviala con queste opzioni:

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 /path/to/your/application.jar

In questo modo Java si mette in ascolto delle connessioni JMX in ingresso sulla porta 12345, solo dall'host locale, e viene configurato per non richiedere autenticazione né SSL.

Se vuoi consentire connessioni su un'altra interfaccia, imposta il parametro -Djava.rmi.server.hostname sull'IP di tale interfaccia.

Se desideri adottare impostazioni di sicurezza più rigorose, sono disponibili molte altre opzioni Java. Ad esempio, l'esempio seguente avvia l'applicazione con un insieme di opzioni più versatile e la apre a una rete più ampia, non solo all'host locale.

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 /path/to/your/application.jar

La maggior parte (se non tutte) di queste impostazioni può essere specificata in $JRE/lib/management/management.properties (o ovunque si trovi quel file nel tuo sistema).

Nota che, se desideri utilizzare SSL, devi modificare lo script startup.sh aggiungendo le opzioni -Djavax.net.ssl.* a Java gateway, in modo che sappia dove trovare i key store e i trust store.

Per una descrizione dettagliata, vedi Monitoring and Management Using JMX.

Configurazione delle interfacce JMX e degli item nel frontend di Zabbix

Con il Java gateway in esecuzione, il server che sa dove trovarlo e un'applicazione Java avviata con il supporto per il monitoraggio JMX remoto, è il momento di configurare le interfacce e gli item nella GUI di Zabbix.

Configurazione dell'interfaccia JMX

Si inizia creando un'interfaccia di tipo JMX sul host di interesse.

Tutti i campi di input obbligatori sono contrassegnati con un asterisco rosso.

Aggiunta di un item JMX agent

Per ogni contatore JMX di interesse, aggiungere un item JMX agent associato a tale interfaccia.

La chiave nella schermata seguente è jmx["java.lang:type=Memory","HeapMemoryUsage.used"].

Tutti i campi di input obbligatori sono contrassegnati da un asterisco rosso.

I campi che richiedono informazioni specifiche per gli item JMX sono:

Type Impostare qui JMX agent.
Key La chiave item jmx[] contiene tre parametri:
nome oggetto - il nome oggetto di un MBean
nome attributo - il nome di un attributo MBean con nomi di campi di dati compositi opzionali separati da punti
breve descrizione univoca - una descrizione univoca che consente di avere più item JMX con lo stesso nome oggetto e nome attributo sullo host (opzionale)
Per maggiori dettagli sulle chiavi item JMX, vedere sotto.
È possibile individuare MBean e attributi MBean utilizzando un item jmx.discovery[] di low-level discovery.
JMX endpoint È possibile specificare un endpoint JMX personalizzato. Assicurarsi che i parametri di connessione dell'endpoint JMX corrispondano all'interfaccia JMX. Questo può essere ottenuto utilizzando le macro {HOST.*}, come avviene nell'endpoint JMX predefinito.
Sono supportate le macro} e le macro utente.
User name Specificare il nome utente (fino a 255 caratteri), se è stata configurata l'autenticazione nell'applicazione Java.
Le macro utente sono supportate.
Password Specificare la password (fino a 255 caratteri), se è stata configurata l'autenticazione nell'applicazione Java.
Le macro utente sono supportate.

Se si desidera monitorare un contatore booleano che può essere "true" oppure "false", specificare il tipo di informazione come "Numeric (unsigned)" e selezionare il passaggio di preprocessing "Boolean to decimal" nella scheda Preprocessing. Il server memorizzerà i valori booleani rispettivamente come 1 o 0.

Elementi chiave JMX in maggiore dettaglio

Attributi semplici

Il nome oggetto di un MBean non è altro che una stringa che si definisce nella propria applicazione Java. Il nome di un attributo, invece, può essere più complesso. Nel caso in cui un attributo restituisca un tipo di dato primitivo (un intero, una stringa ecc.) non c'è nulla di cui preoccuparsi: la chiave avrà questo aspetto:

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

In questo esempio, il nome oggetto è "com.example:Type=Hello", il nome dell'attributo è "weight" e il tipo di valore restituito dovrebbe probabilmente essere "Numerico (float)".

Attributi che restituiscono dati compositi

La situazione diventa più complicata quando il tuo attributo restituisce dati compositi. Ad esempio: il nome del tuo attributo è "apple" e restituisce una hash che rappresenta i suoi parametri, come "weight", "color", ecc. La tua chiave può apparire così:

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

Ecco come vengono separati il nome di un attributo e una chiave hash, utilizzando un punto. Allo stesso modo, se un attributo restituisce dati compositi annidati, le parti vengono separate da un punto:

jmx[com.example:Type=Hello,fruits.apple.weight]
Attributi che restituiscono dati tabellari

Gli attributi di dati tabellari sono costituiti da uno o più attributi compositi. Se un attributo di questo tipo è specificato nel parametro del nome dell'attributo, allora il valore di questo item restituirà la struttura completa dell'attributo in formato JSON. I valori dei singoli elementi all'interno dell'attributo di dati tabellari possono essere recuperati utilizzando il preprocessing.

Esempio di attributo di dati tabellari:

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

Valore dell'item:

[
  {
    "a": "apple",
    "b": "banana",
    "c": "cherry"
  },
  {
    "a": "potato",
    "b": "lettuce",
    "c": "onion"
  }
]
Problema con i punti

Fin qui tutto bene. Ma cosa succede se un nome di attributo o una chiave hash contiene il simbolo del punto? Ecco un esempio:

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

Questo è un problema. Come si fa a indicare a Zabbix che il nome dell'attributo è "all.fruits" e non solo "all"? Come distinguere un punto che fa parte del nome dal punto che separa il nome dell'attributo e le chiavi hash?

È possibile: tutto ciò che devi fare è eseguire l'escape dei punti che fanno parte del nome con una barra rovesciata:

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

Allo stesso modo, se la tua chiave hash contiene un punto, devi eseguirne l'escape:

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

Un carattere barra rovesciata in un nome di attributo deve essere preceduto da un carattere di escape:

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

Per la gestione di qualsiasi altro carattere speciale nella chiave item JMX, vedere la sezione sul formato della chiave item section.

Questo è davvero tutto qui. Buon monitoraggio JMX!

Tipi di dati non primitivi

È possibile lavorare con MBean personalizzati che restituiscono tipi di dati non primitivi, i quali sovrascrivono il metodo toString().

Utilizzo di un endpoint personalizzato con JBoss EAP 6.4

Gli endpoint personalizzati consentono di lavorare con protocolli di trasporto diversi da RMI predefinito.

Per illustrare questa possibilità, proviamo a configurare il monitoraggio di JBoss EAP 6.4 come esempio. Per prima cosa, facciamo alcune ipotesi:

  • Hai già installato Zabbix Java gateway. In caso contrario, puoi farlo in conformità con la documentazione.
  • Zabbix server e Java gateway sono installati con il prefisso /usr/local/
  • JBoss è già installato in /opt/jboss-eap-6.4/ ed è in esecuzione in modalità standalone
  • Supporremo che tutti questi componenti funzionino sullo stesso host
  • Firewall e SELinux sono disabilitati (o configurati di conseguenza)

Impostiamo alcuni semplici parametri in zabbix_server.conf:

JavaGateway=127.0.0.1
StartJavaPollers=5

E nel file di configurazione zabbix_java/settings.sh (oppure zabbix_java_gateway.conf):

START_POLLERS=5

Verifica che JBoss sia in ascolto sulla sua porta di gestione standard:

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

Ora creiamo un host con interfaccia JMX 127.0.0.1:9999 in Zabbix.

Poiché sappiamo che questa versione di JBoss utilizza il protocollo JBoss Remoting invece di RMI, possiamo aggiornare in massa il parametro endpoint JMX per gli item nel nostro template JMX di conseguenza:

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

Aggiorniamo la cache di configurazione:

/usr/local/sbin/zabbix_server -R config_cache_reload

Tieni presente che inizialmente potresti riscontrare un errore.

"Unsupported protocol: remoting-jmx" significa che Java gateway non sa come lavorare con il protocollo specificato. Questo può essere risolto creando un file ~/needed_modules.txt con il seguente contenuto:

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

e quindi eseguendo il 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

In questo modo, Java gateway avrà tutti i moduli necessari per lavorare con jmx-remoting. Non resta che riavviare Java gateway, attendere un po' e, se hai fatto tutto correttamente, vedere che i dati di monitoraggio JMX iniziano ad arrivare in Zabbix (vedi anche: Ultimi dati).