记录推理请求元数据

Agent Platform 可以为项目处理的每个推理请求写入一个结构化日志条目。每个条目都会记录请求的相关元数据:模型、区域、词元计数(包括输入词元、输出词元、缓存词元、思考词元)、预配吞吐量消耗、端到端请求延迟时间、错误代码以及您附加的所有标头标签或请求标签。条目会进入 Cloud Logging,您可以在可观测性分析中使用 SQL 查询这些条目。如需开启日志记录,请参阅启用推理请求元数据日志。

推理请求日志记录仅记录元数据。它不会记录提示或回答。如果您需要提示和回答内容,请改用请求-回答日志记录。

本页面介绍了如何启用推理请求元数据日志、每个条目包含的内容以及如何查询这些日志。

使用场景

推理请求元数据日志可以回答汇总指标无法回答的问题:

  • 通过为每个请求附加您自己的标头标签、请求标签或同时附加这两者,将令牌支出归因于团队、应用或租户。
  • 查看哪些单个请求计入预配吞吐量配额,哪些请求按需提供。
  • 按标头标签或请求标签细分吞吐量、延迟时间和错误率。
  • 衡量每个请求的缓存行为,而不是汇总衡量。
  • 深入了解秒级用量,例如项目为何收到 429 错误,或预配吞吐量为何溢出。如需了解解决 429 错误的步骤,请参阅排查错误代码 429 问题。如需查找收到这些错误的秒数,请参阅按区域划分的错误率和延迟时间。

日志记录支持的 API 方法

以下各项支持推理请求元数据日志:

  • 使用 generateContent 或 streamGenerateContent 的 Gemini 模型,包括通过这些方法生成图片。
  • 使用 rawPredict 或 streamRawPredict 的 Claude 模型。其他合作伙伴模型不会记录。如需了解 Claude 字段名称,请参阅 Claude 模型的词元数。

支持预配吞吐量和所有随用随付选项。

不支持:

  • chatCompletions。
  • embedContent、predict和countTokens。通过 predict 生成图片的模型(例如 Imagen)不会被记录。
  • 对经过微调的模型(包括使用监督式微调进行调优的 Gemini 模型)的请求。
  • 调优作业、批量推理和任何其他长时间运行的操作。
  • 您自己在自定义容器中部署的模型。

启用推理请求元数据日志

您可以为整个项目或特定区域中的特定模型配置推理请求元数据日志。如果您需要在组织级层启用,请与您的客户支持团队联系。日志记录配置可能需要几分钟才能生效。

准备工作

  • 确保您对项目拥有以下 IAM 权限:aiplatform.endpoints.setPublisherModelConfig 和 aiplatform.endpoints.fetchPublisherModelConfig(用于更改和读取设置),以及 logging.buckets.get、logging.buckets.list、logging.buckets.update 和 logging.operations.get(用于升级日志存储桶)。如需了解包含这些权限的预定义角色,请参阅访问权限控制和 Logging 的访问权限控制。
  • 决定是否将 _Default 日志存储桶升级到 Observability Analytics。您需要升级才能使用 SQL 查询条目或在 Google Cloud 控制台中查看详细指标。升级过程需要几分钟时间,且无法撤销。升级前写入的条目在升级后无法使用 SQL 进行查询。
  • 查看 Cloud Logging 价格。条目会存储至存储桶的保留期限(默认为 30 天),并且会产生 Cloud Logging 提取和存储费用。如需估算费用,请参阅价格。

在控制台中启用

在控制台中启用日志记录功能后,系统会为项目中的每个模型(包括 Gemini 和 Claude)启用日志记录功能,涵盖预配吞吐量和日志支持的每个随用随付选项。如果 _Default 日志存储桶尚未升级,它还会升级该存储桶。它会设置配置优先级中介绍的项目级默认值。在开始之前,请检查权限和存储桶升级。

  1. 在 Google Cloud 控制台中,前往预配吞吐量页面。

    前往“预配吞吐量”

  2. 执行下列其中一项操作:

    • 在显示 Gemini Enterprise Agent Platform 正在升级可观测性的横幅中,点击启用。
    • 在工具栏中,点击指标设置。选择启用详细指标,然后点击保存。
    “预配吞吐量”页面上的可观测性升级横幅
    图 1. “预配吞吐量”页面上的可观测性升级横幅。
    “指标设置”面板,其中已选中“启用详细指标”
    图 2. “指标设置”面板,其中已选中“启用详细指标”。
  3. 在是否启用详细指标?对话框中,查看日志记录和存储桶升级详细信息,然后点击启用。

日志记录功能开启后,对话框会立即关闭。存储桶升级会在后台继续进行,可能需要几分钟时间。在升级过程中,横幅会显示“详细指标已启用,并且此项目的 _Default 日志存储桶正在升级到 Observability Analytics”。

如果横幅报告存储桶尚未升级,请点击升级以重试。如果报告显示存储桶无法升级,则无法查询每个请求的日志。点击指标设置,然后选择停用详细指标以停止收费。

配置优先级

Agent Platform 会按以下顺序解析每个请求的设置:

  1. 按模型和按区域设置(如果已设置)。
  2. 如果未设置每个模型的设置,则使用项目级默认设置。
  3. 如果二者都未设置,则日志记录功能处于关闭状态。

每个模型的设置优先于项目默认设置。您可以为整个项目启用日志记录,并为某个区域中的一个高容量模型关闭日志记录,反之亦然。

使用 REST API 启用

您可以使用 setPublisherModelConfig 方法配置推理请求元数据日志,并将 inferenceEventLoggingConfig.state 设置为 ENABLED。

如需设置项目级默认值,请指定项目:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID:setPublisherModelConfig" \
  -d '{
        "publisherModelConfig": {
          "inferenceEventLoggingConfig": {"state": "ENABLED"}
        },
        "updateMask": "inferenceEventLoggingConfig"
      }'

如需替换一个区域中的一个模型,请指定发布者模型:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/PUBLISHER/models/MODEL:setPublisherModelConfig" \
  -d '{
        "publisherModelConfig": {
          "inferenceEventLoggingConfig": {"state": "ENABLED"}
        },
        "updateMask": "inferenceEventLoggingConfig"
      }'

对于 Gemini 模型,请将 PUBLISHER 设置为 google;对于 Claude 模型,请将其设置为 anthropic。例如,如需为全局端点上的 Claude Sonnet 4.5 启用日志记录,请使用 publishers/anthropic/models/claude-sonnet-4-5,并将 LOCATION 设置为 global。如需了解 Claude 模型 ID,请参阅 Claude 模型。

该方法会返回一个长时间运行的操作。

获取日志记录配置

使用 fetchPublisherModelConfig 方法读取当前配置。使用项目读取项目级默认值,或使用发布者模型读取其替换值。

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID:fetchPublisherModelConfig"
curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/PUBLISHER/models/MODEL:fetchPublisherModelConfig"

响应包含对该资源设置的设置:

{
  "inferenceEventLoggingConfig": {
    "state": "ENABLED"
  }
}

验证日志记录是否正常运行

  1. 向您启用的模型发送一个请求。
  2. 在 Logs Explorer 中,运行以下查询。大多数条目会在 12 秒内显示;最多可能需要 5 分钟。

    logName="projects/PROJECT_ID/logs/aiplatform.googleapis.com%2Finference_request"
    
  3. 如需确认 SQL 是否正常运行,请打开 Observability Analytics 并运行任意示例查询。如果查询报告未找到数据集,则日志存储桶升级尚未完成。

Logs Explorer 中的 inference_request 条目,已展开到 jsonPayload
图 3. Logs Explorer 中的 inference_request 条目,已展开到 jsonPayload。

停用日志记录

在 Google Cloud 控制台中,前往预配吞吐量页面,点击指标设置,选择停用详细指标,然后点击保存。此操作会撤消在控制台中启用。

使用 REST API 时,请按以下步骤操作。

在启用日志记录功能的同一资源上,将 inferenceEventLoggingConfig.state 设置为 DISABLED,以停用日志记录功能。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID:setPublisherModelConfig" \
  -d '{
        "publisherModelConfig": {
          "inferenceEventLoggingConfig": {"state": "DISABLED"}
        },
        "updateMask": "inferenceEventLoggingConfig"
      }'

由于每个模型的设置优先于项目默认设置,因此在项目级层停用不会关闭明确启用的模型。同时清除或停用每个模型的设置。

日志的写入位置

条目会写入以下日志:

projects/PROJECT_NUMBER/logs/aiplatform.googleapis.com%2Finference_request

从这里,您可以选择标准的 Cloud Logging 目标位置:

  • Observability Analytics:在Google Cloud 控制台的 Observability Analytics 中使用 SQL 查询条目。
  • 关联的 BigQuery 数据集:关联数据集以从 BigQuery 读取相同的数据。如需了解详情,请参阅查询关联的 BigQuery 数据集。
  • 汇总接收器:使用单个接收器收集文件夹或组织下每个项目的条目。过滤条件:logName="projects/*/logs/aiplatform.googleapis.com%2Finference_request"。

如需从文件夹或组织中的每个项目收集条目,请参阅汇总接收器概览。

条目在请求完成后不久即可查询。大多数条目可在 12 秒内查询;最多允许 5 分钟。

日志条目架构

每个条目都有两个部分,您可以分别查询:受监控的资源及其标签(用于标识处理请求的内容)和 JSON 载荷(用于记录请求执行的操作)。以下部分介绍了这两种方法。

资源标签

对于共享发布商模型,受监控的资源类型为 aiplatform.googleapis.com/PublisherModel,具有以下标签。

标签 类型 备注
resource_container STRING 处理请求的项目。
location STRING 处理请求的区域,例如 us-central1。发送到全球端点的请求会报告 global。
publisher STRING 模型发布者,例如 google 或 anthropic。
model_user_id STRING 模型,例如 gemini-2.5-pro。

载荷字段

字段名称 类型 备注
method ENUM GENERATE_CONTENT、STREAM_GENERATE_CONTENT、RAW_PREDICT 或 STREAM_RAW_PREDICT。
trafficType ENUM 处理请求的使用选项。当前值为 PROVISIONED_THROUGHPUT、ON_DEMAND、ON_DEMAND_FLEX 和 ON_DEMAND_PRIORITY。在失败的请求中不存在。
requestStartTime TIMESTAMP 提供服务的前端接受请求的时间。
requestDuration STRING 端到端服务延迟时间,格式为时长字符串,例如 3.53s。
generateContentDetails.usageMetadata JSON generateContent 和 streamGenerateContent 的 token 计数,包括按模态细分的计数。图片输出会在此处显示为 candidatesTokensDetails 中的 IMAGE 条目。
rawPredictDetails.usageMetadata JSON rawPredict 和 streamRawPredict 的 token 数量,包括合作伙伴模型。
provisionedThroughput JSON 针对预配吞吐量流量显示。
httpHeaders JSON 捕获的请求标头。
error JSON 仅当严重级别为 ERROR 时才会显示。
principal JSON 发出请求的服务账号(如果有)。

LogEntry.labels 字段包含 gen_ai.operation.name,该字段遵循 OpenTelemetry 生成式 AI 语义惯例。generateContent 和 streamGenerateContent 都会报告 generate_content。rawPredict 和 streamRawPredict 均报告 raw_predict。

预配吞吐量字段

字段名称 类型 备注
ptChargedInputTokenCount INT64 应用消耗率后,计入预配吞吐量配额的输入 token。
ptChargedOutputTokenCount INT64 应用消耗率后,计入预配吞吐量配额的输出 token。
accountingResource STRING 请求所使用的预配吞吐量承诺所属的项目。

识别溢出请求

当请求符合预配吞吐量条件,但由于吞吐量已用尽而按需传送时,该请求会溢出。溢出条目的 trafficType 为 ON_DEMAND,且没有 provisionedThroughput 对象。普通的随用随付请求看起来相同,因此请使用以下规则来区分它们:

  • 如果您发送了值为 shared 的 X-Vertex-AI-LLM-Request-Type,则表示您有意将请求路由到随用随付。这不是溢出。
  • 如果您未发送 X-Vertex-AI-LLM-Request-Type 标头,或发送了 dedicated 或 shared 以外的值,并且条目报告 ON_DEMAND,则请求会溢出,前提是您在该区域中为该模型预配了吞吐量。
  • 如果您没有模型的预配吞吐量,则每个 ON_DEMAND 条目都是普通的随用随付。

如需了解标头值,请参阅使用预配吞吐量。

如需了解用于统计溢出请求数的查询,请参阅每分钟溢出数。

识别降级请求

如果您请求了某个随用随付选项,但系统却使用了另一个选项,则请求会被降级。将您发送的 X-Vertex-AI-LLM-Shared-Request-Type 标头与处理请求的 trafficType 进行比较:

您发送的标头值 trafficType(按请求投放时)
priority ON_DEMAND_PRIORITY
flex ON_DEMAND_FLEX

成功条目中的任何其他 trafficType 都意味着请求已降级,或者模型不提供您要求的选项。如需查看查询,请参阅按模型降级。

错误代码

失败的请求会以 ERROR 严重级别写入,并带有包含 gRPC 状态代码和规范原因的 error 对象。原因为固定字符串。它绝不会包含提示文本、回答文本或您的标头值。

代码 状态 典型 HTTP 状态
8 资源已用尽,例如配额限制。 429
4 在操作完成之前截止期限已过。 504
14 服务不可用。 503
13 遇到内部错误。 500
3 请求中包含无效的参数。 400
7 调用方无权限。 403
5 未找到请求的实体。 404

附加自定义标头标签

如需将用量归因于您自己的维度(例如团队、应用或租户),请发送带有前缀 x-goog-agent-platform-observability-label- 的请求标头:

x-goog-agent-platform-observability-label-team: payments
x-goog-agent-platform-observability-label-application: invoice-ocr

每个标头都会显示在 jsonPayload.httpHeaders 下的条目中。标头标签适用于采用 generateContent 和 streamGenerateContent 的 Gemini 模型,以及采用 rawPredict 和 streamRawPredict 的 Claude 模型,适用于预配吞吐量和每个随用随付选项。

如需查看带有标头标签的 API 调用示例、它们生成的日志条目、支持的模型、限制以及标头标签与请求标签的比较,请参阅自定义元数据标签。如需查询这些数据,请参阅按自定义标头标签查询用量。

使用 Logs Explorer 查询日志

使用 Logs Explorer 查找和检查各个推理请求。除了启用日志记录之外,它不需要进行任何设置,并且会直接读取日志,因此条目一到达就会显示。

在 Google Cloud 控制台中,前往 Logs Explorer 页面,然后使用 Logging 查询语言在查询编辑器字段中输入查询。如需详细了解这些窗格和控件,请参阅 Logs Explorer 界面。

从日志名称开始,该名称会选择项目中的每个推理请求条目:

logName="projects/PROJECT_ID/logs/aiplatform.googleapis.com%2Finference_request"

添加字词可缩小结果范围。不同行中的字词会通过 AND 组合在一起。

  • 如需选择从一个区域传送的请求,请添加 resource.labels.location="us-central1"。
  • 如需选择一种 API 方法,请添加 jsonPayload.method="GENERATE_CONTENT"。
  • 如需仅选择预配吞吐量流量,请添加 jsonPayload.trafficType="PROVISIONED_THROUGHPUT"。
  • 如需仅选择配额错误,请添加 severity=ERROR 和 jsonPayload.error.code=8。
  • 如需选择一个自定义标头标签值,请添加 jsonPayload.httpHeaders."x-goog-agent-platform-observability-label-team".values="payments"。

Logs Explorer 会过滤并显示条目。它不会汇总这些数据。如需对条目进行计数、分组或绘制图表,请使用 Observability Analytics。在查询结果工具栏中,点击分析结果以沿用当前查询。只有在日志存储桶升级后,该按钮才会显示。

使用 Observability Analytics 查询和分析日志

您可以使用 Observability Analytics 查询和分析日志。

准备工作

Observability Analytics 可以回答 Logs Explorer 无法回答的问题。Logs Explorer 会查找并显示各个条目,这正是您在跟踪单个请求时所需要的。Observability Analytics 会对整个数据集运行 SQL,因此可以进行计数、分组、联接和计算百分位数。本部分中的每个问题都需要汇总:每个团队的支出、每个项目的燃尽图以及每个区域的 p95 延迟时间都无法通过一次一个条目来回答。

这需要将项目中的 _Default 日志存储桶升级为使用 Observability Analytics。如需了解详情,请参阅配置日志存储桶。

以下示例在 Observability Analytics 中运行。将 PROJECT_ID 替换为您的项目。

按区域和模型列出的吞吐量

SELECT
  JSON_VALUE(resource.labels.location)      AS region,
  JSON_VALUE(resource.labels.model_user_id) AS model,
  JSON_VALUE(json_payload.trafficType)      AS traffic_type,
  COUNT(*)                                  AS requests,
  SUM(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.promptTokenCount) AS INT64))     AS input_tokens,
  SUM(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.candidatesTokenCount) AS INT64)) AS output_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY region, model, traffic_type
ORDER BY requests DESC

预配吞吐量消耗情况(按项目)

SELECT
  JSON_VALUE(resource.labels.location) AS region,
  JSON_VALUE(json_payload.provisionedThroughput.accountingResource) AS pt_project,
  COUNTIF(JSON_VALUE(json_payload.trafficType) = "PROVISIONED_THROUGHPUT") AS pt_requests,
  COUNTIF(JSON_VALUE(json_payload.trafficType) = "ON_DEMAND")              AS on_demand_requests,
  SUM(CAST(JSON_VALUE(json_payload.provisionedThroughput.ptChargedInputTokenCount)  AS INT64)) AS pt_input_tokens,
  SUM(CAST(JSON_VALUE(json_payload.provisionedThroughput.ptChargedOutputTokenCount) AS INT64)) AS pt_output_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY region, pt_project
ORDER BY pt_input_tokens DESC

按自定义标头标签显示的使用情况

SELECT
  JSON_VALUE(json_payload.httpHeaders
    ["x-goog-agent-platform-observability-label-team"].values[0]) AS team,
  COUNT(*) AS requests,
  SUM(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.totalTokenCount) AS INT64)) AS total_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY team
ORDER BY total_tokens DESC

Gemini 和 Claude 每分钟消耗的 token 数对比

此查询会按发布商在单独的列中报告每分钟消耗的 token 数量。每列对令牌类型的加权方式与 publisher/online_serving/consumed_token_throughput 指标对该发布商的加权方式相同,因此每列都与 Cloud Monitoring 匹配。Gemini 和 Claude 对输出和缓存词元的权重不同,因此请勿将这两列相加。如需了解 Claude 字段,请参阅 Claude 模型的词元数。

SELECT
  TIMESTAMP_TRUNC(timestamp, MINUTE) AS minute_ts,
  SUM(IF(JSON_VALUE(resource.labels.publisher) = "google",
    IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.promptTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.toolUsePromptTokenCount) AS INT64), 0)
      - 0.9 * IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.cachedContentTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.candidatesTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.thoughtsTokenCount) AS INT64), 0), 0)) AS gemini_consumed_tokens,
  SUM(IF(JSON_VALUE(resource.labels.publisher) = "anthropic",
    IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.input_tokens) AS INT64), 0)
      + 0.1  * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_read_input_tokens) AS INT64), 0)
      + 1.25 * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_creation_input_tokens) AS INT64), 0)
      + 0.75 * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_creation.ephemeral_1h_input_tokens) AS INT64), 0)
      + 5    * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.output_tokens) AS INT64), 0), 0)) AS claude_consumed_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY minute_ts
ORDER BY minute_ts DESC

Gemini 和 Claude 的缓存命中率

缓存命中率是指缓存的输入 token 数除以输入 token 总数。Gemini 输入包含工具使用 token,因为缓存可以涵盖这些 token。Claude 输入是未缓存输入、缓存读取和缓存写入的总和。如需了解每个发布商如何缓存,请参阅上下文缓存概览和 Claude 提示缓存。

SELECT
  JSON_VALUE(resource.labels.model_user_id) AS model,
  JSON_VALUE(json_payload.trafficType)      AS traffic_type,
  ROUND(100 * SAFE_DIVIDE(
    SUM(IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.cachedContentTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_read_input_tokens) AS INT64), 0)),
    SUM(GREATEST(
          IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.promptTokenCount) AS INT64), 0)
          + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.toolUsePromptTokenCount) AS INT64), 0),
          IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.cachedContentTokenCount) AS INT64), 0))
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.input_tokens) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_read_input_tokens) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_creation_input_tokens) AS INT64), 0))), 1) AS cache_hit_rate_pct
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND JSON_VALUE(json_payload.trafficType) IS NOT NULL
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY model, traffic_type
ORDER BY model, traffic_type

降级(按型号)

此查询会将每个请求要求的随用随付选项与实际提供服务的选项进行比较。如需了解如何识别降级,请参阅识别降级请求。

WITH entries AS (
  SELECT
    JSON_VALUE(resource.labels.model_user_id) AS model,
    severity,
    JSON_VALUE(json_payload.trafficType)      AS served,
    (SELECT LOWER(v)
     FROM UNNEST(JSON_VALUE_ARRAY(json_payload.httpHeaders["x-vertex-ai-llm-shared-request-type"].values)) AS v
     WHERE LOWER(v) IN ("priority", "flex")
     LIMIT 1)                                 AS requested
  FROM `PROJECT_ID.global._Default._Default`
  WHERE log_id = "aiplatform.googleapis.com/inference_request"
    AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
)
SELECT
  model,
  requested,
  COUNTIF(served = CONCAT("ON_DEMAND_", UPPER(requested))) AS served_as_requested,
  COUNTIF(served IS NOT NULL
          AND served != CONCAT("ON_DEMAND_", UPPER(requested))) AS downgraded,
  COUNTIF(severity = "ERROR")                              AS failed
FROM entries
WHERE requested IS NOT NULL
GROUP BY model, requested
ORDER BY downgraded DESC

按分钟显示的溢出量

此查询会统计在相应时间段内具有预配吞吐量流量的每个模型每分钟的溢出请求数。如需了解如何识别溢出,请参阅识别溢出请求。

WITH entries AS (
  SELECT
    timestamp,
    JSON_VALUE(resource.labels.location)      AS region,
    JSON_VALUE(resource.labels.model_user_id) AS model,
    JSON_VALUE(json_payload.trafficType)      AS traffic_type,
    EXISTS(
      SELECT 1
      FROM UNNEST(JSON_VALUE_ARRAY(json_payload.httpHeaders["x-vertex-ai-llm-request-type"].values)) AS v
      WHERE LOWER(v) IN ("dedicated", "shared")) AS routed_by_header
  FROM `PROJECT_ID.global._Default._Default`
  WHERE log_id = "aiplatform.googleapis.com/inference_request"
    AND severity = "INFO"
    AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
),
pt_models AS (
  SELECT DISTINCT region, model FROM entries WHERE traffic_type = "PROVISIONED_THROUGHPUT"
)
SELECT
  TIMESTAMP_TRUNC(e.timestamp, MINUTE) AS minute_ts,
  e.region,
  e.model,
  COUNTIF(e.traffic_type = "PROVISIONED_THROUGHPUT")              AS pt_requests,
  COUNTIF(e.traffic_type = "ON_DEMAND" AND NOT e.routed_by_header) AS spillover_requests
FROM entries AS e
JOIN pt_models USING (region, model)
GROUP BY minute_ts, e.region, e.model
HAVING spillover_requests > 0
ORDER BY minute_ts DESC

错误率和延迟时间(按区域)

SELECT
  JSON_VALUE(resource.labels.location) AS region,
  TIMESTAMP_TRUNC(timestamp, MINUTE)   AS minute_ts,
  COUNT(*)                             AS total,
  COUNTIF(severity = "ERROR")          AS errors,
  COUNTIF(CAST(JSON_VALUE(json_payload.error.code) AS INT64) = 8) AS resource_exhausted,
  APPROX_QUANTILES(
    CAST(REGEXP_REPLACE(JSON_VALUE(json_payload.requestDuration), r"s$", "") AS FLOAT64),
    100)[OFFSET(95)] AS p95_latency_seconds
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
GROUP BY region, minute_ts
ORDER BY minute_ts DESC

Claude 模型的 token 数量

Claude 模型会使用 Claude API 字段名称在 rawPredictDetails.usageMetadata 下报告用量。rawPredict 和 streamRawPredict 都会写入相同的字段;对于流式传输,日志会合并流中报告的用量。

字段 统计内容
input_tokens 未从缓存中读取或未写入缓存的输入 token。
cache_read_input_tokens 从提示缓存中读取的输入 token。
cache_creation_input_tokens 写入提示缓存的输入 token 数(两个 TTL 的总和)。
cache_creation.ephemeral_5m_input_tokens 缓存写入(TTL 为 5 分钟)。
cache_creation.ephemeral_1h_input_tokens 缓存写入,TTL 为 1 小时。
output_tokens 输出 token,包括扩展思考。请勿单独添加思考 Token。

Claude 输入总计为 input_tokens + cache_read_input_tokens + cache_creation_input_tokens。Gemini 则不同:promptTokenCount 已包含缓存的 token。

Claude 条目不包含模态细分。标头标签在 Gemini 和 Claude 中的运作方式相同;请参阅附加自定义标头标签。

价格

推理请求元数据日志记录会写入 Cloud Logging,并作为 Cloud Logging 提取和存储进行结算。通过 Observability Analytics 进行查询会计入 Cloud Monitoring 用量。关联 BigQuery 数据集不会增加 BigQuery 存储费用。

条目大小取决于您的请求,例如请求携带的标头标签数量。如需估算费用,请为代表性工作负载启用一天的日志记录,使用日志量分析测量注入量,然后在 Google Cloud 价格计算器中预测每月用量。

后续步骤