サードパーティ モデルのトークン使用量を追跡する

Anthropic Claude Opus 5.5 や Anthropic Claude Sonnet 5.5 などのサードパーティ モデルのモデル別、日別、ユーザー別のトークン消費量を計算するには、Cloud Logging と オブザーバビリティ分析 を使用して AI デベロッパー ツールを使用します。

クイックスタート

プロジェクトの _Default ログバケットが オブザーバビリティ分析用にすでにアップグレードされている場合は、[ロギング] > [オブザーバビリティ分析] で次のクエリを実行し([PROJECT_ID] を Google Cloud プロジェクト ID に置き換えます)、サードパーティの Anthropic モデル全体で 30 日間のトークン使用量を取得します。

SELECT
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64)) AS input_tokens,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64)) AS output_tokens,
  IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64)), 0) AS cached_tokens,
  IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64)), 0) AS thoughts_tokens,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  model
ORDER BY
  total_tokens DESC

始める前に

チュートリアルの手順を実行する前に、プロジェクトが次の要件を満たしていることを確認してください。

  • メタデータ ロギングが有効になっている。inference_response レコードに jsonPayload.metadata トークン ブロックが含まれるように、AI デベロッパー ツール管理者の制御でメタデータ ロギングを有効にする必要があります。
  • 少なくともログ閲覧者ロール(roles/logging.viewer)が付与されている。標準の roles/logging.viewer ロールは、このガイド全体で使用される _Default._Default ログビューへの SQL アクセス権を付与します。_Default._AllLogs ビューのクエリには、roles/logging.privateLogViewer または roles/logging.viewAccessor が必要です。
  • _Default ログバケットがオブザーバビリティ分析用にアップグレードされました。
    1. Google Cloud コンソールで、[ロギング] > [ログ ストレージ] に移動し、_Default バケットを見つけて、[オブザーバビリティ分析] 列を確認します。
    2. 有効になっていない場合は、 [その他] > [オブザーバビリティ分析を使用するためにアップグレード] をクリックします。アップグレードでは _Default がインプレースで変更され、元に戻すことはできません。
    3. 初期伝播を許可する: バケットをアップグレードした後、Cloud Logging は新しいログエントリのルーティング キャッシュを更新するのに 30 ~ 60 分かかり、過去のログのバックフィルには数時間かかります(バックフィルはアップグレードの完了から 1 時間後に開始されます)。

ログレコードの構造

推論呼び出しごとに、businessaicode.googleapis.com%2Finference_response ログに 1 つの InferenceResponseLog エントリが出力されます。モデル ID は labels に記録され、トークン数は jsonPayload.metadata に記録されます。

{
  "logName": "projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response",
  "timestamp": "2026-10-07T17:23:03.495323480Z",
  "labels": {
    "model": "claude-sonnet-5-5",
    "model_provider": "Anthropic",
    "client_name": "antigravity_cli",
    "user_id": "user:user@example.com",
    "trajectory_id": "25cd0b58-58ea-4beb-b2d7-42e0d3fdd96d",
    "request_id": "25cd0b58-58ea-4beb-b2d7-42e0d3fdd96d-19"
  },
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.businessaicode.logging.v1.InferenceResponseLog",
    "metadata": {
      "promptTokenCount": "70825",
      "cachedContentTokenCount": "69079",
      "candidatesTokenCount": "14215",
      "totalTokenCount": "85040"
    }
  }
}

フィールド リファレンスとカウントルール

LogEntry フィールド(ログ エクスプローラとログベースの指標) SQL 式(オブザーバビリティ分析) 説明
labels.model JSON_VALUE(labels.model) モデル識別子(Anthropic Claude Sonnet 5.5 の場合は claude-sonnet-5-5、Anthropic Claude Opus 5.5 の場合は claude-opus-5-5 など)。
labels.model_provider JSON_VALUE(labels.model_provider) プロバイダ名(例: Anthropic、Google)。
labels.user_id JSON_VALUE(labels.user_id) 認証されたプリンシパル(user:user@example.com など)。
labels.trajectory_id JSON_VALUE(labels.trajectory_id) 会話またはエージェントの軌跡 ID。通常、1 回のユーザー ターンは、1 つの trajectory_id の下で複数の request_id 呼び出しにまたがります。
jsonPayload.metadata.promptTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64) 通話の入力トークンの合計数(キャッシュに保存されたトークンを含む)。
jsonPayload.metadata.cachedContentTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64) プロンプト キャッシュから提供された promptTokenCount のサブセット。ゼロの場合は省略されます。promptTokenCount または totalTokenCount に追加しないでください。
jsonPayload.metadata.candidatesTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64) モデルによって生成された出力トークン。
jsonPayload.metadata.thoughtsTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64) 推論トークン(該当する場合)。Anthropic モデルでは省略されています。
jsonPayload.metadata.totalTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64) 通話の信頼できる合計。promptTokenCount + candidatesTokenCount(存在する場合は thoughtsTokenCount)と等しい。

ステップ 1: ログ エクスプローラで受信ログを確認する

SQL クエリを実行する前に、トークン メタデータを含む inference_response レコードがプロジェクトに届いていることを確認します。

  1. Google Cloud コンソールで、[ロギング] > [ログ エクスプローラ] を開きます。
  2. 次のクエリをクエリエディタに貼り付けます。[PROJECT_ID] は実際のプロジェクト ID に置き換えます。

    logName="projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response"
    labels.model_provider="Anthropic"
    
  3. [クエリを実行] をクリックします。

  4. [ログフィールド] ペインで [モデル] をクリックして、Anthropic モデル全体のリクエスト分布を表示します。このビューでは、トークンではなくリクエストがカウントされます。

ステップ 2: オブザーバビリティ分析でモデル別にトークンを合計する

  1. Google Cloud コンソールで、[ロギング] > [オブザーバビリティ分析] を開きます。
  2. [期間セレクタ] を [過去 30 日間] に設定します(期間セレクタは、SQL WHERE 句に加えてクエリ結果を制限します)。
  3. 次のクエリを貼り付けて実行します。[PROJECT_ID] は実際のプロジェクト ID に置き換えます。

    SELECT
      JSON_VALUE(labels.model) AS model,
      COUNT(*) AS requests,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64)) AS input_tokens,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64)) AS output_tokens,
      IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64)), 0) AS cached_tokens,
      IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64)), 0) AS thoughts_tokens,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
    FROM
      `[PROJECT_ID].global._Default._Default`
    WHERE
      log_id = "businessaicode.googleapis.com/inference_response"
      AND JSON_VALUE(labels.model_provider) = "Anthropic"
      AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
    GROUP BY
      model
    ORDER BY
      total_tokens DESC
    

ステップ 3: 一般的な SQL レシピ

[ロギング] > [オブザーバビリティ分析] で次の SQL クエリを使用して、1 日あたりのトークンの傾向とユーザーごとのトークンの属性を分析します。

モデル別のトークンの日別推移

SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  day, model
ORDER BY
  day DESC, total_tokens DESC

ユーザーごと、モデルごとのアトリビューション

SELECT
  JSON_VALUE(labels.user_id) AS user_id,
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND JSON_VALUE(labels.user_id) IS NOT NULL
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  user_id, model
ORDER BY
  total_tokens DESC

ステップ 4: Cloud Monitoring ダッシュボードに固定する

ダッシュボードには、履歴またはアドホック SQL の内訳が必要か、軽量の継続的指標が必要かに応じて、次の 2 つのオプションがあります。

アプローチ 最適な用途 30 日を超えて履歴を保持しますか? user_id グループ化をサポートしていますか?
オプション A: オブザーバビリティ分析から SQL グラフを保存する 指標の設定なしで、モデル別、日別、ユーザー別のテーブルとグラフ ログバケットの保持期間(デフォルトは 30 日)によって制限されます。 はい(基数の上限なし)
オプション B: ログベースの分布指標 継続的モニタリングの時系列とカーディナリティの低いラベルのアラート はい(Monitoring に保存) いいえ(カーディナリティが高いため、指標の割り当てが使い果たされる)

オプション A: オブザーバビリティ分析から直接保存する

  1. ステップ 2 のクエリまたは オブザーバビリティ分析のモデル別のトークンの日次推移クエリを実行します。
  2. 時系列グラフや棒グラフを表示する場合は、結果ペインを [表] から [グラフ] に切り替えます。
  3. 結果ペインのツールバーで、[ダッシュボードに保存] をクリックし、既存の Monitoring ダッシュボードを選択するか、新しいダッシュボードを作成します。

オプション B: ログベースの分布指標を作成する

  1. Google Cloud コンソールで、[ロギング] > [ログベースの指標] に移動し、[指標の作成] をクリックします。
  2. 指標タイプとして [分布] を選択します。
  3. ステップ 1 のクエリを [フィルタ] フィールドに貼り付け、[フィールド名] を jsonPayload.metadata.totalTokenCount に設定します。
  4. 次の 2 つのラベルを追加します。
    • model が labels.model にマッピングされました
    • model_provider が labels.model_provider にマッピングされました

次のステップ