GEDOPLAN
Spring

Spring Boot Micrometer

Spring
ChatGPT Image 27. Juni 2025 12 04 17 png

In einem der letzten Beiträge (hier) haben wir bereits einen Blick auch Spring Boots Actuator Feature geworfen. Als kleine Ergänzung gehen wir heute einen Schritt weiter und werfen einen schnellen Blick auf das Erfassen von Metriken mittels Micrometer+Prometheus+Grafana.

Das hier verwendete dreier-Gespann ist eine häufig anzutreffende Kombination die in vielen produktiv laufenden Anwendungen Verwendung findet:

  • Micrometer, „Vendor-neutral application observability facade
    • dient als Abstraktionsschicht um Daten unserer JVM/Anwendung (Speichernutzung, Threads, HTTP Requests…) bereitzustellen
  • Prometheus, „Open source metrics and monitoring for your systems and services
    • Datenbank basiertes (Time Series DB) System zum Sammeln (und Auswerten) von Metriken
  • Grafana, „Grafana: The open and composable observability platform
    • Visualisierung von Metriken

Wie so oft liefert ein passender Spring-Boot-Starter die Basis für unsere zu erfassenden Metriken:

		<dependency>
			<groupId>io.micrometer</groupId>
			<artifactId>micrometer-registry-prometheus</artifactId>
			<scope>runtime</scope>
		</dependency>

Anschließend muss das Publizieren der Informationen noch wie im oben verlinkten Beitrag über eine Property aktiviert werden

management.endpoints.web.exposure.include=prometheus

Damit aktivieren wir den Actuator Endpunkt „…/actuator/prometheus“ der aktuelle Metriken der laufenden Anwendung liefert

# TYPE application_started_time_seconds gauge
application_started_time_seconds{main_application_class="de.gedoplan.metrics.MetricsApplication"} 3.275
# HELP disk_free_bytes Usable space for path
# TYPE disk_free_bytes gauge
disk_free_bytes{path="D:\\projects\\gedoplan\\blog\\metrics\\."} 9.8775789568E10
# HELP disk_total_bytes Total space for path
# TYPE disk_total_bytes gauge
disk_total_bytes{path="D:\\projects\\gedoplan\\blog\\metrics\\."} 1.83481253888E11
# HELP executor_active_threads The approximate number of threads that are actively executing tasks
# TYPE executor_active_threads gauge
executor_active_threads{name="applicationTaskExecutor"} 0.0
executor_active_threads{name="taskScheduler"} 0.0
...

Diese werden auf Seiten unserer Anwendung nicht persistiert, stellen also immer nur den aktuellen Zustand dar. Um diese Information auswertbar zu machen, müssen diese nun persistiert werden. Hier kommt jetzt Prometheus ins Spiel. Als eigenständige Applikation sammelt Prometheus in konfigurierbaren Zeitintervallen diese Informationen und speichert sie in einer Time Series DB. Prometheus benötigt dazu nur eine entsprechende Konfiguration, um unsere Anwendung abzufragen

  - job_name: 'spring-boot-application'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 15s
    static_configs:
      - targets: [ 'localhost:8080' ]

Grundsätzlich ließen sich jetzt bereits Auswertungen über die Oberfläche von Prometheus durchführen. In aller Regel reichen uns hier die Möglichkeiten aber nicht aus. Zeit für den Auftritt unseres dritten Mitspielers: Grafana. Über die bereitgestellte UI lässt sich hier Prometheus als Datasource hinzufügen und steht dann im Dashboard zur Verfügung. Hier sind die Möglichkeiten groß, Abfragen zu erstellen, Metriken auszuwerten und Visualisierungen in Dashboards zusammenzufassen. Ein Thema für sich, was im Detail hier den Rahmen sprengen würde, aussehen könnte ein Ergebnis aber z.B. so:

grafana

Eigene Metriken

Ähnlich wie beim Thema Actuator können wir auch eigene Metriken zur Verfügung stellen. Dazu müssen wir lediglich unsere Metrik registrieren und mit entsprechenden Werten versorgen. Hier ein Beispiel aus dem Spring Batch Bereich, in dem wir die importierten/verarbeiteten Elemente unserer Batch Jobs Monitoren wollen:

    @Component
    public static class ItemWriteMetricsListener implements StepExecutionListener {

        private final MeterRegistry meterRegistry;

        public ItemWriteMetricsListener(MeterRegistry meterRegistry) {
            this.meterRegistry = meterRegistry;
        }

        @Override
        @AfterStep
        public ExitStatus afterStep(StepExecution stepExecution) {
            long writeCount = stepExecution.getWriteCount();
            meterRegistry.counter("batch.items.written-total." + stepExecution.getJobExecution().getJobInstance().getJobName()).increment(writeCount);
            return stepExecution.getExitStatus();
        }
    }

Eine entsprechende Auswertung kann nun ganz leicht in Grafana erfolgen:

grafana custom metric

Insgesamt ein eingespieltes Trio, was wir hier sehen, das mit wenig Konfigurations-Aufwand ein mächtiges Werkzeug bereits stellt.

Github? Klaro.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.

Autor

Diesen Artikel teilen

LinkedIn
Xing

Gibt es noch Fragen?

Fragen beantworten wir sehr gerne! Schreibe uns einfach per Kontaktformular.

Kurse

weitere Blogbeiträge

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!