Einleitung: Warum die Überwachung von Java-Anwendungen die Grundlage ist
\nEine moderne Java-Anwendung ist ein komplexes verteiltes System. Ohne Überwachung arbeiten Sie im Blindflug: Ein Abfall der Antwortgeschwindigkeit, ein Speicherleck oder ein plötzlicher OutOfMemoryError können unbemerkt bleiben, bis sich ein Benutzer beschwert. Eine gut konfigurierte Überwachung von Metriken und Alarmen ermöglicht es nicht nur, schnell auf Vorfälle zu reagieren, sondern auch Engpässe vorherzusagen, bevor sie kritisch werden.
\nIn diesem Artikel behandeln wir den gesamten Zyklus: von der Erfassung grundlegender JVM-Metriken bis zur Einrichtung von Alarmen in Prometheus und der Visualisierung in Grafana. Alle Codebeispiele sind in Java unter Verwendung der beliebten Bibliothek Micrometer geschrieben.
\n\n1. Schlüsselmetriken einer Java-Anwendung
\nDie Überwachung beginnt mit der Auswahl der richtigen Metriken. Sie können in drei Gruppen unterteilt werden: JVM-Metriken, Geschäftsmetriken und Infrastrukturmetriken.
\n\n1.1. JVM-Metriken
\nDiese Metriken zeigen den Zustand der Java Virtual Machine an. Die wichtigsten sind:
\n- \n
- Heap memory usage — Heap-Nutzung (verwendeter / maximaler Speicher). Ein starker Anstieg kann auf ein Leck hindeuten. \n
- GC pauses — Häufigkeit und Dauer von Garbage-Collection-Pausen. Lange Pausen (über 1 Sekunde) sind ein Zeichen für Probleme. \n
- Thread states — Anzahl der Threads in den Zuständen RUNNABLE, BLOCKED, WAITING. Viele BLOCKED-Threads deuten auf eine mögliche Blockierung hin. \n
- CPU usage — CPU-Auslastung durch den JVM-Prozess. \n
1.2. Geschäftsmetriken
\nSie spiegeln die Logik Ihrer Anwendung wider. Beispiele:
\n- \n
- Anzahl der verarbeiteten Bestellungen pro Minute. \n
- Antwortzeit einer externen API. \n
- Anzahl der Validierungsfehler. \n
1.3. Infrastrukturmetriken
\n- \n
- Festplatten-, Netzwerk- und Host-Speichernutzung. \n
- Status der Datenbankverbindungen (Verbindungspool). \n
- Verzögerungen von Nachrichtenwarteschlangen (Kafka, RabbitMQ). \n
2. Werkzeuge zur Metrikenerfassung: Micrometer + Prometheus
\nFür Java-Anwendungen ist die Bibliothek Micrometer der De-facto-Standard. Sie bietet eine Fassade für verschiedene Überwachungssysteme (Prometheus, Datadog, Graphite). In Kombination mit Prometheus (Metrikenspeicher) und Grafana (Visualisierung) erhalten Sie ein leistungsstarkes und kostenloses Ökosystem.
\n\n2.1. Einbinden von Micrometer in Spring Boot
\nWenn Sie Spring Boot 2.x oder 3.x verwenden, fügen Sie die folgende Abhängigkeit in Ihre pom.xml ein:
<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>\nDanach aktiviert Spring Boot Actuator automatisch den Endpunkt /actuator/prometheus, der die Metriken im Prometheus-Format ausgibt.
2.2. Erstellen einer benutzerdefinierten Metrik
\nAngenommen, Sie möchten die Anzahl erfolgreicher und fehlgeschlagener Methodenaufrufe zählen. Erstellen Sie einen Zähler:
\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Counter;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class OrderService {\n\n private final Counter successCounter;\n private final Counter errorCounter;\n\n public OrderService(MeterRegistry registry) {\n this.successCounter = Counter.builder("orders.success")\n .description("Number of successful orders")\n .register(registry);\n this.errorCounter = Counter.builder("orders.error")\n .description("Number of failed orders")\n .register(registry);\n }\n\n public void processOrder(String orderId) {\n try {\n // Logik zur Bestellverarbeitung\n successCounter.increment();\n } catch (Exception e) {\n errorCounter.increment();\n throw e;\n }\n }\n}\nIn Prometheus erscheint die Metrik als orders_succ