排查将存储桶升级为使用 Observability Analytics 时遇到的问题

将日志存储桶升级为使用 Observability Analytics 后,您可以运行 SQL 查询来分析存储在该存储桶中的日志数据。如果日志存储桶升级失败或停滞,您可以使用本文档诊断和解决同步验证错误、异步预配错误和被阻止的操作。如需了解如何升级日志存储桶,请参阅升级存储桶以使用 Observability Analytics。

升级流程简介

当您发出命令以升级日志存储桶以使用 Observability Analytics 时,Cloud Logging 会使用两步流程:

  1. 同步验证:Logging 会验证命令参数。如果验证失败,该命令会立即返回错误。
  2. 异步预配:如果验证成功,Logging 会启动一项长时间运行的操作,该操作通常会在 10 分钟内完成。

日志存储桶升级属于审核操作。如需检查长时间运行的操作的状态或查找错误详细信息,您可以使用 Operations.GetOperation 方法轮询操作,也可以查询审核日志。

升级期间的日志存储桶状态

当升级请求的同步验证成功时,Logging 会将日志存储桶的状态从 ACTIVE 更改为 UPDATING,并启动长时间运行的操作。操作完成后,日志存储桶的状态会恢复为 ACTIVE。

您可以通过运行 gcloud logging buckets describe 命令来确定日志存储桶的当前状态:

gcloud logging buckets describe LOG_BUCKET_ID \
  --location=LOCATION_ID \
  --project=PROJECT_ID

在运行命令之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID。
  • LOCATION_ID:存储桶的位置。
  • LOG_BUCKET_ID:存储桶的 ID。

响应中的 lifecycleState 字段会显示存储桶的状态:

description: Default bucket
lifecycleState: ACTIVE
name: projects/PROJECT_ID/locations/LOCATION_ID/buckets/LOG_BUCKET_ID
retentionDays: 30

在 Google Cloud 控制台中,当日志存储桶处于 UPDATING 状态时:

  • 在日志存储页面上,当长时间运行的操作处于活跃状态时,可使用可观测性分析列会显示正在升级…(如果控制台无法检索操作状态,则会显示不符合升级条件)。
  • 在修改存储桶面板和升级日志存储桶面板中,升级存储桶的选项处于停用状态,并且提示中列出了没有待处理的更新作为未满足的要求。

VPC Service Controls 边界注意事项

由于 API 被边界屏蔽或由于跨项目配置,VPC Service Controls 边界内的日志存储桶升级可能会失败。

边界必须允许的 API

如需升级 VPC Service Controls 边界内的日志存储桶,该边界不得限制以下服务:

  • logging.googleapis.com
  • cloudkms.googleapis.com:升级使用客户管理的加密密钥 (CMEK) 的日志存储桶时需要。

限制这些服务会导致以下行为:

  • logging.googleapis.com 受限:升级命令会立即失败并显示 PERMISSION_DENIED 错误,并且您的日志存储桶仍处于 ACTIVE 状态。

    解决方法:更新边界以允许本部分开头列出的 API,然后重试该命令。

  • cloudkms.googleapis.com 受限:对于受 CMEK 保护的日志存储桶,长时间运行的操作会失败并显示 INTERNAL 错误,并且您的日志存储桶会返回到 ACTIVE 状态。

    解决方法:更新边界以允许本部分开头列出的 API,然后重试该命令。

跨边界 CMEK 配置

当日志存储桶和 Cloud KMS 密钥位于不同的 VPC Service Controls 边界时,您无法使用基于身份的入站流量或出站流量规则向 Cloud Key Management Service 密钥授予跨边界访问权限。

对于此配置,如果入站流量规则仅指定 Logging 服务账号身份,则会发生以下情况:

  • 异步预配失败,并显示 INTERNAL 错误,您的日志存储桶会返回到 ACTIVE 状态。
  • Cloud KMS 项目的政策审核日志会记录该失败。此审核日志显示 google.cloud.kms.v1.KeyManagementService.Encrypt 方法失败,并出现 NO_MATCHING_ACCESS_LEVEL 入站流量违规,并指明该方法适用于 BigQuery 加密服务账号。

解决方法:在允许访问 Cloud KMS 边界的入站流量规则中,将 identityType 设置为 ANY_IDENTITY,并将包含日志存储桶的项目指定为来源资源:

- ingressFrom:
    identityType: ANY_IDENTITY
    sources:
    - resource: projects/PROJECT_NUMBER
  ingressTo:
    operations:
    - serviceName: cloudkms.googleapis.com
      methodSelectors:
      - method: '*'
    resources:
    - projects/KMS_PROJECT_NUMBER

在上面的示例中,替换以下内容:

  • PROJECT_NUMBER:包含日志存储桶的项目的编号。
  • KMS_PROJECT_NUMBER:包含 Cloud KMS 密钥的项目的项目编号。

如果您还指定了出站流量规则,则该规则也必须设置 identityType: ANY_IDENTITY。

查询审核日志以获取失败信息

本部分中的查询可帮助您查找在更新或升级日志存储桶时报告失败的日志条目。这些查询适用于 Logs Explorer。

在 Google Cloud 控制台中,前往 Logs Explorer 页面:

前往 Logs Explorer

如果您使用搜索栏查找此页面,请选择子标题为 Logging 的结果。

查询项目中所有失败的存储桶更新或升级

log_id("cloudaudit.googleapis.com/activity")
protoPayload.serviceName="logging.googleapis.com"
(protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucket" OR
 protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucketAsync")
severity=ERROR

如果您使用 Google Cloud 控制台将日志存储桶升级为使用 Observability Analytics 并创建关联的 BigQuery 数据集,请使用以下查询:

log_id("cloudaudit.googleapis.com/activity")
(protoPayload.serviceName="logging.googleapis.com" OR
 protoPayload.serviceName="bigquery.googleapis.com")
(protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucket" OR
 protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucketAsync" OR
 protoPayload.methodName="google.cloud.bigquery.v2.DatasetService.InsertDataset")
severity=ERROR

上一个查询的结果包含表明关联的 BigQuery 数据集创建失败的日志条目。出错提示可以帮助您解决失败的原因。

查询特定存储桶的失败存储桶更新或升级

在使用以下查询之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID。
  • LOCATION_ID:存储桶的位置。
  • LOG_BUCKET_ID:存储桶的 ID。
log_id("cloudaudit.googleapis.com/activity")
protoPayload.serviceName="logging.googleapis.com"
(protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucket" OR
 protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucketAsync")
protoPayload.resourceName="projects/PROJECT_ID/locations/LOCATION_ID/buckets/LOG_BUCKET_ID"
severity=ERROR

查询长时间运行的操作失败

log_id("cloudaudit.googleapis.com/activity")
protoPayload.serviceName="logging.googleapis.com"
protoPayload.methodName="google.logging.v2.ConfigServiceV2.UpdateBucketAsync"
operation.last=true
severity=ERROR

INVALID_ARGUMENT (3)

INVALID_ARGUMENT (3) 错误代码提供的出错提示包含足够的信息,可帮助您解决故障。因此,本部分并未列举所有可能的出错提示。

资源名称问题

如需解决资源名称问题,请传递格式为 projects/PROJECT_ID/locations/LOCATION_ID/buckets/LOG_BUCKET_ID 的有效存储桶资源名称。

请确保资源名称的长度在长度限制范围内。

更新掩码问题

包含文本 update_mask 或 Update mask 的出错提示表示值缺失或格式不正确。

如需解决此问题,请在 API 命令中指定 update_mask 并将值设置为 "analytics_enabled"。

日志存储桶资格条件问题

  • 您无法升级锁定的 _Default 日志存储桶或锁定的自定义存储桶。您可以在 _Required 存储桶锁定时对其进行升级。

    如果日志存储桶已锁定,则出错提示为 "Bucket is not eligible for an upgrade to enable analytics"。

    如需解决此失败问题,请创建一个新的已启用分析功能的存储桶,并将日志路由到该存储桶。

  • 您无法在对日志存储桶进行其他更改的同时升级该存储桶。例如,您无法升级日志存储桶并更新存储桶的说明。

    如需解决此失败问题,请发送单独的 UpdateBucket 或 UpdateBucketAsync 请求,其中仅包含 update_mask 中的 analytics_enabled,并在单独的请求中更新其他日志存储桶字段。

  • 您无法升级组织、文件夹或结算账号中的日志存储桶。您只能升级父级为 Google Cloud 项目的日志存储桶。

  • 您无法升级已升级或正在升级的日志存储桶。

    使用 GetBucket 或 ListOperations 确定升级是否已完成或正在进行中。

Cloud KMS 密钥问题

错误消息:

  • "Not a valid key reference (wrong type): 'KMS_KEY_NAME'"
  • "Name "KMS_KEY_NAME" is missing the COMPONENT component. Expected the form projects/[PROJECT_ID]/locations/[ID]/keyRings/[ID]/cryptoKeys/[ID]"

解决方法:在升级存储桶之前,将日志存储桶的 cmek_settings.kms_key_name 更新为有效的 Cloud KMS CryptoKey 资源名称。您必须更新资源名称,而不是密钥版本 CryptoKeyVersion。

参数无效消息

如果您看到消息 "Request contains an invalid argument.",请针对启用了 CMEK 的日志存储桶尝试以下操作:

  • 确保与存储桶的 CMEK 配置关联的 Logging 服务账号已初始化。
  • 确保存储桶具有正保留期限。

如需查找服务账号的名称,请在更新日志存储桶、位置和项目 ID 后运行以下命令:

gcloud logging buckets describe LOG_BUCKET_ID --location=LOCATION_ID --project=PROJECT_ID

服务账号可能位于项目、文件夹或组织中。

DEADLINE_EXCEEDED (4)

使用 UpdateBucketAsync 并通过 Operations.GetOperation 方法轮询返回的长时间运行的操作,或在后台升级完成后调用 GetBucket。

NOT_FOUND (5)

如需解决这些故障,请尝试以下操作:

  • 验证项目 ID 或项目编号是否正确,以及项目是否处于活跃状态。如果项目处于待删除状态,请先恢复项目。
  • 确保 Logging 支持指定的位置。
  • 验证项目中是否存在日志存储桶 ID 和位置,以及目标存储桶是否不是 _CloudTrace。

PERMISSION_DENIED (7)

“权限遭拒”错误表示不允许执行所请求的操作。

缺少用户权限

如需升级日志存储桶,请确保调用方具有包含 logging.buckets.update 权限(例如 roles/logging.configWriter 或 roles/logging.admin)的 Identity and Access Management (IAM) 角色,并验证没有自定义组织政策会阻止更新。

组织政策限制

如需解决出错提示 "Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: [ID]",请确保 VPC Service Controls 边界不限制 logging.googleapis.com 服务。如需了解详情,请参阅 VPC Service Controls 边界注意事项。

区域端点问题

如需解决指定区域端点时出现的权限遭拒错误,请将请求发送到全球端点 (logging.googleapis.com) 或与日志存储桶位置匹配的区域端点。

RESOURCE_EXHAUSTED (8)

如需解决此故障,请等待正在进行的预配操作完成,然后使用指数退避算法重试。

FAILED_PRECONDITION (9)

如需解决这些故障,请尝试以下操作:

  • 验证日志存储桶是否处于 ACTIVE 状态。您无法升级正在删除、正在更新或正在预配的日志存储桶。

    如需了解如何确定日志存储桶的状态,请参阅升级期间的日志存储桶状态。

  • 您无法升级已锁定的日志存储桶。

  • 通用消息 "Precondition check failed." 表示存储桶状态不是 ACTIVE。请等待正在进行的操作完成,然后重试升级。

INTERNAL (13)

错误消息:

  • 长时间运行的操作 (Operations.GetOperation): "Failed to create analytics enabled bucket."
  • Cloud Audit Logs 和同步 UpdateBucket:"Internal error encountered."

解决方法:尝试以下方法:

  • 对于启用了 CMEK 的日志存储桶,请验证 Cloud KMS 密钥是否已启用、与存储桶的 CMEK 配置关联的 Logging 服务账号是否具有该密钥的 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色、BigQuery 是否可以访问该密钥,以及是否有任何组织政策或 VPC Service Controls 边界阻止了 Cloud KMS 访问。

    如需查找服务账号的名称,请运行以下命令:

    gcloud logging buckets describe LOG_BUCKET_ID --location=LOCATION_ID --project=PROJECT_ID
    

    服务账号可能位于项目、文件夹或组织中。

  • 检查存储桶 (logging.views.list) 上的现有日志视图,确保其过滤条件有效,然后重试存储桶升级。

  • 确保日志存储桶未被删除 (DELETE_REQUESTED),并且存储桶上没有发生冲突的管理操作,然后重试升级。

  • 在暂时性 BigQuery 存储数据集或搜索索引创建错误解决后,或者在下游 BigQuery、Cloud KMS 或预配服务可用性恢复后,重试日志存储桶升级。如果故障仍然存在,请与 Cloud Customer Care 团队联系。

UNAVAILABLE (14)

如果您看到消息 "The service is currently unavailable.",请使用指数退避算法重试 UpdateBucketAsync 请求。