web-dev-qa-db-fra.com

Comment ajouter un bilan de santé personnalisé dans la santé de démarrage du printemps?

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

Cela ajoutera plusieurs points finaux utiles à votre application. L'un d'eux est/santé. Lorsque vous démarrez votre application et accédez au point de terminaison/health, vous verrez qu'elle renvoie déjà certaines données.

{
    "status":"UP",
    "diskSpace": {
        "status":"UP",
        "free":56443746,
        "threshold":1345660
    }
}

Comment ajouter un bilan de santé personnalisé dans la santé de démarrage du printemps?

21
shabinjo

Ajouter un bilan de santé personnalisé est facile. Créez simplement une nouvelle classe Java, étendez-la à partir de AbstractHealthIndicator et implémentez la méthode doHealthCheck. La méthode reçoit un générateur transmis avec certaines méthodes utiles. Appelez builder.up () si votre santé est OK ou builder.down () si ce n’est pas le cas. Ce que vous faites pour vérifier l’état de la santé vous appartient totalement. Peut-être souhaitez-vous envoyer une requête ping à un serveur ou vérifier certains fichiers.

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

Cela suffit pour activer le nouveau bilan de santé (assurez-vous que @ComponentScan est bien sur votre application). Redémarrez votre application et localisez votre navigateur sur le noeud final/health et vous verrez la vérification de santé récemment ajoutée.

{
    "status":"UP",
    "CustomHealthCheck": {
        "status":"UP"
    },
    "diskSpace": {
        "status":"UP",
        "free":56443746,
        "threshold":1345660
    }
}
26
shabinjo

Depuis Spring Boot 2.X

Comme l'a déclaré @ yuranos87, le concept d'actionneur a changé dans Spring Boot 2.X mais vous pouvez toujours ajouter facilement des contrôles de l'intégrité personnalisés en implémentant HealthIndicator ou pour les applications réactives 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();      
}

ou

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

De plus, vous pouvez ajouter ou étendre n’importe quel point de terminaison avec @Endpointou @EndpointWebExtension. Les points finaux ici sont info, health et bien d’autres. Vous pouvez donc ajouter un bilan de santé personnalisé en utilisant @Endpoint mais c'est beaucoup plus facile à faire avec HealthIndicator.

Pour plus d'informations sur vérifications de l'état de santé personnalisé et points de terminaison personnalisés , consultez la documentation de démarrage printanier.

6
Tobske

Spring Boot 2.X a considérablement changé l'actionneur. Un nouveau mécanisme plus efficace pour étendre les points de terminaison existants est activé via @EndpointWebExtension.

Cela étant dit, le point de terminaison santé est un peu plus difficile à étendre car une extension est fournie directement par l’actionneur. Sans manipuler le processus d'initialisation des beans, votre application ne pourra pas démarrer car elle verra 2 extensions et ne comprendra pas laquelle choisir. Un moyen plus simple serait d'utiliser plutôt les informations et de les étendre:

@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() {

N'oubliez pas que vous pouvez également redéfinir les URL. Dans mon cas, je préfère / status à / santé et je ne veux pas / actuator / dans le chemin:

management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.info=status

Une autre raison pour laquelle je préfère / info est que je n’obtiens pas cette structure imbriquée, qui est la valeur par défaut pour / health:

{
"status": {
    "status": "ON",
6
yuranos87