web-dev-qa-db-ja.com

春のブートヘルスにカスタムヘルスチェックを追加するにはどうすればよいですか?

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

これにより、いくつかの便利なエンドポイントがアプリケーションに追加されます。それらの1つは/ healthです。アプリケーションを起動して/ healthエンドポイントに移動すると、すでにいくつかのデータが返されていることがわかります。

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

春のブートヘルスにカスタムヘルスチェックを追加するにはどうすればよいですか?

21
shabinjo

カスタムヘルスチェックの追加は簡単です。新しいJavaクラスを作成し、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
    }
}
26
shabinjo

Spring Boot 2.X以降

@ yuranos87で述べたように、アクチュエータの概念はSpring Boot 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を使用する方がはるかに簡単です。

カスタムヘルスチェック および カスタムエンドポイント の詳細については、スプリングブートのドキュメントを参照してください。

6
Tobske

Spring Boot 2.Xは、アクチュエータを大幅に変更しました。 @EndpointWebExtensionを介して、既存のエンドポイントを拡張するための新しい優れたメカニズムが有効になります。

そうは言っても、ヘルスエンドポイントは、アクチュエータ自体によって箱から出してすぐに提供されるため、拡張が少し難しくなります。 Beanの初期化プロセスを操作しないと、2つの拡張機能が表示され、どちらを選択するかがわからないため、アプリケーションを起動できません。簡単な方法は、代わりにinfoを使用して拡張することです。

@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を好むもう1つの理由は、このネスト構造が得られないためです。これは/ healthのデフォルトです:

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