wake-up-neo.com

Wie füge ich eine benutzerdefinierte Integritätsprüfung für den Zustand des Springboots hinzu?

<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?

21
shabinjo

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
    }
}
26
shabinjo

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.

6
Tobske

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",
6
yuranos87