GEDOPLAN
zero

Spring Boot Actuator

zero
ChatGPT Image 9. Mai 2025 11 20 20 png

Spring Boot bietet, out of the box, eine spannende Möglichkeit, die laufende Anwendung zu Monitoren, Metriken zu erfassen und Konfigurationen vorzunehmen: Spring Boot Actuator

Dazu ist es lediglich nötig, den entsprechenden Starter in unserer pom.xml zu deklarieren:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

Damit stellt Spring einen entsprechenden http-Endpunkt zur Verfügung (alternative per JMX):

http://localhost:8080/actuator

Diese Übersicht stellt nun erst einmal eine sehr überschaubare Anzahl an weiterführenden Endpunkten zur Verfügung. Lediglich „/health“ wird im Standard aktiviert, ein Endpunkt, der darüber informiert, ob das entsprechende System ansprechbar ist:

{"status":"UP"}

Es gibt jedoch eine ganze Reihe weiterer: https://docs.spring.io/spring-boot/reference/actuator/endpoints.html, die sich nun feingranular aktivieren lassen:

management.endpoints.web.exposure.include=health,info,scheduledtasks
#alle: management.endpoints.web.exposure.include=*

So sehen wir nun z.B. auch die konfigurierten Tasks (/scheduledtasks):

{
  "cron": [
    {
      "runnable": {
        "target": "de.gedoplan.metrics.ScheduleBean.sayHelloCron"
      },
      "expression": "0 * * * * *",
      "lastExecution": {
        "time": "2025-05-11T08:42:00.014076800Z",
        "status": "SUCCESS"
      },
      "nextExecution": {
        "time": "2025-05-11T08:42:59.998725900Z"
      }
    },
    {
      "runnable": {
        "target": "de.gedoplan.metrics.ScheduleBean.startBatch"
      },
      "expression": "0 */5 * * * *",
      "nextExecution": {
        "time": "2025-05-11T08:44:59.999763900Z"
      }
    }
  ]
}

Wollen wir diese Endpunkte frei zugänglich machen, sollten wir einen sehr genauen Blick auf die Informationen werfen, welche die Endpunkte bereitstellen, um nicht sensible Daten preis zu geben. Wenn im Einsatz kommen auch bei den Aktuator-Endpunkten Spring Security zum Zuge, wo wir dann auch explizit auf bestimmte Endpunkte einwirken können.

Bei einigen der möglichen Endpunkte ist auf die Vorbedingung zu achten, so werden viele Endpunkte nur dann aktiviert, wenn entsprechende Beans gefunden wurden oder bestimmte zusätzliche Konfigurationen gesetzt werden. So lässt sich z.B. auch das Server-Log mit einem entsprechenden Eintrag in der Konfiguration unter /logfile aktivieren:

logging.file.name=demoApp.log

Custom Health

Einige Endpunkte lassen sich auch erweitern. So besteht die Möglichkeit, den /health Endpunkt zu erweitern, um zusätzliche Informationen und weitere Prüfungen zu implementieren. So ließe sich zum Beispiel auch die Verfügbarkeit von Drittsystemen mit einbeziehen. Dazu ist es lediglich notwendig, das Interface HealthIndicator zu implementieren:

@Component
public class DummyJsonHealthIndicator implements HealthIndicator {

    @Autowired
    RestTemplate restTemplate;

    private String partnerUrl = "https://dummyjson.com/users";

    @Override
    public Health health() {
        try {
            restTemplate.optionsForAllow(URI.create(partnerUrl));
            return Health.up().build();
        }catch (Exception e) {
            return Health.down(e).withDetail("reason", "dummyjson.com not reachable").build();
        }
    }
}
boot metric custom health2

Custom Endpoint

Auch ganz eigene Endpunkte die Informationen bereitstellen oder auch Konfigurationen am System vornehmen, lasse sich implementieren. Das Beispiel hier konfiguriert zum Beispiel den REST-Endpunkt, der bei der Health-Prüfung aus dem vorherigen Abschnitt verwendet werden soll:

@Component
@Endpoint(id = "partnerHealthConfig")
public class PartnerHealthConfigEndpoint {

    @Autowired
    private DummyJsonHealthIndicator dummyJsonHealthIndicator;

    @ReadOperation
    public Map<String, String> getPartnerUrlToCheck(){
        return Map.of(
                "dummyJsonHealthIndicator",dummyJsonHealthIndicator.getPartnerUrl()
        );
    }

    @WriteOperation
    public void setPartnerUrlToCheck(@Selector String partnerId,  String partnerUrl){
        switch (partnerId){
            case "dummyJsonHealthIndicator": dummyJsonHealthIndicator.setPartnerUrl(partnerUrl); break;
        }
    }
}

Ein Aufruf von /actuator/partnerHealthConfig liefert nun die entsprechende Übersicht über alle konfigurieren URLs. Mit folgendem POST auf den konkreten Konfigurationswert (dummyJsonHealthIndicator) ließe sich diese Konfiguration nun auch zur Laufzeit ändern:

POST http://localhost:8080/actuator/partnerHealthConfig/dummyJsonHealthIndicator
Content-Type: application/json

{
    "partnerUrl": "https://down-dummyjson.com/users"
}

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!