Überwachung von Java-Anwendungen: Die Bibliothek Micrometer
Moderne Java-Anwendungen erfordern eine ständige Überwachung der Leistung, des Speicherverbrauchs, der Antwortzeiten und anderer kritischer Parameter. Micrometer ist der De-facto-Standard für die Erfassung von Metriken im Java-Ökosystem. Es bietet eine universelle API und unterstützt den Export von Daten in gängige Überwachungssysteme wie Prometheus, Graphite und Datadog.
Was ist Micrometer und warum wird es benötigt?
Micrometer ist eine Fassade zur Erfassung von Metriken, ähnlich wie SLF4J eine Fassade für die Protokollierung ist. Es abstrahiert den Anwendungscode vom konkreten Überwachungssystem und ermöglicht den Wechsel zwischen Backends, ohne die Geschäftslogik zu ändern.
Die wichtigsten Funktionen der Bibliothek:
- Zähler (Counter) — zum Zählen von Ereignissen (z. B. Anzahl der Anfragen).
- Timer (Timer) — zum Messen der Ausführungszeit von Operationen.
- Messfühler (Gauge) — zum Verfolgen aktueller Werte (z. B. Größe des Thread-Pools).
- Verteilungen (DistributionSummary) — zur Analyse der Werteverteilung (z. B. Größe des Anforderungstextes).
- Tags (Tags) — zum Hinzufügen von Dimensionen zu Metriken (z. B.
endpoint,status).
Installation und Konfiguration
Um Micrometer in einem Maven-Projekt zu verwenden, fügen Sie die folgende Abhängigkeit in pom.xml hinzu:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.12.0</version></dependency>Wenn Sie Spring Boot verwenden, reicht es aus, den Starter micrometer-registry-prometheus einzubinden:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.12.0</version></dependency>Danach konfiguriert Spring Boot automatisch den MeterRegistry und öffnet den Endpunkt /actuator/prometheus zur Erfassung von Metriken.
Anwendungsbeispiele
1. Erstellen eines Anforderungszählers
Ein einfaches Beispiel zum Zählen der Anzahl von Methodenaufrufen:
import io.micrometer.core.instrument.Counter;import io.micrometer.core.instrument.MeterRegistry;
public class RequestCounter { private final Counter requestCounter;
public RequestCounter(MeterRegistry registry) { this.requestCounter = Counter.builder("api.requests") .tag("endpoint", "/users") .description("Total number of requests to /users") .register(registry); }
public void handleRequest() { requestCounter.increment(); // Geschäftslogik }}2. Messen der Ausführungszeit mit einem Timer
Verwenden Sie Timer.Sample, um die Ausführungszeit eines Codeblocks zu messen:
import io.micrometer.core.instrument.Timer;import io.micrometer.core.instrument.MeterRegistry;
public class RequestTimer { private final Timer requestTimer;
public RequestTimer(MeterRegistry registry) { this.requestTimer = Timer.builder("api.response.time") .tag("endpoint", "/data") .publishPercentiles(0.95, 0.99) .register(registry); }
public String processRequest() { Timer.Sample sample = Timer.start(registry); try { // Verzögerung simulieren Thread.sleep(100); return "OK"; } catch (InterruptedException e) { Thread.currentThread().interrupt(); return "ERROR"; } finally