在 Cloud Monitoring 中监控 Pub/Sub

您可以使用 Google Cloud 控制台或 Cloud Monitoring API 来监控 Pub/Sub。

本文档介绍如何使用 Monitoring 在 Google Cloud 控制台中监控 Pub/Sub 使用情况。

  • 除了 Pub/Sub 指标之外,如果您还想查看来自其他 Google Cloud 资源的指标,请使用 Monitoring。

  • 否则,您可以使用 Pub/Sub 内提供的监控信息中心。请参阅监控主题监控订阅

如需了解在自动伸缩中使用指标的最佳实践,请参阅将 Pub/Sub 指标用作伸缩信号的最佳实践

准备工作

在使用 Monitoring 之前,请确保您已准备好以下各项:

  • Cloud Billing 帐号

  • 启用了结算功能的 Pub/Sub 项目

确保已获取这两种凭据的一种方法是完成《快速入门:使用 Cloud 控制台》的学习。

查看现有信息中心

通过信息中心,您可以在同一上下文中查看和分析来自不同来源的数据。Google Cloud 提供预定义和自定义信息中心。例如,您可以查看预定义的 Pub/Sub 信息中心,也可以创建自定义信息中心,以显示与 Pub/Sub 相关的指标数据、提醒政策和日志条目。

如需使用 Cloud Monitoring 监控 Pub/Sub 项目,请执行以下步骤:

  1. 在 Google Cloud 控制台中,转到 Monitoring 页面。

    进入 Monitoring

  2. 选择您的项目名称(如果尚未在页面顶部选择该名称)。

  3. 点击导航菜单中的信息中心

  4. 信息中心概览页面中,创建新的信息中心或选择现有的 Pub/Sub 信息中心。

    如需搜索现有的 Pub/Sub 信息中心,请在所有信息中心的过滤条件中选择名称属性并输入 Pub/Sub

如需详细了解如何创建、修改和管理自定义信息中心,请参阅管理自定义信息中心

查看单个 Pub/Sub 指标

如需使用 Google Cloud 控制台查看单个 Pub/Sub 指标,请执行以下步骤:

  1. 在 Google Cloud 控制台中,转到 Monitoring 页面。

    进入 Monitoring

  2. 在导航窗格中,选择 Metrics Explorer

  3. 配置部分中,点击选择指标

  4. 在过滤条件中,输入 Pub/Sub

  5. 活跃资源中,选择 Pub/Sub 订阅Pub/Sub 主题

  6. 深入到具体指标,然后点击应用

    系统会打开特定指标的页面。

您可以阅读 Cloud Monitoring 文档,详细了解监控信息中心。

查看 Pub/Sub 指标和资源类型

监控配额用量

对于给定项目,您可以使用 IAM 和管理配额信息中心来查看当前配额和用量。

您可以使用以下指标查看历史配额用量:

这些指标使用 consumer_quota 受监控的资源类型。如需了解更多与配额相关的指标,请参阅指标列表

例如,以下 Monitoring 查询语言 查询会创建一个图表,其中包含每个区域中正在使用的发布者配额的比例:

fetch consumer_quota
| filter resource.service == 'pubsub.googleapis.com'
| { metric serviceruntime.googleapis.com/quota/rate/net_usage
    | filter metric.quota_metric == 'pubsub.googleapis.com/regionalpublisher'
    | align delta_gauge(1m)
    | group_by [metric.quota_metric, resource.location],
        sum(value.net_usage)
  ; metric serviceruntime.googleapis.com/quota/limit
    | filter metric.quota_metric == 'pubsub.googleapis.com/regionalpublisher'
    | group_by [metric.quota_metric, resource.location],
        sliding(1m), max(val()) }
| ratio

如果您预计用量会超出默认配额限制,请为所有相关配额创建提醒政策。当您的用量达到上限的一定比例时,就会触发这些提醒。例如,以下 Monitoring Query Language 查询会在任何 Pub/Sub 配额用量超过 80% 时触发提醒政策:

fetch consumer_quota
| filter resource.service == 'pubsub.googleapis.com'
| { metric serviceruntime.googleapis.com/quota/rate/net_usage
    | align delta_gauge(1m)
    | group_by [metric.quota_metric, resource.location],
        sum(value.net_usage)
  ; metric serviceruntime.googleapis.com/quota/limit
    | group_by [metric.quota_metric, resource.location],
        sliding(1m), max(val()) }
| ratio
| every 1m
| condition gt(val(), 0.8 '1')

如需详细了解配额指标的自定义监控和提醒功能,请参阅使用配额指标

如需详细了解配额,请参阅配额和限制

维持良好的订阅状态

为了维持良好的订阅状态,您可以使用 Pub/Sub 提供的指标监控多个订阅属性。例如,您可以监控未确认消息的数量、消息确认截止期限的到期时间等。您还可以检查订阅的健康状况是否足以实现较低的消息传送延迟时间

请参阅后续部分,详细了解具体指标。

监控消息积压

为了确保订阅者能够跟上消息流,请创建一个信息中心。信息中心可以显示您所有订阅的以下积压指标(按资源汇总):

创建提醒政策,以便在这些值超出系统上下文的可接受范围时触发。例如,未确认消息的绝对数量不一定有意义。对于每秒 100 万条消息的订阅,上百万条积压的消息可以接受,但每秒一条消息的订阅无法接受。

常见积压问题

表现 问题 解决方案
oldest_unacked_message_agenum_undelivered_messages 同时增长。 订阅者未跟上消息量
  • 添加更多订阅者线程或进程。
  • 添加更多订阅者机器或容器。
  • 查找代码中的 bug 迹象,这些 bug 会阻止代码成功确认消息或及时处理消息。 请参阅监控确认截止期限
如果积压作业规模稳定、积压作业规模不大,并且 oldest_unacked_message_age 持续增长,可能会有一些消息无法处理。 消息卡住了
  • 检查应用日志,了解某些消息是否导致代码崩溃。违规消息不太可能会卡在 Pub/Sub(而不是您的客户端)中,但有可能。确信您的代码成功处理了每条消息后,请提交支持案例。
  • 如果某些消息导致代码崩溃,请考虑将这些消息转发到死信主题
oldest_unacked_message_age 超过了订阅的 消息保留期限 数据永久丢失
  • 设置在消息保留时长失效之前触发的提醒。

监控传送延迟时间状况

在 Pub/Sub 中,传送延迟时间是指已发布的消息传递给订阅者所需的时间。如果您的消息积压量在不断增加,您可以使用传送延迟时间运行状况得分 (subscription/delivery_latency_health_score) 来检查哪些因素导致延迟时间增加。

此指标用于衡量单个订阅在 10 分钟内的运行状况。该指标可让您深入了解以下标准,这些标准是订阅实现一致的低延迟所必需的:

  • 可忽略的跳转请求。

  • 可忽略的否定确认消息(NACK 消息)。

  • 可忽略的过期消息确认截止期限。

  • 一致的确认延迟时间少于 30 秒。

  • 持续的低利用率,意味着订阅始终具有足够的容量来处理新消息。

对于每个指定条件,“传送延迟时间运行状况得分”指标会报告 0 或 1 分。1 分表示运行状况良好,0 分表示运行状况不佳。

  • 跳转请求:如果订阅在过去 10 分钟内有任何跳转请求,则得分设置为 0。还原订阅可能会导致旧消息在首次发布后的很长时间内重放,从而增加传送延迟时间。

  • 否定确认 (NACK) 消息:如果订阅在过去 10 分钟内有任何否定确认 (NACK) 请求,则得分设置为 0。否定确认会导致消息重新传送,并且传送延迟时间增加。

  • 确认时限已过:如果订阅在过去 10 分钟内有任何已过期的确认截止期限,则得分设为 0。确认截止期限已过的消息将重新传送,但传送延迟时间会增加。

  • 确认延迟时间:如果过去 10 分钟内所有确认延迟时间的第 99.9 个百分位超过 30 秒,则将得分设置为 0。确认延迟时间较长表明订阅者客户端处理消息所用的时间异常长。此得分可能意味着订阅者客户端存在 bug 或存在一些资源限制。

  • 低利用率:每种订阅类型的利用率计算方式不同。

    • StreamingPull:如果您没有打开足够多的数据流,则得分将设置为 0。打开更多信息流,以确保有足够的容量来存储新消息。

    • 推送:如果有过多消息尚未发送到推送端点,则得分会设置为 0。为推送端点添加更多容量,以便有能力接收新消息。

    • 拉取:如果您没有足够多的未完成拉取请求,则得分会设置为 0。打开更多并发拉取请求,以确保您已准备好接收新消息。

如需查看该指标,请在 Metrics Explorer 中,为 Pub/Sub 订阅资源类型选择传送延迟时间运行状况得分指标。添加过滤条件以一次仅选择一个订阅。选择堆叠面积图并指向特定时间,即可查看该时间点的订阅标准得分。

以下是使用堆叠面积图绘制的一小时指标的屏幕截图。在凌晨 4:15 这样,综合健康得分最高为 5 分,每个条件的得分为 1。之后,总分在凌晨 4:20 递减至 4,此时利用率得分降至 0。

传送延迟时间指标的屏幕截图

Monitoring Query Language 为 Cloud Monitoring 时间序列数据提供一个基于文本的直观界面。以下 MQL 查询会创建一个图表来衡量订阅的传送延迟时间健康得分。

fetch pubsub_subscription
| metric 'pubsub.googleapis.com/subscription/delivery_latency_health_score'
| filter (resource.subscription_id == '$SUBSCRIPTION')
| group_by 1m,
   [value_delivery_latency_health_score_sum:
     sum(if(value.delivery_latency_health_score, 1, 0))]
| every 1m

监控确认截止期限

为了缩短消息传送延迟时间,Pub/Sub 会为订阅者客户端提供有限的时间来确认(确认)给定消息。此时间段称为确认时限。如果订阅者需要很长时间才能确认消息,消息会重新传送,导致订阅者看到重复的消息。导致这种情况的原因可能有多种:

  • 订阅者预配不足(您需要更多线程或机器)。

  • 每条消息的处理时间要长于消息确认时限。Cloud 客户端库通常会将个别消息的截止时间延长到可配置的上限。不过,客户端库延长消息时限也有上限。

  • 某些消息一直导致客户端崩溃。

您可以衡量订阅者错过确认时限的比率。具体指标取决于订阅类型:

过高的确认时限到期率可能会导致系统成本效率低下。您需要为每次重新传送以及重复尝试处理每条消息付费。相反,较低的失效率(例如 0.1-1%)可能健康。

监控消息吞吐量

拉取和 StreamingPull 订阅者可能会在每个拉取响应中接收批量消息;推送订阅在每个推送请求中接收一条消息。您可以使用这些指标监控订阅者正在处理的批量消息吞吐量:

您可以通过按 delivery_type 标签过滤的指标 subscription/sent_message_count,监控订阅者正在处理的单个消息吞吐量或非批处理消息吞吐量。

监控推送订阅

对于推送订阅,请监控以下指标:

  • subscription/push_request_count

    response_codesubcription_id 对指标进行分组。由于 Pub/Sub 推送订阅使用响应代码作为隐式消息确认,因此监控推送请求响应代码非常重要。由于推送订阅在遇到超时情况或错误时会以指数方式退避,因此积压输入量可能会根据端点响应情况而快速增长。

    请考虑针对高错误率设置提醒,因为这些错误率会导致传送速度缓慢且积压量不断增加。您可以创建按响应类别过滤的指标。但是,推送请求数可能更适合用作调查积压输入量不断增长的规模和存在时间的工具。

  • subscription/num_outstanding_messages

    Pub/Sub 通常会限制未完成消息的数量。在大多数情况下,未完成消息的数量应控制在 1,000 条以下。当吞吐量达到每秒 10,000 条消息的速率后,服务就会调整未完成消息的数量限制。此限制以 1,000 为增量完成。对于最大值之外,没有具体的保证,因此最好参考 1,000 条未完成的消息。

  • subscription/push_request_latencies

    此指标有助于您了解推送端点的响应延迟时间分布情况。 由于未完成消息的数量存在限制,因此端点延迟时间会影响订阅吞吐量。如果每条消息需要 100 毫秒来处理,则吞吐量上限可能是每秒 10 条消息。

如需实现更高的未完成消息限制,推送订阅者必须确认其收到的消息的 99% 以上。

您可以使用监控查询语言计算订阅者确认的消息所占的比例。以下 MQL 查询会创建一个图表,其中包含订阅者在订阅时确认的消息所占的比例:

fetch pubsub_subscription
| metric 'pubsub.googleapis.com/subscription/push_request_count'
| filter
    (resource.subscription_id == '$SUBSCRIPTION')
    | filter_ratio_by [], metric.response_class == 'ack'
    | every 1m

使用过滤条件监控订阅

如果您为订阅配置了过滤条件,Pub/Sub 会自动确认与过滤条件不匹配的消息。您可以监控此自动确认。

积压指标可能包含与过滤条件不匹配的消息。

如需监控与过滤条件不匹配的自动确认消息的速率,请使用 subscription/ack_message_count 指标,并将 delivery_type 标签设置为 filter

如需监控与过滤条件不匹配的自动确认消息的吞吐量和费用,请使用 subscription/byte_cost 指标,并将 operation_type 标签设置为 filter_drop。如需详细了解这些消息的费用,请参阅 Pub/Sub 价格页面

监控转发的无法递送的邮件

如需监控 Pub/Sub 转发到死信主题的不可递送消息,请使用 subscription/dead_letter_message_count 指标。此指标显示 Pub/Sub 从订阅转发的无法递送消息数量。

如需验证 Pub/Sub 是否转发无法送达的消息,您可以将 subscription/dead_letter_message_count 指标与 topic/send_request_count 指标进行比较。针对 Pub/Sub 将这些消息转发到的死信主题进行比较。

您还可以将订阅附加到死信主题,然后使用以下指标监控此订阅中已转发的无法传送的消息:

维护运行状况良好的发布商

发布者的主要目标是快速保留消息数据。请使用 topic/send_request_count(按 response_code 分组)监控此性能。借助此指标,您可以了解 Pub/Sub 运行状况是否良好以及是否正在接受请求。

您无需担心后台可重试错误率(低于 1%),因为大多数 Cloud 客户端库都会重试消息失败。调查大于 1% 的错误率。 由于不可重试的代码是由应用(而不是客户端库)处理的,因此您应检查响应代码。如果发布者应用没有一种较好的途径表明运行状况不佳,请考虑针对 topic/send_request_count 指标设置提醒。

在发布客户端中跟踪失败的发布请求同样重要。虽然客户端库通常会重试失败的请求,但并不保证一定会发布。如需了解在使用 Cloud 客户端库时检测永久性发布失败的方法,请参阅发布消息。您的发布者应用至少必须记录永久性发布错误。如果您将这些错误记录到 Cloud Logging 中,可以使用提醒政策设置基于日志的指标

监控消息吞吐量

发布商可以批量发送消息。您可以通过以下指标监控发布商发送的消息吞吐量:

  • topic/send_request_count:发布者发送的批量消息量。

  • 计数 topic/message_sizes:发布者发送的单条(非批量)消息的数量。

    您可以通过将计数聚合器应用于此指标或使用 Monitoring Query Language 来计算正在发送的消息数。以下 MQL 查询会创建一个图表,其中包含针对某个主题发送的各条消息的速率:

    fetch pubsub_topic
    | metric 'pubsub.googleapis.com/topic/message_sizes'
    | filter
        (resource.topic_id == '$TOPIC')
    | align delta(1m)
    | every 1m
    | group_by [], [row_count: row_count()]
    

后续步骤

  • 如需为特定指标创建提醒,请参阅管理基于指标的提醒政策

  • 如需详细了解如何使用 MQL 构建监控图表,请参阅使用查询编辑器

  • 如需详细了解 Monitoring API 的 API 资源(例如指标、受监控的资源、受监控的资源组和提醒政策),请参阅 API 资源