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)やステータスごとにメトリクスをフィルタリングし、詳細な傾向分析を行うことができます。