
Gemini Enterprise Agent Platform での Claude Code 利用状況を Google Cloud ネイティブの機能で可視化・監視する
はじめに
こんにちは。
クラウド事業本部コンサルティング部の渡邉です。
Gemini Enterprise Agent Platform(旧 Vertex AI)上の Anthropic Claudeモデル を Claude Code から利用する際、「誰が・いつ・どのモデルを呼んだか」を把握したい、「エラーが増えたらすぐ気づきたい」というニーズがあると思います。
本記事では、Claude Code を Gemini Enterprise Agent Platform(旧 Vertex AI)バックエンドで利用するケースを前提に、その利用状況を Google Cloud ネイティブの機能で可視化・モニタリングする手順を、以下の 3 つの観点からご紹介します。
- Model Observability ダッシュボード — QPS・レイテンシ・エラー率をひと目で把握
- Logs Explorer — Data Access Audit Logs で「誰が・いつ・何を呼んだか」を追跡
- Cloud Monitoring アラートポリシー — エラー率急増を自動検知して通知
Claude Code は 環境変数に CLAUDE_CODE_USE_VERTEX=1 を設定すると Gemini Enterprise Agent Platform(旧 Vertex AI) 経由で Claude を呼び出します。このとき Claude Code は streamRawPredict(ストリーミング推論) を中心に API を呼ぶため、本記事のメトリクス・監査ログ・アラートはすべて Claude Code のトラフィックに対して有効です。
Claude Code を Gemini Enterprise Agent Platform(旧 Vertex AI)バックエンドで利用する内容のブログもいくつか執筆していますので、こちらもご確認いただけると幸いです。
Model Observability ダッシュボードとは
Gemini Enterprise Agent Platform には、MaaS(Model as a Service)モデルの動作・健全性・パフォーマンスを可視化するプリビルドのダッシュボードが搭載されています。Anthropic Claude を含むパートナーモデルの API 呼び出しもすべてここで確認できます。Claude Code はすべて API 経由で Claude を呼び出すため、Claude Code の利用分はすべてこのダッシュボード/後述の監査ログに記録されます。
確認できる主なメトリクス
| メトリクス | 説明 |
|---|---|
| モデルリクエスト数(QPS) | 1秒あたりのリクエスト数。利用量トレンドの把握に使う |
| トークンスループット | 入出力トークン数の推移 |
| First token latency | 最初のトークンが返るまでの時間。体感レスポンス速度の指標 |
| API エラー率 | エラー発生比率。異常検知に活用 |
ダッシュボードの見方
Model Observability ダッシュボードの実体は Cloud Monitoring のプリビルドダッシュボードです。
- Google Cloud コンソールで [Monitoring](モニタリング) → [ダッシュボード] を開く
- ダッシュボード一覧で [Vertex AI Model Garden (Monitoring)](環境によっては [Vertex AI Endpoint Overview])を選択する
- ページ上部のフィルターで モデル名 や リージョン を絞り込む
特定の Claude モデル(例: claude-sonnet-4-6)のメトリクスを確認したい場合は、model_user_id フィルターで絞り込みすることができます。
Claude Code は複数のモデルを使い分けます。 メインのモデルに加えて、タイトル生成などの軽量タスク用に小型・高速モデルを呼び出すことがあります(Gemini Enterprise Agent Platform では小型モデルの既定がメインと同じモデルにフォールバックする場合があり、ANTHROPIC_DEFAULT_HAIKU_MODEL で明示的に Haiku を指定することも可能です)。

Model invocation rate
「Vertex AI Model Garden (Monitoring)」ダッシュボードの概要画面です。「Model invocation rate」テーブルには claude-haiku-4-5・claude-opus-4-8・claude-sonnet-4-6 の 3 モデルが表示されており、Claude Code が同一セッション内で複数モデルを使い分けていることが一目で確認できます。右側の目次(Throughput・Latency・Errors・Tokens and characters・Provisioned Throughput)から各セクションに直接ジャンプできます。

Throughput
「Throughput」セクションです。左上の Model requests per second (QPS) グラフでは 3 モデルのリクエスト数が時系列で色分け表示されます。右上の Token count by model と下部の Token throughput グラフでは cache_read_input(青)が突出して大きく、Claude Code がプロンプトキャッシュを積極的に活用していることが数値で確認できます。1 モデルに絞って入出力の内訳を確認したい場合は、ダッシュボード上部の model_user_id フィルターを使います。

Latency
「Latency」セクションです。上部の First token latencies(p50/p95/p99)と Model invocation latencies は全モデルを集計した値のため、モデルごとの傾向は下段の p50 invocation latency by model と p50 first token latency by model で確認します。今回の計測では claude-opus-4-8 の p50 invocation latency が最大約 1.5 分に達しており、長い応答を返すコーディング・推論タスクのレイテンシが視覚化されています。ダッシュボード上部にも「上 2 グラフは全モデルの集計値のため意味がない場合がある。単一モデルで見るには model_user_id フィルターを使うこと」という注記が表示されています。

Errors
「Errors」セクションです。Model invocations by response code グラフには HTTP 200 のみが表示されており、この時間帯にエラーは発生していません。右側の Model invocations error rate (%) には「選択した時間枠で使用できるデータがありません」と表示され、エラー率が 0% であることを示しています。エラーが発生すると HTTP 4xx/5xx が別の色で積み上げ表示されるため、異常時は視覚的にすぐ気づけます。

Tokens and characters
「Tokens and characters」セクションです。Token throughput テーブルでは claude-opus-4-8 が 6.072 トークン/秒と最大で、Consumed character throughput テーブルでも claude-opus-4-8 が約 599.511 文字/秒と他モデルを大きく上回っています。メインモデル(Opus)が長い応答を返すコーディング・推論タスクを主に担当しているためで、消費量がモデル間で大きく異なることがコスト試算の際に重要なポイントになります。

Provisioned Throughput
「Provisioned Throughput」セクションです。今回の環境では Provisioned Throughput を購入していないため、グラフには「選択した時間枠で使用できるデータがありません」と表示されています。Provisioned Throughput は月額固定または週単位のサブスクリプションで一定スループットを確保する仕組みです。Claude Code を本番運用する際にクォータ超過(429 エラー)が頻発するようであれば、このセクションの利用率グラフを参考に購入を検討してみてもよいと思います。
Logs Explorer で「誰が・いつ・何を呼んだか」を追跡する
Cloud Audit Logs の Data Access Audit Logs を活用すると、aiplatform.googleapis.com への呼び出しを、呼び出し元ユーザー単位で追跡できます。
Gemini Enterprise Agent Platform の監査ログは サービス名 aiplatform.googleapis.com、リソースタイプ audited_resource で記録されます。
「誰が」を追えるかは Claude Code の認証方式で決まります。 Claude Code は gcloud の Application Default Credentials(gcloud auth application-default login)またはサービスアカウントで Vertex AI に認証し、その ID が監査ログの principalEmail に記録されます。
- 開発者ごとに個人の ID(ADC)や個人のサービスアカウントで認証 →
principalEmailが個人を指し、「誰が」を追跡できます。 - 全員が共有のサービスアカウントを使うと
principalEmailが同一になり、個人単位の追跡ができません。
利用者単位でモニタリングしたい場合は、開発者ごとに ID が分かれる認証設計(個人 ADC・個人 SA・Workload Identity など)にしておく必要があります。なお Claude Code の実行には aiplatform.endpoints.predict(roles/aiplatform.user に含まれる)が必要です。
前提条件
- Data Access Audit Logs が有効化済みであること(デフォルトは無効)
roles/logging.privateLogViewer以上の IAM ロールが付与されていること
手順
1. Logs Explorer を開く
[Google Cloud コンソール] → [Monitoring] → [Logs Explorer] を開く。
2. 基本クエリ:Gemini Enterprise Agent Platform への全 Data Access ログを確認する
logName="projects/YOUR_PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.serviceName="aiplatform.googleapis.com"

クエリ実行結果として約 140 件のログが表示されています。StreamRawPredict(Claude への推論呼び出し)だけでなく ListModelGardenModels などの管理系メソッドも混在しています。Claude Code 由来の推論ログのみを抽出するには、次のステップでメソッド名フィルターを追加します。
3. 呼び出し元ユーザーで絞り込む(誰が呼んだか)
protoPayload.authenticationInfo.principalEmail フィールドに呼び出し元のメールアドレスが記録されます。
logName="projects/YOUR_PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.serviceName="aiplatform.googleapis.com"
protoPayload.authenticationInfo.principalEmail="user@example.com"

principalEmail フィルターを追加した結果です。呼び出し元ユーザーの API 呼び出しのみに絞り込まれています。チーム全体のログから特定の開発者の利用状況を切り出す際に活用できます。
4. 呼び出されたメソッドで絞り込む(何を呼んだか)
protoPayload.methodName で絞り込むと、Claude への推論呼び出しのみを抽出できます。
Claude Code はストリーミング(StreamRawPredict)で呼び出します。 メソッド名は ...PredictionService.RawPredict / ...StreamRawPredict のように R が大文字で記録されるため、=~"rawPredict"(小文字)ではマッチしません。大文字小文字を無視し、両方を拾うために =~"(?i)rawpredict" を使います。
logName="projects/YOUR_PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.serviceName="aiplatform.googleapis.com"
protoPayload.methodName=~"(?i)rawpredict"

=~"(?i)rawpredict" でフィルタリングすると、Claude への推論呼び出し(StreamRawPredict)のみが抽出されます。表示されているログはすべて global.anthropic.claude-opus-4-8 へのリクエストであり、Claude Code がメインモデルとして Opus を使用していることがこのログからも確認できます。
主要なログフィールド一覧
監査ログで確認することのできるログフィールドの一覧です。
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"status": {},
"authenticationInfo": {
"principalEmail": "user@example.com",
"principalSubject": "user:user@example.com",
"oauthInfo": {
"oauthClientId": "xxxx-xxxxxxxxxxxx.apps.googleusercontent.com"
}
},
"requestMetadata": {
"callerIp": "xxx.xxx.xxx.xx",
"callerSuppliedUserAgent": "claude-cli/2.1.159 (external, cli),gzip(gfe)",
"requestAttributes": {
"time": "2026-06-01T04:58:15.774055525Z",
"auth": {}
},
"destinationAttributes": {}
},
"serviceName": "aiplatform.googleapis.com",
"methodName": "google.cloud.aiplatform.v1.PredictionService.StreamRawPredict",
"authorizationInfo": [
{
"resource": "projects/YOUR_PROJECT_ID/locations/global/publishers/anthropic/models/claude-opus-4-8",
"permission": "aiplatform.endpoints.predict",
"granted": true,
"resourceAttributes": {},
"permissionType": "DATA_READ"
}
],
"resourceName": "projects/YOUR_PROJECT_ID/locations/global/publishers/anthropic/models/claude-opus-4-8",
"request": {
"endpoint": "projects/YOUR_PROJECT_ID/locations/global/publishers/anthropic/models/claude-opus-4-8",
"@type": "type.googleapis.com/google.cloud.aiplatform.v1.StreamRawPredictRequest"
},
"response": {
"@type": "type.googleapis.com/google.api.HttpBody"
}
},
"insertId": "12wqryxdhu6r",
"resource": {
"type": "audited_resource",
"labels": {
"project_id": "YOUR_PROJECT_ID",
"method": "google.cloud.aiplatform.v1.PredictionService.StreamRawPredict",
"service": "aiplatform.googleapis.com"
}
},
"timestamp": "2026-06-01T04:58:15.762229446Z",
"severity": "INFO",
"logName": "projects/YOUR_PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access",
"operation": {
"id": "3071587205231147999",
"producer": "aiplatform.googleapis.com",
"last": true
},
"receiveTimestamp": "2026-06-01T04:58:24.419990201Z"
}
| フィールド | 内容 |
|---|---|
protoPayload.@type |
ログのスキーマ型(google.cloud.audit.AuditLog=監査ログ) |
protoPayload.status |
呼び出し結果のステータス(空 {} は正常終了。エラー時はコード/メッセージが入る) |
protoPayload.authenticationInfo.principalEmail |
呼び出し元のユーザー or サービスアカウント(「誰が」の主軸) |
protoPayload.authenticationInfo.principalSubject |
呼び出し元の主体表現(例: user:user@example.com) |
protoPayload.authenticationInfo.oauthInfo.oauthClientId |
認証に使われた OAuth クライアント ID(gcloud/Claude Code 由来) |
protoPayload.requestMetadata.callerIp |
呼び出し元 IP アドレス |
protoPayload.requestMetadata.callerSuppliedUserAgent |
呼び出し元 User-Agent(例: claude-cli/2.1.159 (external, cli))。Claude Code からの呼び出しを識別できる |
protoPayload.requestMetadata.requestAttributes.time |
リクエストが受け付けられた時刻 |
protoPayload.requestMetadata.destinationAttributes |
宛先側の属性(通常は空) |
protoPayload.serviceName |
サービス名(aiplatform.googleapis.com) |
protoPayload.methodName |
呼び出されたメソッド名(Claude Code は主に google.cloud.aiplatform.v1.PredictionService.StreamRawPredict) |
protoPayload.authorizationInfo[].resource |
認可チェック対象のリソース(モデルリソース名) |
protoPayload.authorizationInfo[].permission |
チェックされた権限(aiplatform.endpoints.predict) |
protoPayload.authorizationInfo[].granted |
権限が付与されたか(true/false) |
protoPayload.authorizationInfo[].permissionType |
権限の種別(DATA_READ など) |
protoPayload.resourceName |
呼び出されたリソース(例: publishers/anthropic/models/claude-... のようにモデル名を含む) |
protoPayload.request.endpoint |
リクエスト先のエンドポイント(モデルリソース名) |
protoPayload.request.@type |
リクエストの型(例: StreamRawPredictRequest) |
protoPayload.response.@type |
レスポンスの型(ストリーミングは google.api.HttpBody) |
insertId |
ログエントリの一意 ID |
resource.type |
モニタリング対象リソース種別(audited_resource) |
resource.labels.project_id |
プロジェクト ID |
resource.labels.method |
リソースラベル側のメソッド名 |
resource.labels.service |
リソースラベル側のサービス名 |
timestamp |
呼び出し日時(イベント発生時刻) |
severity |
ログの重大度(例: INFO) |
logName |
ログ名(cloudaudit.googleapis.com%2Fdata_access) |
operation.id |
操作 ID(同一操作のログを関連付ける) |
operation.producer |
操作の生成元サービス |
operation.last |
この操作の最終エントリかどうか(true/false) |
receiveTimestamp |
Cloud Logging がログを受信した時刻 |
このログ 1 件から読み取れる情報をまとめると次のようになります。「誰が」 は principalEmail(user@example.com)で分かり、個人 ADC で認証していれば呼び出した開発者が特定できます。
「いつ」は timestamp(2026-06-01T04:58:15Z)が呼び出しの発生時刻、receiveTimestamp が Cloud Logging への到達時刻で、両者の差分(約 9 秒)がログ収集の遅延に相当します。
「何を呼んだか」は methodName(StreamRawPredict)と resourceName のモデル名(claude-opus-4-8)の組み合わせで、Claude Code がメインモデルとして Opus をストリーミングで呼んでいることが確認できます。
「成功したか」は status(空オブジェクト {} は正常終了)と authorizationInfo[].granted(true)から判断でき、権限エラーや API エラーが発生した場合はここにコードとメッセージが入ります。「どのツールから」は callerSuppliedUserAgent(claude-cli/2.1.159 (external, cli))で判別でき、同じ認証 ID でも gcloud コマンドや他のアプリからの呼び出しと Claude Code からの呼び出しを区別する際に役立ちます。
Cloud Monitoring でエラー急増アラートを設定する
Claude Code 経由のエラーが急増した際に自動で通知を受け取るには、Cloud Monitoring の アラートポリシー を設定します。
前提条件
roles/monitoring.alertPolicyEditor以上の IAM ロールが付与されていること
手順
1. 通知チャンネルを作成する
- [Monitoring] → [アラート] → [通知チャンネルを編集] を開く

- [メール] の [新規追加] をクリックし、通知先のメールアドレスを入力して保存する
通知チャンネルを設定しないと、アラートが発火しても誰にも通知されません。必ず先に作成しておいてください。

2. アラートポリシーを作成する
- [Monitoring] → [アラート] → [+ポリシーを作成] をクリックする

Cloud Monitoring のアラートページです。上部の「+ポリシーを作成」ボタンからアラートポリシーを、「通知チャンネルを編集」ボタンから通知先の管理画面にアクセスできます。
- [指標を選択] で以下を設定する
- リソースタイプ:
Vertex AI Model Garden Publisher Model - 指標:
Model invocation count - フィルター:
response_code = 500(サーバーエラーのみを対象にする場合。クォータ超過(429)も監視したい場合はフィルターを追加するか、response_code != 200で設定する)
- リソースタイプ:

ポリシー構成モード(Builder)の設定画面です。「Select a metric」で Vertex AI Model Garden Publisher Model - Model invocation count を選択し、「フィルタの追加」で response_code = 500 を設定してサーバーエラーの呼び出しのみを集計対象にしています。「Transform data」セクションでは集計のローリングウィンドウと関数を指定します。
- [アラートのトリガーを構成する] で以下を設定し、[次へ] をクリックする
- 条件タイプ:
しきい値 - アラートのトリガー:
いずれかの時系列が超過 - しきい値:
50(利用規模に応じて調整してください)
- 条件タイプ:

アラートトリガーの設定画面です。条件タイプ「Threshold(しきい値)」を選択し、しきい値を 50 に設定しています。
- [通知と名前] で手順 1 で作成した通知チャンネルを選択し、ポリシー名を入力して [次へ] をクリックする

通知と名前の設定画面です。「通知チャンネルを使用」をオンにし、手順 1 で作成した Email チャンネルを選択します。「Policy Severity Level」は 重大 のままで問題ありません。ポリシー名(例:【Gemini Enterprise Agent Platform】Claude エラー数急増アラート)を入力して「次へ」をクリックします。
- 設定内容を確認して [ポリシーを保存] をクリックする

最終確認画面です。左側には設定した条件(指標・トリガー・しきい値)の概要が表示されます。右側の「Policy Details」では通知チャンネルと重大度(重大)が確認できます。内容に問題がなければ「ポリシーを保存」をクリックして設定を完了します。
まとめ
Gemini Enterprise Agent Platform(旧 Vertex AI)での Claude Code の利用状況は、Google Cloud ネイティブの機能を組み合わせることで、追加のツール導入なしに可視化・モニタリングが実現できます。
Model Observability ダッシュボードを使えば QPS・レイテンシ・エラー率をリアルタイムでひと目で把握でき、問題発生時の初動対応が迅速になります。Data Access Audit Logs では principalEmail(Claude Code の認証 ID)や methodName(StreamRawPredict)を組み合わせたクエリにより、「誰が・いつ・何を呼んだか」というアクセス履歴を組織全体で追跡できます。さらに Cloud Monitoring アラートポリシーを設定しておくことで、エラー数の急増を自動検知し、問題を早期に発見・通知する仕組みが完成します。
運用にあたっていくつか注意点もあります。ダッシュボードのメトリクスはサンプリング後に最大約 6 分の反映遅延があるため、アラートの初動もその分遅れる前提で設計してください。また、ダッシュボードの「トークンスループット」はキャッシュ書き込み(cache_creation_input_tokens)とキャッシュ読み出し(cache_read_input_tokens)を通常の入出力トークンと区別しないため、正確なコスト把握には Request-Response Logging(BigQuery)の full_response.usage でトークン種別ごとに集計する必要があります。Data Access Audit Logs はデフォルトで無効のため明示的に有効化が必要で、有効化前のログは遡れません。principalEmail による個人追跡は共有サービスアカウントでは機能しないため、利用者単位で監視したい場合は個人 ADC や個人 SA など ID が分かれる認証設計にしておく必要があります。
Gemini Enterprise Agent Platform(旧 Vertex AI)での Claude Code の利用が広がる前に、これらの監視基盤を整えることを強くお勧めします。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部コンサルティング部の渡邉でした!








