Monitoring von Java-Anwendungen: Metriken und Alarme
In der modernen Softwareentwicklung wirken sich Stabilität und Leistung von Java-Anwendungen direkt auf Geschäftskennzahlen aus. Ohne qualitativ hochwertiges Monitoring ist es unmöglich, Speicherlecks, Verschlechterungen der Antwortzeiten oder Serviceausfälle rechtzeitig zu erkennen. In diesem Artikel werden wir erläutern, wie man das Monitoring von Java-Anwendungen mit Metriken und Alarmen einrichtet, angefangen bei grundlegenden Konzepten bis hin zu praktischen Codebeispielen.
Warum das Monitoring von Java-Anwendungen kritisch wichtig ist
Java-Anwendungen laufen in Umgebungen mit automatischer Speicherverwaltung (Garbage Collection), Multithreading und komplexen Abhängigkeiten. Ohne Monitoring riskieren Sie:
- Lange GC-Pausen (Stop-The-World), die die Systemantwort verlangsamen;
- Speicherlecks, die zu OutOfMemoryError führen;
- Langsame HTTP-Anfragen aufgrund von Thread-Blockaden;
- Unerwartete Ausfälle in Spitzenlastzeiten.
Monitoring ermöglicht es nicht nur, auf Vorfälle zu reagieren, sondern auch Probleme vorherzusagen, bevor sie auftreten.
Wichtige Metriken für Java-Anwendungen
Für eine umfassende Überwachung der Anwendungsgesundheit müssen Metriken aus drei Hauptgruppen gesammelt werden: JVM-, Anwendungs- und Geschäftsmetriken.
JVM-Metriken
Diese Metriken zeigen den Zustand der Java Virtual Machine:
- Heap-Nutzung (Heap Memory) — aktuelles und maximales Volumen;
- Thread-Anzahl (Thread Count) — aktive, Daemon- und blockierte Threads;
- GC-Statistiken — Anzahl der Garbage Collections, Pausenzeiten, Häufigkeit von Young/Old GC;
- Klassenladung — Anzahl geladener und entladener Klassen.
Anwendungsmetriken
Spiegeln das Verhalten Ihres Codes wider:
- Antwortzeit (Response Time) — Durchschnitt, p50, p95, p99;
- Anfragehäufigkeit (Requests per second) — RPS;
- Fehlerrate (Error Rate) — 4xx-, 5xx-Statuscodes;
- Verbindungspool-Status — aktive, wartende und geschlossene Verbindungen.
Geschäftsmetriken
Helfen, die Auswirkungen des Codes auf das Geschäft zu bewerten:
- Anzahl erfolgreicher Transaktionen;
- Ausführungszeit kritischer Operationen (z. B. Bestellabschluss);
- Conversion-Rate im Verkaufstrichter (falls die Anwendung mit der UI verbunden ist).
Tools zur Erfassung von Metriken in Java
Der moderne Monitoring-Stack für Java-Anwendungen umfasst typischerweise Micrometer, Prometheus und Grafana. Betrachten wir deren Integration.
Micrometer — Fassade für Metriken
Micrometer bietet eine einheitliche API zur Erfassung von Metriken, die viele Monitoring-Systeme (Prometheus, Datadog, New Relic u. a.) unterstützt. Fügen Sie die Abhängigkeit in pom.xml hinzu:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.12.0</version></dependency>Beispiel für den Export von Metriken über den Endpunkt /actuator/prometheus (für Spring Boot):
import io.micrometer.core.instrument.MeterRegistry;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class MetricController {
private final MeterRegistry registry;
public MetricController(MeterRegistry registry) { this.registry = registry; }
@GetMapping("/custom-metric") public String customMetric() { // Erstellen eines Zählers registry.counter("custom.requests.count").increment(); // Timer zur Zeitmessung registry.timer("custom.request.duration");