本指南介绍了在使用 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 对象格式正确无误。格式不正确会导致消息无法提取。
数据格式
- 确保您使用的是受支持的 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 导入主题,请按以下步骤操作:
控制台
-
在 Google Cloud 控制台中,前往主题页面。
点击创建主题。
系统随即会打开主题详情页面。
在主题 ID 字段中,输入 Cloud Storage 导入主题的 ID。
如需详细了解如何命名主题,请参阅命名准则。
选择添加默认订阅。
选择启用提取。
- 按照创建 Cloud Storage 导入主题中的说明指定提取选项。
- 选择启用平台日志。
- 保留其他默认设置。
- 点击创建主题。
gcloud
-
In the Google Cloud console, 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.
如需启用平台日志,请确保将
--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
替换以下内容:
如果您遇到问题,请参阅“排查 Cloud Storage 导入问题”主题。
在更新 Cloud Storage 导入主题时启用平台日志
执行以下步骤:
控制台
在 Google Cloud 控制台中,前往主题页面。
点击“Cloud Storage 导入”主题。
在主题详情页面中,点击修改。
- 选择启用平台日志。
点击更新。
gcloud
-
In the Google Cloud console, 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.
为避免丢失导入主题的设置,请务必在每次更新主题时添加所有设置。如果您遗漏了某些内容,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:指定要提取的对象的格式。可以是
text
、avro
或pubsub_avro
。如需详细了解这些选项,请参阅输入格式。-
TEXT_DELIMITER:指定用于将文本对象拆分为 Pub/Sub 消息的分隔符。此字符应为单个字符,并且仅应在
INPUT_FORMAT
为text
时设置。默认值为换行符 (\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:00Z
到9999-12-31T23:59:59Z
(包括这两个数值)之间的任何日期(过去或未来)均有效。 -
MATCH_GLOB:指定要匹配的 glob 模式,以便提取对象。使用 gcloud CLI 时,包含
*
字符的匹配正则表达式必须将*
字符的格式设置为转义形式(\*\*.txt
),或者整个匹配正则表达式必须用引号"**.txt"
或'**.txt'
括起来。如需了解 glob 模式支持的语法,请参阅 Cloud Storage 文档。
停用平台日志
执行以下步骤:
控制台
在 Google Cloud 控制台中,前往主题页面。
点击“Cloud Storage 导入”主题。
在主题详情页面中,点击修改。
- 取消选中启用平台日志。
点击更新。
gcloud
-
In the Google Cloud console, 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.
为避免丢失导入主题的设置,请务必在每次更新主题时添加所有设置。如果您遗漏了某些内容,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:指定要提取的对象的格式。可以是
text
、avro
或pubsub_avro
。如需详细了解这些选项,请参阅输入格式。-
TEXT_DELIMITER:指定用于将文本对象拆分为 Pub/Sub 消息的分隔符。此字符应为单个字符,并且仅应在
INPUT_FORMAT
为text
时设置。默认值为换行符 (\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:00Z
到9999-12-31T23:59:59Z
(包括这两个数值)之间的任何日期(过去或未来)均有效。 -
MATCH_GLOB:指定要匹配的 glob 模式,以便提取对象。使用 gcloud CLI 时,包含
*
字符的匹配正则表达式必须将*
字符的格式设置为转义形式(\*\*.txt
),或者整个匹配正则表达式必须用引号"**.txt"
或'**.txt'
括起来。如需了解 glob 模式支持的语法,请参阅 Cloud Storage 文档。
查看平台日志
如需查看 Cloud Storage 导入主题的平台日志,请执行以下操作:
Google Cloud 控制台
在 Google Cloud 控制台中,打开日志浏览器。
选择 Google Cloud 项目。
根据需要,在升级菜单中,从旧版日志查看器切换到日志浏览器。
如需过滤日志以仅显示 Cloud Storage 导入主题的条目,请在查询字段中输入
resource.type="resource.type=pubsub_topic AND severity=WARNING
,然后点击运行查询。在查询结果窗格中,点击修改时间以更改返回结果的时间段。
如需详细了解如何使用日志浏览器,请参阅使用日志浏览器。
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 接收此日志条目的时间。 |