13 JMX bewaking

Overzicht

JMX-monitoring kan worden gebruikt om JMX-tellers van een Java-toepassing te monitoren.

JMX-monitoring heeft native ondersteuning in Zabbix in de vorm van een Zabbix-daemon genaamd "Zabbix Java gateway", geïntroduceerd sinds Zabbix 2.0.

Om de waarde van een specifieke JMX-teller op een host op te halen, vraagt de Zabbix-server de Zabbix Java gateway om informatie op te halen. De Java gateway gebruikt op zijn beurt de JMX-beheer-API om op afstand de gewenste toepassing te bevragen.

Voor meer details en installatie-instructies zie het gedeelte Zabbix Java gateway.

De communicatie tussen de Java gateway en de gemonitorde JMX-toepassing mag niet geblokkeerd zijn door een firewall.

Inschakelen van externe JMX-monitoring voor Java-toepassing

Een Java-toepassing heeft geen aanvullende software nodig, maar moet worden gestart met de hieronder gespecificeerde opdrachtregelopties om ondersteuning te bieden voor externe JMX-monitoring.

Als absoluut minimum, als je eenvoudig wilt beginnen met het monitoren van een eenvoudige Java-toepassing op een lokale host zonder beveiliging, start deze dan met de volgende opties:

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

Dit zorgt ervoor dat Java luistert naar inkomende JMX-verbindingen op poort 12345, alleen vanaf de lokale host, en geeft aan dat er geen verificatie of SSL vereist is.

Als je verbindingen op een ander interface wilt toestaan, stel dan de parameter -Djava.rmi.server.hostname in op het IP van dat interface.

Als je strenger wilt zijn op het gebied van beveiliging, zijn er nog veel andere Java-opties beschikbaar. Bijvoorbeeld, het volgende voorbeeld start de toepassing met een meer veelzijdige reeks opties en opent het voor een bredere netwerktoegang, niet alleen de lokale host.

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=$JE_KEY_STORE \
       -Djavax.net.ssl.keyStorePassword=$JE_KEY_STORE_WACHTWOORD \
       -Djavax.net.ssl.trustStore=$JE_TRUST_STORE \
       -Djavax.net.ssl.trustStorePassword=$JE_TRUST_STORE_WACHTWOORD \
       -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

De meeste (zo niet alle) van deze instellingen kunnen worden gespecificeerd in /etc/java-6-openjdk/management/management.properties (of waar dat bestand zich ook op jouw systeem bevindt).

Merk op dat als je SSL wilt gebruiken, je het startup.sh-script moet aanpassen door -Djavax.net.ssl.*-opties toe te voegen aan de Java-gateway, zodat deze weet waar hij sleutel- en vertrouwensopslagplaatsen kan vinden.

Zie Monitoring en beheer met behulp van JMX voor een gedetailleerde beschrijving.

Configuratie van JMX-interfaces en items in Zabbix-frontend

Met Java gateway actief, waarbij de server weet waar deze te vinden is, en een Java-toepassing gestart met ondersteuning voor externe JMX-monitoring, is het tijd om de interfaces en items in de Zabbix GUI te configureren.

Configuratie van JMX-interface

Je begint door een JMX-type interface aan te maken op de host van interesse.

Alle verplichte invoervelden zijn gemarkeerd met een rode asterisk.

Toevoegen van JMX-agentitem

Voor elke JMX-teller die je interessant vindt, voeg je een JMX-agent-item toe dat aan die interface is gekoppeld.

De sleutel in de onderstaande schermafbeelding zegt jmx["java.lang:type=Memory","HeapMemoryUsage.used"].

Alle verplichte invoervelden zijn gemarkeerd met een rode asterisk.

De velden die specifieke informatie vereisen voor JMX-items zijn:

Type Stel hier JMX-agent in.
Sleutel De item-sleutel jmx[] bevat drie parameters:
object name - de objectnaam van een MBean
attribute name - een MBean-attribuutnaam met optionele compositiedataveldnamen gescheiden door punten
unieke korte beschrijving - een unieke beschrijving die meerdere JMX-items met dezelfde objectnaam en attribuutnaam op de host mogelijk maakt (optioneel)
Zie hieronder voor meer details over JMX-item-sleutels.
Sinds Zabbix 3.4 kun je MBeans en MBean-attributen ontdekken met behulp van een jmx.discovery[] laag-niveau ontdekking-item.
JMX-eindpunt Je kunt een aangepast JMX-eindpunt opgeven. Zorg ervoor dat de verbindingsparameters van het JMX-eindpunt overeenkomen met de JMX-interface. Dit kan worden bereikt door {HOST.*}-macros te gebruiken zoals gedaan in het standaard JMX-eindpunt.
Dit veld wordt ondersteund sinds 3.4.0. {HOST.*} macros en gebruikersmacro's worden ondersteund.
Gebruikersnaam Geef de gebruikersnaam op als je authenticatie hebt geconfigureerd voor je Java-toepassing.
Gebruikersmacro's worden ondersteund.
Wachtwoord Geef het wachtwoord op als je authenticatie hebt geconfigureerd voor je Java-toepassing.
Gebruikersmacro's worden ondersteund.

Als je een Booleaanse teller wilt controleren die ofwel "true" of "false" is, specificeer je het type informatie als "Numeriek (ongesigneerd)" en selecteer je de bewerking "Boolean to decimal" in het tabblad Voorverwerking. De server slaat Booleaanse waarden respectievelijk op als 1 of 0.

JMX item sleutels in meer detail

Eenvoudige attributen

Een MBean-objectnaam is niets meer dan een tekenreeks die je definieert in je Java-toepassing. Een attribuutnaam kan daarentegen wat complexer zijn. In het geval dat een attribuut een primitief gegevenstype retourneert (een geheel getal, een tekenreeks, enzovoort), hoef je je geen zorgen te maken, de sleutel zal er zo uitzien:

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

In dit voorbeeld is de objectnaam "com.example:Type=Hello", de attribuutnaam is "weight", en het type van het geretourneerde waarde zou waarschijnlijk "Numeriek (float)" moeten zijn.

Attributen die samengestelde gegevens retourneren

Het wordt ingewikkelder wanneer je attribuut samengestelde gegevens retourneert. Bijvoorbeeld: je attribuutnaam is "apple" en het retourneert een hash die zijn parameters vertegenwoordigt, zoals "weight", "color", enzovoort. Je sleutel kan er zo uitzien:

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

Dit is hoe een attribuutnaam en een hash-sleutel van elkaar worden gescheiden, door gebruik te maken van een puntteken. Op dezelfde manier, als een attribuut geneste samengestelde gegevens retourneert, worden de delen gescheiden door een punt:

jmx[com.example:Type=Hello,fruits.apple.weight]
Attributen die tabulaire gegevens retourneren

Attributen die tabulaire gegevens retourneren bestaan uit één of meerdere samengestelde attributen. Als een dergelijk attribuut wordt gespecificeerd in de attribuutnaam parameter, dan zal de waarde van dit item de volledige structuur van het attribuut retourneren in JSON-indeling. De individuele elementwaarden binnen het attribuut met tabulaire gegevens kunnen worden opgehaald met behulp van voorbewerking.

Voorbeeld van een attribuut met tabulaire gegevens:

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

Waarde van het item:

[
         {
           "a": "apple",
           "b": "banana",
           "c": "cherry"
         },
         {
           "a": "potato",
           "b": "lettuce",
           "c": "onion"
         }
       ]
Probleem met punten

Tot nu toe gaat het goed. Maar wat als een attribuutnaam of een hash-sleutel het punt symbool bevat? Hier is een voorbeeld:

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

Dat is een probleem. Hoe vertel je Zabbix dat de attribuutnaam "all.fruits" is en niet alleen "all"? Hoe onderscheid je een punt dat deel uitmaakt van de naam van een punt dat een attribuutnaam en hash-sleutels scheidt?

Vóór 2.0.4 kon Zabbix Java Gateway dergelijke situaties niet verwerken en bleven gebruikers zitten met NIET-ONDERSTEUNDE items. Sinds 2.0.4 is dit mogelijk, het enige wat je hoeft te doen is de punten die deel uitmaken van de naam te ontsnappen met een backslash:

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

Op dezelfde manier, als je hash-sleutel een punt bevat, ontsnap je eraan:

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

Een backslash-teken in een attribuutnaam moet worden ontsnapt:

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

Voor het omgaan met andere speciale tekens in de JMX-item sleutel, zie de sectie item sleutel formaat.

Dit is eigenlijk alles wat er is. Veel succes met JMX-monitoring!

Niet-primitieve gegevenstypen

Sinds Zabbix 4.0.0 is het mogelijk om te werken met aangepaste MBeans die niet-primitieve gegevenstypen retourneren en de toString()-methode overschrijven.

Gebruik van aangepaste eindpunt met JBoss EAP 6.4

Aangepaste eindpunten maken het mogelijk om te werken met verschillende transportprotocollen dan het standaard RMI.

Om deze mogelijkheid te illustreren, laten we JBoss EAP 6.4-configuratie als voorbeeld nemen. Laten we eerst enkele aannames doen:

  • Je hebt de Zabbix Java Gateway al geïnstalleerd. Zo niet, dan kun je dit doen volgens de documentatie.
  • Zabbix-server en Java Gateway zijn geïnstalleerd met de prefix /usr/local/.
  • JBoss is al geïnstalleerd in /opt/jboss-eap-6.4/ en draait in de standalone-modus.
  • We gaan ervan uit dat al deze componenten op dezelfde host werken.
  • De firewall en SELinux zijn uitgeschakeld (of volgens de configuratie ingesteld).

Laten we enkele eenvoudige instellingen maken in zabbix_server.conf:

JavaGateway=127.0.0.1
       StartJavaPollers=5

En in het configuratiebestand zabbix_java/settings.sh (of zabbix_java_gateway.conf):

START_POLLERS=5

Controleer of JBoss luistert op de standaard managementpoort:

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

Laten we nu een host aanmaken met JMX-interface op 127.0.0.1:9999 in Zabbix.

Aangezien we weten dat deze versie van JBoss het JBoss Remoting-protocol gebruikt in plaats van RMI, kunnen we de JMX-eindpuntparameter voor items in onze JMX-template dienovereenkomstig massaal bijwerken:

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

Laten we de configuratiecache bijwerken:

/usr/local/sbin/zabbix_server -R config_cache_reload

Merk op dat je mogelijk eerst een foutmelding tegenkomt.

"Unsupported protocol: remoting-jmx" betekent dat de Java Gateway niet weet hoe het opgegeven protocol moet worden gebruikt. Dit kan worden opgelost door een bestand ~/needed_modules.txt aan te maken met de volgende inhoud:

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

en vervolgens het volgende commando uit te voeren:

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

Op deze manier heeft Java Gateway alle benodigde modules om te werken met jmx-remoting. Wat nog overblijft is het herstarten van de Java Gateway, even wachten en als je alles goed hebt gedaan, zie je dat JMX-monitoringgegevens in Zabbix beginnen binnen te komen (zie ook: Laatste gegevens).