Java JMX-Monitoring erlaubt es, (u.a.) Messwerte aus der Java-Anwendung herauszuholen, zu graphen und zu monitoren. Hier ein Beispiel, das die GC-Werte meiner Beispiel-Anwendung zeigt (zugegebenermaßen etwas „langweilig“, aber das kommt schon noch…):
Die grobe Architektur, die dazu nötig ist, sieht bei Zabbix so aus:
Um das mit Zabbix hinzubekommen habe ich folgendes gemacht:
Das Zabbix-Java-Gateway via docker installieren
zabbix-java-gateway
in diedocker-compose.yml
vom Zabber-Server:zabbix-java-gateway: image: zabbix/zabbix-java-gateway:ubuntu-latest environment: #- ZBX_DEBUGLEVEL=4 - ZBX_TIMEOUT=20 ports: - 10052:10052 restart: always volumes: - /etc/localtime:/etc/localtime - /etc/timezone:/etc/timezone
- Dem Zabbix-Server beibringen, mit dem Java-Gateway zu reden: (gleiches Compose-File)
zabbix-server:
image: zabbix/zabbix-server-mysql:ubuntu-latest environment: - DB_SERVER_HOST=mysql - MYSQL_USER=root - MYSQL_PASSWORD=xxx #- ZBX_DEBUGLEVEL=4 - ZBX_STARTVMWARECOLLECTORS=3 - ZBX_JAVAGATEWAY_ENABLE=true # neu - ZBX_JAVAGATEWAY=zabbix-java-gateway # neu - ZBX_STARTJAVAPOLLERS = 5 # neu - TZ=Europe/Berlin links: - mysql - zabbix-java-gateway # neu ports: - 10051:10051 restart: always volumes: - /opt/dockervolumes/zabbix-int/var_lib_zabbix:/var/lib/zabbix - /etc/localtime:/etc/localtime - /etc/timezone:/etc/timezone
Der Java-Anwendung beibringen JMX zu „öffnen“
Dazu brauch es ein paar System-Properties. Bei mir war das in einem Tomcat-basierten docker-Container folgendermaßen (unter „environment“):
- CATALINA_OPTS=
-Xmx512m
-Xms64m
-Dcom.sun.management.jmxremote # neu
-Dcom.sun.management.jmxremote.local.only=false # neu
-Dcom.sun.management.jmxremote.authenticate=false # neu
-Dcom.sun.management.jmxremote.port=9010 # neu
-Dcom.sun.management.jmxremote.rmi.port=9010 # neu
-Dcom.sun.management.jmxremote.ssl=false # neu
-Djava.rmi.server.hostname=docker-prod.steinkopf.net # neu
(Lange habe ich gebraucht, um herauszufinden, dass auch der RMI-Port (com.sun.management.jmxremote.rmi.port
) umgestellt werden muss, weil er in der Docker-Umgebung sonst dynamisch vergeben wird und nicht erreichbar ist.
Natürlich ist der naheliegende nächste Schritt Authentifizierung und/oder verschlüsselung, aber erstmal war mir wichtig, dass es überhaupt läuft.
Konfiguration in Zabbix
Der Übersichtlichkeit halber habe ich mit entschieden, einen eigenen Host (tuerauf-jmx) nur für die eine mit JMX überwachte Anwendung anzulegen, weil sonst am Ende alles auf dem Docker-Host landet.
- Auf der „Host“-Hauptseite des neuen Host ist dann nur bei „JMX-Interfaces“ der Docker-Host (bei mir
docker-prod.steinkopf.net
mit Port 9010 einzutragen.
- Unter „Templates“ des Hosts habe ich dann
Template JMX Generic
undTemplate JMX Tomcat
zugeordnet.
Die Templates erstellen einiges an Items und Triggern aus Java bzw. Tomcat. Als nächstes kämen das eigene Werte aus der Anwendung…
Links
- JMX-Monitoring in der Zabbix Doku.
- (Weitgehend) vollständige Beschreibung dessen, was ich getan habe.
- jmx discovery.