跟踪第三方模型 token 用量

您可以使用 Cloud Logging 和Observability Analytics,按模型、日期和用户计算 AI 开发者工具中第三方模型(例如 Anthropic Claude Opus 5.5 和 Anthropic Claude Sonnet 5.5)的 token 消耗量。

快速入门

如果项目的 _Default 日志存储桶已升级为 Observability Analytics,请在日志记录 > Observability Analytics 中运行以下查询(将 [PROJECT_ID] 替换为您的 Google Cloud 项目 ID),以获取第三方 Anthropic 模型 30 天内的 token 用量:

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。
    1. 在 Google Cloud 控制台中,前往 Logging > 日志存储,找到 _Default 存储桶,然后查看Observability Analytics列。
    2. 如果尚未启用,请依次点击 更多 > 升级以使用 Observability Analytics。升级会就地修改 _Default,且无法撤消。
    3. 留出初始传播时间:升级存储桶后,Cloud Logging 需要 30 到 60 分钟来刷新新日志条目的路由缓存,并需要几个小时来回填历史日志(回填在升级完成后 1 小时开始)。

日志记录的结构

每个推理调用都会向 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) 模型标识符(例如,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) 调用的输入 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) 推理 token(如果适用)。对于 Anthropic 模型,此参数会被忽略。
jsonPayload.metadata.totalTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64) 通话的权威总数。等于 promptTokenCount + candidatesTokenCount(如果存在,则 + thoughtsTokenCount)。

第 1 步:在 Logs Explorer 中验证传入日志

在运行 SQL 查询之前,请确认包含令牌元数据的 inference_response 记录已到达您的项目:

  1. 在 Google Cloud 控制台中,打开 Logging > Logs Explorer。
  2. 将以下查询粘贴到查询编辑器中,并将 [PROJECT_ID] 替换为您的项目 ID:

    logName="projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response"
    labels.model_provider="Anthropic"
    
  3. 点击运行查询。

  4. 在日志字段窗格中,点击模型,查看 Anthropic 模型之间的请求分布。此视图统计的是请求数,而不是 token 数。

第 2 步:在 Observability Analytics 中按模型对 token 求和

  1. 在 Google Cloud 控制台中,依次打开 Logging > Observability Analytics。
  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 配方

在 Logging > Observability Analytics 中使用以下 SQL 查询,分析每日 token 趋势和每个用户的 token 归因。

每日 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 保存

  1. 在 Observability Analytics 中运行第 2 步中的查询或按模型划分的每日 token 趋势查询。
  2. 如果您想要直观的时序或条形图,请将结果窗格从表格切换到图表。
  3. 在结果窗格工具栏中,点击保存到信息中心,然后选择现有 Monitoring 信息中心或创建新信息中心。

方案 B:创建基于日志的分布指标

  1. 在 Google Cloud 控制台中,前往 Logging > 基于日志的指标,然后点击创建指标。
  2. 选择分布作为指标类型。
  3. 将第 1 步中的查询粘贴到过滤条件字段中,并将字段名称设置为 jsonPayload.metadata.totalTokenCount。
  4. 添加两个标签:
    • model 已映射到 labels.model
    • model_provider 已映射到 labels.model_provider

后续步骤