💨

Spring Boot Actuatorとは?

2024/05/05に公開

はじめに

最近、Spring Boot Actuatorを導入してヘルスチェック機能を利用する機会がありました。しかし、そもそもSpring Boot Actuatorとは何なのか?何のためにあるのか?という個人的な疑問が浮かんだので、これをまとめて記事にしてみました。

Spring Boot Actuatorとは

公式からの引用です。

Spring Boot includes a number of additional features to help you monitor and manage your application when you push it to production. You can choose to manage and monitor your application by using HTTP endpoints or with JMX. Auditing, health, and metrics gathering can also be automatically applied to your application.

つまり、Spring Boot Actuatorは、Spring Boot アプリケーションの実行状況を監視し、管理するための機能です。

この機能を利用することで、アプリケーションのヘルスチェック、メトリクスの収集、環境情報の取得などが可能になります。
本番環境でのアプリケーション運用に必要な機能が簡単に追加できるというもののようです。

主な機能

具体的には、以下のような機能があります(全ては書ききれないので一部抜粋)。

  • ヘルスチェック
    • アプリケーションの健全性を示す/healthエンドポイントを提供し、データベース、ディスク空間、メッセージブローカーなどの状態を確認できます。
  • メトリクス情報
    • アプリケーションの利用状況やパフォーマンス指標を提供する/metricsエンドポイントがあり、HTTPリクエスト、データベースの使用状況、JVMのメモリ使用状況など、様々なメトリクスを取得できます。
  • 設定情報の公開
    • /env エンドポイントを通じて、アプリケーションの環境設定情報を取得できます。
  • アプリケーションのログ設定
    • /loggers エンドポイントで、実行中のアプリケーションのロギング設定を確認し、動的に変更が可能です。
  • シャットダウン
    • POSTリクエストを/shutdownエンドポイントに送信することで、アプリケーションを正常に停止させることができます(デフォルトでは無効化されています)。

ヘルスチェック機能を試してみる

pom.xmlにactuatorの設定を追加します。

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

アプリケーションを起動し、actuator/healthにアクセスします。

curl localhost:8080/actuator/health
{"status":"UP"}%

無事、ヘルスチェックの結果が返ってきました。コードは一切記載していません。

ヘルスチェックは何をチェックしているのか

ここで上記のような疑問が浮かんできたので、デフォルトでは何をチェックしているのかを調査してみたいと思います。

詳細は公式の情報をご確認いただきたいのですが、ざっくり気になったところを書き出すと以下のような要素を確認しているようです。

  • データベース接続
    • データベースへの接続が正常に行われているかどうか。
  • ディスクスペース
    • サーバーのディスク空間が十分にあるかどうか。
  • メッセージブローカー接続
    • RabbitMQやKafkaなどのメッセージブローカーとの接続状態。
  • キャッシュ状態
    • Redisなどのキャッシュサービスの利用状況や接続状態。

具体的にどうチェックしているのかも、公式からコードを辿ることができるようになっており、そこで詳細が確認できます。これは嬉しいですね。

ヘルスチェックのカスタマイズ

HealthIndicatorを実装したカスタムクラスを実装することで、任意のヘルスチェックを用意することができます。

以下は実装例です。

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class CustomHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        int errorCode = check(); // ここに具体的な健康チェックのロジックを実装
        if (errorCode != 0) {
            return Health.down()
                .withDetail("Error Code", errorCode)
                .build();
        }
        return Health.up().build();
    }

    private int check() {
        // ここに健康状態をチェックするための具体的なロジックを実装
        // 正常なら0、異常があれば0以外を返す
        return 1;
    }
}

この実装をした後に、アプリケーションを起動し、actuator/healthにアクセスすると

curl localhost:8080/actuator/health
{"status":"DOWN"}%

ちゃんと、ヘルスチェックに失敗してくれます。

おわりに

謎に満ちた機能、Spring Boot Actuatorを少しだけ理解することができました。今回触った分以外にも他にも数多くの機能があるので、機会があればまた触ってみたいと思います。

参考

Discussion