如何在 spring 启动健康中添加自定义健康检查?

How to add a custom health check in spring boot health?

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

这将为您的应用程序添加几个有用的端点。其中之一是 /health。当您启动您的应用程序并导航到 /health 端点时,您将看到它 returns 已经有一些数据。

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

如何在 spring 启动健康中添加自定义健康检查?

添加自定义健康检查很容易。只需创建一个新的 Java class,从 AbstractHealthIndicator 扩展它并实现 doHealthCheck 方法。该方法通过一些有用的方法获取一个构建器。如果您的健康状况良好,请致电 builder.up(),否则请致电 builder.down()。您如何检查健康状况完全取决于您。也许您想 ping 一些服务器或检查一些文件。

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

这足以激活新的健康检查(确保@ComponentScan 在您的应用程序上)。重新启动您的应用程序并将浏览器定位到 /health 端点,您将看到新添加的健康检查。

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

Spring 引导 2.X 已显着更改执行器。通过 @EndpointWebExtension.

启用了一种新的、更好的扩展现有端点的机制

也就是说,健康端点的扩展有点棘手,因为它的一个扩展是由执行器本身开箱即用的。如果不操纵 beans 初始化过程,您的应用程序将无法启动,因为它会看到 2 个扩展并且不知道选择哪一个。 一种更简单的方法是改用信息并扩展它:

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

别忘了您还可以重新映射 URL。就我而言,我更喜欢 /status 而不是 /health 并且不希望 /actuator/ 在路径:

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

我更喜欢 /info 的另一个原因是因为我没有得到这个嵌套结构,它是 /health 的默认结构:

{
"status": {
    "status": "ON",

自Spring开机2.X

如@yuranos87 所述,执行器概念在 Spring 引导 2.X 中发生了变化,但您仍然可以通过实施 HealthIndicator 或反应式应用程序 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();      
  }
}

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

此外,您可以使用 @Endpoint@EndpointWebExtension 添加或扩展 任何端点 。这里的端点是 infohealth 等等。因此,您可以使用 @Endpoint 添加自定义健康检查,但使用 HealthIndicator.

更容易

您可以在 spring 引导文档中找到有关 custom health checks and custom endpoints 的更多信息。

如果您想要自定义状态消息,那么您可以在此处查看答案 -