您可以使用 Cloud Logging 和 Observability Analytics,依模型、日期和使用者,計算 AI 開發人員工具中第三方模型的詞元消耗量,例如 Anthropic Claude Opus 5.5 和 Anthropic Claude Sonnet 5.5。
快速入門導覽課程
如果專案的 _Default 記錄檔 bucket 已升級為 Observability Analytics,請在「Logging」>「Observability Analytics」中執行下列查詢 (將 [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
事前準備
執行教學課程步驟前,請確認專案符合下列規定:
- 中繼資料記錄功能已啟用。AI 開發人員工具管理員控制項必須啟用「Metadata logging」(中繼資料記錄),
inference_response記錄才會包含jsonPayload.metadata權杖區塊。 - 您至少具備記錄檢視器角色 (
roles/logging.viewer)。標準roles/logging.viewer角色會授予 SQL 存取權,可存取本指南中使用的_Default._Default記錄檢視表。如要查詢_Default._AllLogs檢視表,必須具備roles/logging.privateLogViewer或roles/logging.viewAccessor。 _Default記錄檔 bucket 已升級,可使用 Observability Analytics。- 在 Google Cloud 控制台中,依序前往「Logging」>「Logs Storage」,找到
_Defaultbucket,然後查看「Observability Analytics」欄。 - 如果尚未啟用,請依序點選 「More」(更多) >「Upgrade to use Observability Analytics」(升級以使用 Observability Analytics)。升級會直接修改
_Default,且無法復原。 - 允許初始傳播:升級 bucket 後,Cloud Logging 需要 30 到 60 分鐘才能重新整理新記錄項目的轉送快取,並需要數小時才能補充歷來記錄 (補充作業會在升級完成 1 小時後開始)。
- 在 Google Cloud 控制台中,依序前往「Logging」>「Logs Storage」,找到
記錄檔記錄的結構
每次推論呼叫都會向 businessaicode.googleapis.com%2Finference_response 記錄發出單一 InferenceResponseLog 項目。模型身分會記錄在 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 欄位 (Logs Explorer 和記錄指標) | SQL 運算式 (Observability Analytics) | 說明 |
|---|---|---|
labels.model |
JSON_VALUE(labels.model) |
模型 ID (例如 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。一個使用者回合通常會在單一 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:在 Logs Explorer 中驗證傳入的記錄
執行 SQL 查詢前,請確認含有權杖中繼資料的 inference_response 記錄已傳入專案:
- 在 Google Cloud 控制台中,依序開啟「Logging」>「Logs Explorer」。
將下列查詢貼到查詢編輯器中,並將
[PROJECT_ID]替換為您的專案 ID:logName="projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response" labels.model_provider="Anthropic"點選「執行查詢」。
在「Log fields」(記錄欄位) 窗格中,按一下「model」(模型),查看 Anthropic 模型的請求分布情形。這個檢視畫面會計算要求數,而非權杖數。
步驟 2:在 Observability Analytics 中依模型加總詞元
- 在 Google Cloud 控制台,依序開啟「Logging」>「Observability Analytics」。
- 將「日期範圍選取器」設為「過去 30 天」 (日期範圍選取器會限制查詢結果,以及 SQL
WHERE子句)。 貼上並執行下列查詢,將
[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 方案
在「Logging」>「Observability Analytics」中,使用下列 SQL 查詢分析每日權杖趨勢和每位使用者的權杖歸因。
各模型的每日詞元趨勢
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 細目,還是輕量級連續指標:
| 做法 | 適用情境 | 保留超過 30 天的記錄? | 是否支援user_id分組? |
|---|---|---|---|
| 方法 A:從 Observability Analytics 儲存 SQL 圖表 | 依模型、每日和每位使用者劃分的表格和圖表,不需設定指標 | 受限於記錄檔 bucket 保留期限 (預設為 30 天) | 是 (無基數限制) |
| 方法 B:記錄檔分布指標 | 持續監控時間序列,並針對低基數標籤發出快訊 | 是 (儲存在 Monitoring 中) | 否 (高基數會耗盡指標配額) |
方法 A:直接從 Observability Analytics 儲存
- 在 Observability Analytics 中,執行步驟 2 的查詢,或「Daily token trend by model」(各模型的每日權杖趨勢) 查詢。
- 如要查看視覺化的時間序列或長條圖,請將結果窗格從「Table」(表格) 切換為「Chart」(圖表)。
- 在結果窗格工具列中,按一下「Save to dashboard」(儲存至資訊主頁),然後選擇現有的 Monitoring 資訊主頁或建立新的資訊主頁。
做法 B:建立記錄檔分布指標
- 在 Google Cloud 控制台中,依序前往「Logging」>「Log-based metrics」(記錄指標),然後點選「Create metric」(建立指標)。
- 選取「Distribution」(分布) 做為指標類型。
- 將步驟 1 的查詢貼到「Filter」(篩選器) 欄位,並將「Field name」(欄位名稱) 設為
jsonPayload.metadata.totalTokenCount。 - 新增兩個標籤:
model對應到「labels.model」model_provider對應到「labels.model_provider」