Erweitertes Monitoring von Java-Anwendungen: Metriken und Alarme

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Erweitertes Monitoring von Java-Anwendungen: Metriken und Alarme

\n\n

In der modernen Softwareentwicklung ist das Monitoring von Java-Anwendungen keine Option mehr – es ist eine Notwendigkeit. Die einfache Erfassung von Metriken (CPU, Speicher) hilft nicht mehr bei Vorfällen in komplexen verteilten Systemen. Auf fortgeschrittener Ebene ist eine tiefgehende Observability (Beobachtbarkeit) erforderlich: Verständnis des internen Zustands der Anwendung, Identifizierung von Engpässen und prädiktive Analytik. In diesem Artikel werden wir erläutern, wie Sie professionelles Monitoring von Java-Anwendungen mit Metriken und Alarmen unter Verwendung moderner Tools und Best Practices organisieren.

\n\n

1. Erweiterte Metriksammlung in Java: Micrometer und Prometheus

\n\n

Die Bibliothek Micrometer ist der De-facto-Standard für die Metriksammlung in Spring Boot und anderen Java-Frameworks. Sie bietet eine einheitliche API, die Metriken in verschiedene Überwachungssysteme (Prometheus, Datadog, New Relic) exportieren kann. Für erweitertes Monitoring verwenden wir die Kombination Micrometer + Prometheus.

\n\n

Warum ist dies eine fortgeschrittene Stufe? Anstatt nur HTTP-Anfragen zu sammeln, konfigurieren wir benutzerdefinierte Metriken: Histogramme der Ausführungszeit von Geschäftslogik, Fehlerzähler mit Tags, Timer für asynchrone Operationen.

\n\n

Beispiel für die Konfiguration von Micrometer in Spring Boot:

\n\n
// Abhängigkeit in pom.xml\n<dependency>\n    <groupId>io.micrometer</groupId>\n    <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>\n\n// application.yml\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: "health,prometheus"\n  metrics:\n    export:\n      prometheus:\n        enabled: true\n
\n\n

Jetzt fügen wir eine benutzerdefinierte Metrik hinzu – ein Histogramm der Methodenausführungszeit:

\n\n
import io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Timer;\nimport org.springframework.stereotype.Service;\n\nimport java.util.concurrent.TimeUnit;\n\n@Service\npublic class OrderService {\n\n    private final Timer orderProcessingTimer;\n\n    public OrderService(MeterRegistry registry) {\n        this.orderProcessingTimer = Timer.builder("order.processing.time")\n                .description("Time taken to process an order")\n                .publishPercentiles(0.5, 0.95, 0.99) // p50, p95, p99\n                .register(registry);\n    }\n\n    public void processOrder(String orderId) {\n        Timer.Sample sample = Timer.start();\n        try {\n            // Logik der Auftragsverarbeitung\n            Thread.sleep(200); // Arbeitssimulation\n        } catch (InterruptedException e) {\n            Thread.currentThread().interrupt();\n        } finally {\n            sample.stop(orderProcessingTimer);\n        }\n    }\n}\n
\n\n

Diese Metrik zeigt nicht nur die Durchschnittszeit, sondern Perzentile an, was für die Identifizierung von "langsamen" Anfragen (Tail Latency) entscheidend ist.

\n\n

2. Konfiguration erweiterter Alarme: Alertmanager und Regeln

\n\n

Die Metriksammlung ist ohne ein Benachrichtigungssystem nutzlos. Prometheus Alertmanager ermöglicht die Konfiguration komplexer Alarmierungsregeln mit Gruppierung, Unterdrückung und Weiterleitung von Benachrichtigungen (Slack, PagerDuty, Email).

\n\n

Fortgeschrittener Ansatz: Anstelle von einfachem "CPU > 90%" verwenden wir prädiktive Alarme und Aggregation nach Diensten.

\n\n

Beispiel für eine Alarmregel für eine Java-Anwendung (Datei rules.yml):

\n\n
groups:\n  - name: java_app_alerts\n    rules:\n      # Alarm bei hoher 5xx-Fehlerrate\n      - alert: HighErrorRate\n        expr: |\n          rate(http_requests_total{status=~"5.."}[5m])\n          /\n          rate(http_requests_total[5m]) > 0.05\n        for: 2m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Hohe HTTP-5xx-Fehlerrate ({{ $value | humanizePercentage }})"\n          description: "Fehlerrate für {{ $labels.instance }} liegt seit 2 Minuten über 5%"                

Blogs

Buchempfehlungen