跟踪第三方模型 token 用量

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

日志记录的结构

每次推理调用都会向 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 记录是否已到达您的项目:

  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. 在日志字段窗格中,点击 model 以查看 Anthropic 模型的请求分布情况。此视图统计的是请求数,而不是令牌数。

第 2 步:在 Observability Analytics 中按模型汇总令牌

  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 配方

在日志记录 > 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 保存

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

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

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

后续步骤