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();
}
}
}

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"
}