Überwachung von Java-Anwendungen: Metriken und Alarme (fortgeschrittenes Niveau)

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

Überwachung von Java-Anwendungen: Metriken und Alarme auf fortgeschrittenem Niveau



In der modernen Softwareentwicklung ist die Überwachung von Java-Anwendungen keine Option mehr – sie ist eine Notwendigkeit. Die grundlegende Erfassung von Metriken (CPU, Speicher, Anzahl der Anfragen) reicht jedoch oft nicht aus, um Leistungseinbußen oder versteckte Fehler rechtzeitig zu erkennen. Auf fortgeschrittenem Niveau geht es nicht nur darum, Daten zu sammeln, sondern auch intelligente Alarme zu konfigurieren, die auf Anomalien reagieren und nicht auf statische Schwellenwerte.



In diesem Artikel analysieren wir die Architektur der fortgeschrittenen Überwachung für Java: von der Metriksammlung mit Micrometer bis zur Konfiguration von Alarmen in Prometheus und der Visualisierung in Grafana. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen der Überwachung vertraut sind.



1. Fortgeschrittene Metriksammlung mit Micrometer



Micrometer ist eine Fassade für Metriken, die sich in die meisten Systeme integrieren lässt (Prometheus, Datadog, New Relic). Auf fortgeschrittenem Niveau ist es wichtig, nicht nur die Bibliothek einzubinden, sondern auch benutzerdefinierte Metriken richtig zu entwerfen.



Wichtige Komponenten:

  • MeterRegistry – der zentrale Metrikspeicher. Für Prometheus verwenden wir PrometheusMeterRegistry.
  • Counter – ein Zähler (z. B. Anzahl der Fehler).
  • Timer – misst die Ausführungszeit.
  • Gauge – ein aktueller Wert (z. B. Warteschlangengröße).
  • DistributionSummary – Verteilung von Werten (für Perzentile).


Beispiel für einen benutzerdefinierten Timer mit Tags:



import io.micrometer.core.instrument.MeterRegistry;import io.micrometer.core.instrument.Timer;import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Servicepublic class PaymentService {

private final Timer paymentTimer;

public PaymentService(MeterRegistry registry) { this.paymentTimer = Timer.builder("payment.processing.time") .description("Zeit für die Zahlungsabwicklung") .publishPercentiles(0.5, 0.95, 0.99) // P50, P95, P99 .publishPercentileHistogram() .register(registry); }

public void processPayment(String userId, double amount) { Timer.Sample sample = Timer.start(); try { // Geschäftslogik Thread.sleep((long) (Math.random() * 100)); } catch (Exception e) { // Fehlermetrik } finally { sample.stop(paymentTimer); } }}


Tipps für die fortgeschrittene Erfassung:

  • Verwenden Sie Tags zur Filterung: endpoint, status, region.
  • Vermeiden Sie eine hohe Kardinalität von Tags (z. B. fügen Sie keine userId hinzu).
  • Verwenden Sie für Geschäftsmetriken einen Counter mit Inkrement bei jedem Ereignis.
  • Konfigurieren Sie eine DistributionSummary für Antwortgrößen oder Verzögerungen.


2. Integration mit Prometheus und Konfiguration von Alarmen



Prometheus ist ein System zur Sammlung und Alarmierung, das ein Pull-Modell verwendet. Für Java-Anwendungen reicht es aus, einen Endpunkt /actuator/prometheus hinzuzufügen (über Spring Boot Actuator + Micrometer).



Konfiguration in application.yml:



management:  endpoints:    web:      exposure:        include: prometheus, health  metrics:    export:      prometheus:        enabled: true    tags:      application: my-java-app      environment: production


Fortgeschrittene Alarme in Prometheus (rules.yml):



Statische Alarme (z. B. CPU > 90%) sind gut, führen aber oft zu Fehlalarmen. Verwenden Sie dynamische Schwellenwerte und Anomalien.



groups:  - name: java_app_advanced    rules:\                

Blogs

Buchempfehlungen