您可以使用 Cloud Logging 和 Observability Analytics,在 AI 开发者工具中按模型、日期和用户计算第三方模型(例如 Anthropic Claude Opus 5.5 和 Anthropic Claude Sonnet 5.5)的令牌消耗量。
快速入门
如果项目的 _Default 日志存储桶已升级为支持 Observability Analytics,请在日志记录 > 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 开发者工具管理员控件必须启用元数据日志记录,以便
inference_response记录包含jsonPayload.metadata令牌块。 - 您至少拥有日志查看器角色 (
roles/logging.viewer)。标准roles/logging.viewer角色授予对本指南中使用的_Default._Default日志视图的 SQL 访问权限。查询_Default._AllLogs视图需要roles/logging.privateLogViewer或roles/logging.viewAccessor。 - 您的
_Default日志存储桶已升级为使用 Observability Analytics。- 在 Google Cloud 控制台中,依次前往 Logging > Logs Storage,找到
_Default存储桶,然后查看 Observability Analytics 列。 - 如果未启用,请依次点击 更多 > 升级以使用 Observability Analytics。升级会就地修改
_Default,并且无法撤消。 - 允许初始传播:升级存储桶后,Cloud Logging 需要 30 到 60 分钟来刷新新日志条目的路由缓存,还需要数小时来回填历史日志(回填会在升级完成后 1 小时开始)。
- 在 Google Cloud 控制台中,依次前往 Logging > Logs Storage,找到
日志记录的结构
每次推理调用都会向 businessaicode.googleapis.com%2Finference_response 日志发出一个 InferenceResponseLog 条目。模型身份记录在 labels 中,token 数量记录在 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) |
模型标识符(例如,claude-sonnet-5-5 表示 Anthropic Claude Sonnet 5.5,claude-opus-5-5 表示 Anthropic 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) |
通话的输入 token 总数(包括缓存的 token)。 |
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) |
模型生成的输出 token。 |
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"点击运行查询。
在日志字段窗格中,点击 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 配方
在日志记录 > Observability Analytics 中使用以下 SQL 查询,以分析每日令牌趋势和每个用户的令牌归因。
各模型的每日 token 趋势
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 图表 | 无需设置指标即可生成按模型、按天和按用户划分的表格和图表 | 受日志存储桶保留期限(默认 30 天)的限制 | 是(无基数上限) |
| 选项 B:基于对数的分布指标 | 持续监控时序和针对低基数标签的提醒 | 是(存储在 Monitoring 中) | 否(高基数会耗尽指标配额) |
方案 A:直接从 Observability Analytics 保存
- 在 Observability Analytics 中运行第 2 步中的查询或按模型划分的每日令牌使用趋势查询。
- 如果您想要直观的时序图或条形图,请将结果窗格从表格切换到图表。
- 在结果窗格工具栏中,点击保存到信息中心,然后选择现有的 Monitoring 信息中心或创建新的信息中心。
方案 B:创建基于日志的分布指标
- 在 Google Cloud 控制台中,依次前往 Logging > 基于日志的指标,然后点击创建指标。
- 选择分布作为指标类型。
- 将第 1 步中的查询粘贴到过滤条件字段中,并将字段名称设置为
jsonPayload.metadata.totalTokenCount。 - 添加两个标签:
model映射到labels.modelmodel_provider映射到labels.model_provider