<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Dadurch werden Ihrer Anwendung mehrere nützliche Endpunkte hinzugefügt. Eine davon ist/health. Wenn Sie Ihre Anwendung starten und zum/health-Endpunkt navigieren, werden bereits einige Daten zurückgegeben.
{
"status":"UP",
"diskSpace": {
"status":"UP",
"free":56443746,
"threshold":1345660
}
}
Wie füge ich eine benutzerdefinierte Integritätsprüfung für den Zustand des Springboots hinzu?
Das Hinzufügen einer benutzerdefinierten Integritätsprüfung ist einfach. Erstellen Sie einfach eine neue Java Klasse, erweitern Sie sie aus dem AbstractHealthIndicator und implementieren Sie die doHealthCheck-Methode. Die Methode lässt einen Builder mit einigen nützlichen Methoden übergeben. Rufen Sie builder.up () auf, wenn Ihr Zustand in Ordnung ist oder builder.down () wenn nicht. Was Sie tun, um den Zustand zu überprüfen, liegt ganz bei Ihnen. Vielleicht möchten Sie einen Server anpingen oder einige Dateien überprüfen.
@Component
public class CustomHealthCheck extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder bldr) throws Exception {
// TODO implement some check
boolean running = true;
if (running) {
bldr.up();
} else {
bldr.down();
}
}
}
Dies reicht aus, um die neue Integritätsprüfung zu aktivieren (stellen Sie sicher, dass sich @ComponentScan in Ihrer Anwendung befindet). Starten Sie Ihre Anwendung neu und suchen Sie Ihren Browser auf dem/health-Endpunkt. Daraufhin wird die neu hinzugefügte Integritätsprüfung angezeigt.
{
"status":"UP",
"CustomHealthCheck": {
"status":"UP"
},
"diskSpace": {
"status":"UP",
"free":56443746,
"threshold":1345660
}
}
Seit Spring Boot 2.X
Wie von @ yuranos87 angegeben, hat sich das Antriebskonzept in Spring Boot 2.X geändert. Sie können jedoch benutzerdefinierte Integritätsprüfungen hinzufügen, indem Sie HealthIndicator
oder für reaktive Anwendungen ReactiveHealthIndicator
:
@Component
public class CacheHealthIndicator implements HealthIndicator {
@Override
public Health health() {
long result = checkSomething())
if (result <= 0) {
return Health.down().withDetail("Something Result", result).build();
}
return Health.up().build();
}
oder
@Component
public class CacheHealthIndicator implements ReactiveHealthIndicator {
@Override
public Mono<Health> health() {
return Mono.fromCallable(() -> checkSomething())
.map(result -> {
if (result <= 0) {
return Health.down().withDetail("Something Result", result).build();
}
return Health.up().build();
});
}
}
Zusätzlich können Sie jeden Endpunkt mit @Endpoint
Oder @EndpointWebExtension
Hinzufügen oder erweitern. Endpunkte sind hier info
, health
und viele mehr. Sie können also mit @Endpoint
Eine benutzerdefinierte Zustandsprüfung hinzufügen, dies ist jedoch mit HealthIndicator
viel einfacher.
Weitere Informationen zu benutzerdefinierten Integritätsprüfungen und benutzerdefinierten Endpunkten finden Sie in der Spring Boot-Dokumentation.
Spring Boot 2.X hat den Antrieb erheblich verändert. Ein neuer, besserer Mechanismus zum Erweitern vorhandener Endpunkte wird über @EndpointWebExtension
Aktiviert.
Abgesehen davon ist die Erweiterung des Integritätsendpunkts etwas schwieriger, da der Aktuator selbst eine Erweiterung für diesen Endpunkt bereitstellt. Ohne Manipulation des Beans-Initialisierungsprozesses kann Ihre Anwendung nicht gestartet werden, da 2 Erweiterungen angezeigt werden und nicht verstanden wird, welche ausgewählt werden muss. Eine einfachere Möglichkeit wäre, stattdessen info zu verwenden und zu erweitern:
@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class InfoWebEndpointExtension {
@Value("${info.build.version}")
private String versionNumber;
@Value("${git.commit.id}")
private String gitCommit;
@Value("${info.build.name}")
private String applicationName;
...
@ReadOperation
public WebEndpointResponse<Map> info() {
Vergessen Sie nicht, dass Sie URLs auch neu zuordnen können. In meinem Fall ziehe ich / status/ health vor und möchte / actuator / nicht im Pfad:
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.info=status
Ein weiterer Grund, warum ich / info bevorzuge, ist, dass ich diese verschachtelte Struktur nicht erhalte, die für / health voreingestellt ist:
{
"status": {
"status": "ON",