使用平台日志排查 Cloud Storage 导入主题的问题

本指南介绍了在使用 Cloud Storage 导入主题来注入数据时,如何使用 Google Cloud 平台日志来排查问题。

Cloud Storage 导入主题中的提取失败简介

Cloud Storage 导入主题可能会遇到导致数据无法成功提取的问题。例如,使用 Cloud Storage 导入主题时,您可能会遇到提取 Cloud Storage 对象或对象的一部分的问题。

以下列表介绍了生成平台日志的 Cloud Storage 导入主题中提取失败的原因:

  • 邮件大小

    • 单个邮件的大小不得超过 10 MB。如果存在,系统会跳过整个消息。

    • 如果您使用的是 Avro 或 Pub/Sub Avro 格式,消息块的大小不得超过 16 MB。系统会跳过较大的邮件块。

  • 消息特性

    • 消息最多可以包含 100 个属性。在提取消息时,系统会丢弃任何额外的属性。

    • 属性键不能大于 256 个字节,值不能大于 1024 个字节。在提取消息时,系统会从消息中移除较大的键或值。

      如需详细了解使用消息键和属性的指南,请参阅使用属性发布消息

  • Avro 格式设置

    • 确保您的 Avro 对象格式正确无误。格式不正确会导致消息无法提取。
  • 数据格式

平台日志简介

受支持的 Google Cloud 服务会生成自己的一组平台日志,捕获与该服务运行相关的事件和活动。这些平台日志包含有关服务中发生的情况的详细信息,包括成功的操作、错误、警告和其他值得注意的事件。

平台日志是 Cloud Logging 的一部分,具有相同的功能。例如,以下是平台日志的重要功能列表:

  • 日志通常采用 JSON 对象的结构,以便进行进一步的查询和过滤。

  • 您可以使用控制台中的日志记录功能查看平台日志。

  • 平台日志还可以与 Cloud Monitoring 和其他监控工具集成,以创建信息中心、提醒和其他监控机制。

  • 日志存储费用取决于提取量和保留期限

如需详细了解平台日志,请参阅 Google Cloud Platform 日志

使用平台日志所需的角色和权限

在开始之前,请验证您是否有权访问 Logging。 您需要拥有 Logs Viewer (roles/logging.viewer) Identity and Access Management (IAM) 角色。如需详细了解 Logging 访问权限,请参阅使用 IAM 进行访问权限控制

下文介绍了如何验证和授予 IAM 访问权限:

启用平台日志

默认情况下,平台日志会针对导入主题停用。您可以在创建或更新 Cloud Storage 导入主题时启用平台日志。

如需停用平台日志,请更新 Cloud Storage 导入主题。

在创建 Cloud Storage 导入主题时启用平台日志

确保您已满足创建 Cloud Storage 导入主题的前提条件

如需创建启用了平台日志的 Cloud Storage 导入主题,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往主题页面。

    转到“主题”

  2. 点击创建主题

    系统随即会打开主题详情页面。

  3. 主题 ID 字段中,输入 Cloud Storage 导入主题的 ID。

    如需详细了解如何命名主题,请参阅命名准则

  4. 选择添加默认订阅

  5. 选择启用提取

  6. 按照创建 Cloud Storage 导入主题中的说明指定提取选项。
  7. 选择启用平台日志
  8. 保留其他默认设置。
  9. 点击创建主题

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如需启用平台日志,请确保将 --ingestion-log-severity 标志设置为 WARNING 或更高级别。运行 gcloud pubsub topics create 命令:

    gcloud pubsub topics create TOPIC_ID\
        --cloud-storage-ingestion-bucket=BUCKET_NAME\
        --cloud-storage-ingestion-input-format=INPUT_FORMAT\
        --ingestion-log-severity=WARNING

    替换以下内容:

    • TOPIC_ID:主题的名称或 ID。

    • BUCKET_NAME:指定现有存储桶的名称。例如 prod_bucket。 存储桶名称不得包含项目 ID。如需创建存储桶,请参阅创建存储桶

    • INPUT_FORMAT:指定要提取的对象的格式。可以是 textavropubsub_avro。如需详细了解这些选项,请参阅输入格式

如果您遇到问题,请参阅“排查 Cloud Storage 导入问题”主题

在更新 Cloud Storage 导入主题时启用平台日志

执行以下步骤:

控制台

  1. 在 Google Cloud 控制台中,前往主题页面。

    转到“主题”

  2. 点击“Cloud Storage 导入”主题。

  3. 在主题详情页面中,点击修改

  4. 选择启用平台日志
  5. 点击更新

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 为避免丢失导入主题的设置,请务必在每次更新主题时添加所有设置。如果您遗漏了某些内容,Pub/Sub 会将设置重置为原始默认值。

    如需启用平台日志,请确保 ingestion-log-severity 设置为 WARNING。使用以下示例中提及的所有标志运行 gcloud pubsub topics update 命令:

    gcloud pubsub topics update TOPIC_ID \
        --cloud-storage-ingestion-bucket=BUCKET_NAME\
        --cloud-storage-ingestion-input-format=INPUT_FORMAT\
        --cloud-storage-ingestion-text-delimiter=TEXT_DELIMITER\
        --cloud-storage-ingestion-minimum-object-create-time=MINIMUM_OBJECT_CREATE_TIME\
        --cloud-storage-ingestion-match-glob=MATCH_GLOB
        --ingestion-log-severity=WARNING

    替换以下内容:

    • TOPIC_ID 是主题 ID 或名称。此字段无法更新。

    • BUCKET_NAME:指定现有存储桶的名称。例如 prod_bucket。 存储桶名称不得包含项目 ID。

    • INPUT_FORMAT:指定要提取的对象的格式。可以是 textavropubsub_avro。如需详细了解这些选项,请参阅输入格式

    • TEXT_DELIMITER:指定用于将文本对象拆分为 Pub/Sub 消息的分隔符。此字符应为单个字符,并且仅应在 INPUT_FORMATtext 时设置。默认值为换行符 (\n)。

      使用 gcloud CLI 指定分隔符时,请仔细注意对新行 \n 等特殊字符的处理。使用 '\n' 格式确保正确解读分隔符。仅使用 \n(不带引号或转义)会导致分隔符为 "n"

    • MINIMUM_OBJECT_CREATE_TIME:指定对象的创建时间不得低于此值,才能被提取。此值应采用 UTC 格式,格式为 YYYY-MM-DDThh:mm:ssZ。例如 2024-10-14T08:30:30Z

      0001-01-01T00:00:00Z9999-12-31T23:59:59Z(包括这两个数值)之间的任何日期(过去或未来)均有效。

    • MATCH_GLOB:指定要匹配的 glob 模式,以便提取对象。使用 gcloud CLI 时,包含 * 字符的匹配正则表达式必须将 * 字符的格式设置为转义形式(\*\*.txt),或者整个匹配正则表达式必须用引号 "**.txt"'**.txt' 括起来。如需了解 glob 模式支持的语法,请参阅 Cloud Storage 文档

停用平台日志

执行以下步骤:

控制台

  1. 在 Google Cloud 控制台中,前往主题页面。

    转到“主题”

  2. 点击“Cloud Storage 导入”主题。

  3. 在主题详情页面中,点击修改

  4. 取消选中启用平台日志
  5. 点击更新

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 为避免丢失导入主题的设置,请务必在每次更新主题时添加所有设置。如果您遗漏了某些内容,Pub/Sub 会将设置重置为原始默认值。

    如需停用平台日志,请确保将 ingestion-log-severity 设置为 DISABLED。使用以下示例中提及的所有标志运行 gcloud pubsub topics update 命令:

    gcloud pubsub topics update TOPIC_ID \
        --cloud-storage-ingestion-bucket=BUCKET_NAME\
        --cloud-storage-ingestion-input-format=INPUT_FORMAT\
        --cloud-storage-ingestion-text-delimiter=TEXT_DELIMITER\
        --cloud-storage-ingestion-minimum-object-create-time=MINIMUM_OBJECT_CREATE_TIME\
        --cloud-storage-ingestion-match-glob=MATCH_GLOB
        --ingestion-log-severity=DISABLED

    替换以下内容:

    • TOPIC_ID 是主题 ID 或名称。此字段无法更新。

    • BUCKET_NAME:指定现有存储桶的名称。例如 prod_bucket。 存储桶名称不得包含项目 ID。

    • INPUT_FORMAT:指定要提取的对象的格式。可以是 textavropubsub_avro。如需详细了解这些选项,请参阅输入格式

    • TEXT_DELIMITER:指定用于将文本对象拆分为 Pub/Sub 消息的分隔符。此字符应为单个字符,并且仅应在 INPUT_FORMATtext 时设置。默认值为换行符 (\n)。

      使用 gcloud CLI 指定分隔符时,请仔细注意对新行 \n 等特殊字符的处理。使用 '\n' 格式确保正确解读分隔符。仅使用 \n(不带引号或转义)会导致分隔符为 "n"

    • MINIMUM_OBJECT_CREATE_TIME:指定对象的创建时间不得低于此值,才能被提取。此值应采用 UTC 格式,格式为 YYYY-MM-DDThh:mm:ssZ。例如 2024-10-14T08:30:30Z

      0001-01-01T00:00:00Z9999-12-31T23:59:59Z(包括这两个数值)之间的任何日期(过去或未来)均有效。

    • MATCH_GLOB:指定要匹配的 glob 模式,以便提取对象。使用 gcloud CLI 时,包含 * 字符的匹配正则表达式必须将 * 字符的格式设置为转义形式(\*\*.txt),或者整个匹配正则表达式必须用引号 "**.txt"'**.txt' 括起来。如需了解 glob 模式支持的语法,请参阅 Cloud Storage 文档

查看平台日志

如需查看 Cloud Storage 导入主题的平台日志,请执行以下操作:

Google Cloud 控制台

  1. 在 Google Cloud 控制台中,打开日志浏览器

    转到日志浏览器

  2. 选择 Google Cloud 项目。

  3. 根据需要,在升级菜单中,从旧版日志查看器切换到日志浏览器

  4. 如需过滤日志以仅显示 Cloud Storage 导入主题的条目,请在查询字段中输入 resource.type="resource.type=pubsub_topic AND severity=WARNING,然后点击运行查询

  5. 查询结果窗格中,点击修改时间以更改返回结果的时间段。

如需详细了解如何使用日志浏览器,请参阅使用日志浏览器

gcloud CLI

如需使用 gcloud CLI 搜索 Cloud Storage 导入主题的平台日志,请使用 gcloud logging read 命令。

指定过滤条件以将结果限制为 Cloud Storage 导入主题的平台日志。

gcloud logging read "resource.type=pubsub_topic AND severity=WARNING"

Cloud Logging API

使用 entries.list Cloud Logging API 方法。

如需过滤结果以仅包含 Cloud Storage 导入主题的平台日志,请使用 filter 字段。以下是 JSON 请求对象示例。

{
"resourceNames":
  [
    "projects/my-project-name"
  ],
  "orderBy": "timestamp desc",
  "filter": "resource.type=\"pubsub_topic\" AND severity=WARNING"
}

查看和了解平台日志格式

以下部分包含平台日志示例,并介绍了平台日志的字段。

所有特定于平台日志的字段都包含在 jsonPayload 对象中。

Avro 失败

{
  "insertId": "1xnzx8md4768",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.pubsub.v1.IngestionFailureEvent",
    "cloudStorageFailure": {
      "objectGeneration": "1661148924738910",
      "bucket": "bucket_in_avro_format",
      "objectName": "counts/taxi-2022-08-15T06:10:00.000Z-2022-08-15T06:15:00.000Z-pane-0-last-00-of-01",
      "avroFailureReason": {}
    },
    "topic": "projects/interpod-p2-management/topics/avro_bucket_topic",
    "errorMessage": "Unable to parse the header of the object. The object won't be ingested."
  },
  "resource": {
    "type": "pubsub_topic",
    "labels": {
      "project_id": "interpod-p2-management",
      "topic_id": "avro_bucket_topic"
    }
  },
  "timestamp": "2024-10-07T18:55:45.650103193Z",
  "severity": "WARNING",
  "logName": "projects/interpod-p2-management/logs/pubsub.googleapis.com%2Fingestion_failures",
  "receiveTimestamp": "2024-10-07T18:55:46.678221398Z"
}
日志字段 说明
insertId 日志条目的唯一标识符。
jsonPayload.@type 标识事件类型。始终为 type.googleapis.com/google.pubsub.v1.IngestionFailureEvent
jsonPayload.cloudStorageFailure.objectGeneration Cloud Storage 对象的世代编号。
jsonPayload.cloudStorageFailure.bucket 包含对象的 Cloud Storage 存储桶。
jsonPayload.cloudStorageFailure.objectName Cloud Storage 对象的名称。
jsonPayload.cloudStorageFailure.avroFailureReason 包含更具体的 Avro 解析错误详情。此字段留空。
jsonPayload.topic 消息的目标 Pub/Sub 主题。
jsonPayload.errorMessage 人类可读的错误消息。
resource.type 资源类型。始终为 pubsub_topic
resource.labels.project_id Google Cloud 项目 ID。
resource.labels.topic_id Pub/Sub 主题 ID。
timestamp 日志条目生成时间戳。
severity 严重级别,即 WARNING
logName 日志的名称。
receiveTimestamp 日志条目接收时间戳。

文本失败

{
  "insertId": "1kc4puoag",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.pubsub.v1.IngestionFailureEvent",
    "cloudStorageFailure": {
      "bucket": "bucket_in_text_format",
      "apiViolationReason": {},
      "objectName": "counts/taxi-2022-08-15T06:10:00.000Z-2022-08-15T06:15:00.000Z-pane-0-last-00-of-01",
      "objectGeneration": "1727990048026758"
    },
    "topic": "projects/interpod-p2-management/topics/large_text_bucket_topic",
    "errorMessage": "The message has exceeded the maximum allowed size of 10000000 bytes. The message won't be published."
  },
  "resource": {
    "type": "pubsub_topic",
    "labels": {
      "topic_id": "large_text_bucket_topic",
      "project_id": "interpod-p2-management"
    }
  },
  "timestamp": "2024-10-09T14:09:07.760488386Z",
  "severity": "WARNING",
  "logName": "projects/interpod-p2-management/logs/pubsub.googleapis.com%2Fingestion_failures",
  "receiveTimestamp": "2024-10-09T14:09:08.483589656Z"
}
日志字段 说明
insertId 日志条目的唯一标识符。
jsonPayload.@type 标识事件类型。始终为 type.googleapis.com/google.pubsub.v1.IngestionFailureEvent
jsonPayload.cloudStorageFailure.objectGeneration Cloud Storage 对象的世代编号。
jsonPayload.cloudStorageFailure.bucket 包含对象的 Cloud Storage 存储桶。
jsonPayload.cloudStorageFailure.objectName Cloud Storage 对象的名称。
jsonPayload.cloudStorageFailure.apiViolationReason 包含有关 API 违规行为的详细信息。此字段留空。
jsonPayload.topic Pub/Sub 主题。
jsonPayload.errorMessage 人类可读的消息。
resource.type 资源类型,始终为 pubsub_topic
resource.labels.project_id Google Cloud 项目 ID。
resource.labels.topic_id Pub/Sub 主题 ID。
timestamp 日志条目生成时间戳。
severity 严重级别,即 WARNING
logName 日志的名称。
receiveTimestamp Logging 接收此日志条目的时间。