Spring AIアプリケーションのオブザーバビリティ構築:Actuatorによるメトリクス監視

Spring AIの運用における監視の重要性

エンタープライズ環境にAI機能を組み込む際、本番環境でのモデルの挙動やリソース消費量、レイテンシの把握は不可欠です。大規模言語モデル(LLM)の呼び出しはコストが高く、トークン消費量が直接料金に影響するため、監視機構がない状態での運用は重大なリスクを伴います。Spring Bootの強力なエコシステムを活用すれば、こうしたAIアプリケーションのオブザーバビリティ(可観測性)を容易に確立できます。

ActuatorとMicrometerによる監視基盤の構築

Spring AIのメトリクスを収集・公開するために、Spring Boot ActuatorとMicrometerを導入します。

依存関係の設定

プロジェクトのビルドファイルに必要なライブラリを追加します。Prometheusなどの監視システムへデータを連携する場合、対応するレジストリも含めます。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-observation</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
</dependencies>

アプリケーションプロパティの構成

次に、監視エンドポイントの公開設定を行います。セキュリティの観点から、本番環境では必要なエンドポイントのみを公開し、アクセス制御を適用することが推奨されます。ここでは、管理ポートを分離し、メトリクスを公開する設定を記述します。

management:
  server:
    port: 9091
  endpoints:
    web:
      exposure:
        include: health,metrics,prometheus,info
  endpoint:
    health:
      show-details: always
    metrics:
      enabled: true
    prometheus:
      enabled: true
  metrics:
    export:
      prometheus:
        enabled: true
    tags:
      app_name: ai-monitoring-app
      deployment_env: ${ACTIVE_PROFILE:local}

監視エンドポイントの検証

アプリケーション起動後、設定した管理ポートに対してリクエストを送り、動作を確認します。

# ヘルスチェックの確認
curl http://localhost:9091/actuator/health

# メトリクス一覧の取得
curl http://localhost:9091/actuator/metrics

# Prometheusフォーマットのデータ取得
curl http://localhost:9091/actuator/prometheus

正常に設定されていれば、ヘルスエンドポイントはアプリケーションの状態を返します。

{
  "status": "UP",
  "components": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 500107862016,
        "free": 350107860992,
        "threshold": 10485760,
        "exists": true
      }
    },
    "ping": {
      "status": "UP"
    }
  }
}

AI監視において中心的な役割を果たすエンドポイントは以下の通りです。

エンドポイント 目的 AI監視における重要度
/actuator/health システムおよびコンポーネントの状態確認 高 - AIサービスとの接続性確認
/actuator/metrics メトリクス名の一覧と詳細取得 高 - AI関連指標の確認
/actuator/prometheus Prometheus形式でのメトリクス出力 高 - 外部監視ツールへのデータ連携
/actuator/loggers ログレベルの動的変更 中 - AIリクエストのデバッグ時

起動時の監視要件チェック

デプロイ直後に監視基盤が正常に機能しているかを自動検証するために、CommandLineRunnerを実装したバリデータを作成できます。

@Component
public class EndpointDiagnosticRunner implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(EndpointDiagnosticRunner.class);

    private final WebClient diagnosticClient;

    @Value("${management.server.port:${server.port:8080}}")
    private int managementPort;

    public EndpointDiagnosticRunner(WebClient.Builder builder) {
        this.diagnosticClient = builder.build();
    }

    @Override
    public void run(String... args) {
        String actuatorRoot = "http://localhost:" + managementPort + "/actuator";

        diagnosticClient.get()
            .uri(actuatorRoot + "/metrics")
            .retrieve()
            .bodyToMono(String.class)
            .subscribe(response -> {
                if (response.contains("spring.ai")) {
                    log.info("Spring AI metrics are correctly registered and exposed.");
                } else {
                    log.warn("AI-specific metrics missing. Verify Spring AI observation configuration.");
                }
            }, error -> log.error("Actuator endpoint validation failed", error));
    }
}

Spring AIメトリクスの詳細分析

Spring AIはMicrometerのObservation機能を利用して、モデル呼び出しのメトリクスを自動的に収集します。このデータを分析することで、パフォーマンスのボトルネックやコストの異常を検知できます。

チャットクライアントの呼び出しメトリクス

/actuator/metrics/spring.ai.chat.clientにアクセスすると、ChatClientの呼び出しに関する詳細な統計情報が取得できます。

{
  "name": "spring.ai.chat.client",
  "description": "Metrics for ChatClient invocations",
  "baseUnit": "seconds",
  "measurements": [
    {
      "statistic": "COUNT",
      "value": 137
    },
    {
      "statistic": "TOTAL_TIME",
      "value": 54.21
    },
    {
      "statistic": "MAX",
      "value": 3.142
    }
  ],
  "availableTags": [
    {
      "tag": "model",
      "values": ["gpt-4-turbo", "claude-3-opus"]
    },
    {
      "tag": "status",
      "values": ["SUCCESS", "CLIENT_ERROR"]
    }
  ]
}

このデータから、リクエストの総数、累積応答時間、最大レイテンシを読み取ることが可能です。さらにavailableTagsを利用することで、特定のモデル(例:gpt-4-turbo)やステータスごとにメトリクスをフィルタリングし、詳細な傾向分析を行うことができます。

タグ: Spring AI Spring Boot Actuator Micrometer Prometheus Observability

5月20日 23:46 投稿