Java JMX-Monitoring mit Zabbix

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…):

Zabbix JMX Monitoring

Die grobe Architektur, die dazu nötig ist, sieht bei Zabbix so aus:

Zabbix JMX Monitoring

Um das mit Zabbix hinzubekommen habe ich folgendes gemacht:

Das Zabbix-Java-Gateway via docker installieren

  • zabbix-java-gateway in die docker-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.
    Zabbix JMX Monitoring
  • Unter „Templates“ des Hosts habe ich dann Template JMX Generic und Template 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert