Spring Boot Actuatorには、インスタンス自体やインスタンス内で依存している外部リソース(ディスク、DB、メッセージングサービス、キャッシュサービスなど)の稼動状態(ヘルスチェック結果)を提供するエンドポイント(/actuator/health
, /actuator/health/{name}
)があり、独自のヘルスチェック状態を提供することもできます。
独自のヘルスチェック処理を自動登録する方法
Spring Bootのリファレンスにサンプルコード付きで紹介されていますが、HealthIndicator
インタフェースを実装したクラスをDIコンテナに登録すると、Spring Boot Actuatorが自動で検出してくれます。
@Component // コンポーネントスキャンでDIコンテナに登録
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
return checkWeatherAvailable() ? Health.up().build(): Health.down().build();
}
private boolean checkWeatherAvailable() {
boolean result = false;
// 死活監視処理
// ...
return result;
}
}
独自のヘルスチェック処理をマニュアル登録する方法
Spring Boot Actuatorはヘルスチェック処理を行うオブジェクトはHealthIndicatorRegistry
で管理しており、DIコンテナから取得したHealthIndicatorRegistry
を介して独自のヘルスチェック処理をマニュアルで登録することもできます。
例えば、ヘルスチェック処理の対象が設定値によって変えたい(増減させたい)場合は、マニュアル登録の仕組みが使えると思います。
@Configuration
public class MyConfiguration {
// ...
@Autowired
void addExternalServiceHealthIndicators(HealthIndicatorRegistry registry, MyProperties properties) {
properties.getExternalServices().stream().filter(s -> StringUtils.hasText(s.getHealthCheckUrl()))
.forEach(s -> registry.register(s.getName(), new UrlBasedHealthIndicator(s.getHealthCheckUrl())));
}
}
public class UrlBasedHealthIndicator implements HealthIndicator {
private final String url;
public UrlBasedHealthIndicator(String url) {
this.url = url;
}
@Override
public Health health() {
return checkWeatherAvailable() ? Health.up().build(): Health.down().build();
}
private boolean checkWeatherAvailable() {
boolean result = false;
// 死活監視処理
// ...
return result;
}
}
まとめ
現在携わっている案件では商用アプリとしてはSpring Bootは使っていないのですが、外部システムのシミュレータ(テストでの利用がメインですが・・・商用環境でも内部管理向けに使用するシミュレータ)をSpring Bootで作成しており、シミュレータ内で扱うリソースの稼動状態を設定値によって増減できる仕組みにしたいな〜と思い実現方法を調べてみました。