繁体   English   中英

Google PubSub - 统计主题中的消息

[英]Google PubSub - Counting messages in topic

我查看了 Google PubSub 的文档,还尝试查看 Google Cloud Monitoring,但找不到任何方法来确定我的主题中的队列大小。

由于我计划使用 PubSub 进行分析,因此监控队列数量对我来说很重要,因此我可以扩大/缩小订阅者数量。

我错过了什么?

您要查看的指标是“未传递的消息”。 您应该能够在“发布/订阅”资源类型下的Google Cloud Monitoring 中设置监控此指标的警报或图表。 尚未被订阅者确认的消息数量,即队列大小,是每个订阅的度量而不是每个主题的度量。 有关该指标的信息,请参阅GCP 指标列表中的pubsub.googleapis.com/subscription/num_undelivered_messages (以及其他所有可用的 Pub/Sub 指标)。

如果您正在寻找一种编程方式来实现这一点,这可能会有所帮助:

from google.cloud import monitoring_v3
from google.cloud.monitoring_v3 import query

project = "my-project"
client = monitoring_v3.MetricServiceClient()
result = query.Query(
         client,
         project,
         'pubsub.googleapis.com/subscription/num_undelivered_messages', 
         minutes=60).as_dataframe()

print(result['pubsub_subscription'][project]['subscription_name'][0])

您的问题的答案是“否”,PubSub 没有显示这些计数的功能。 您必须使用 Stackdriver 进行日志事件监控(我也花了一些时间才发现这一点)。

对此的口语答案是逐步执行以下操作:

  1. 从 GCloud 管理控制台导航至: Monitoring

从 gcloud 管理控制台导航

  1. 这将打开一个带有单独 Stackdriver 控制台的新窗口
  2. 在 Stackdriver 中导航: Dashboards > Create Dashboard

在 Stackdriver 中创建新仪表板

  1. 单击仪表板屏幕右上角的Add Chart按钮

在此处输入图片说明

  1. 在输入框中,输入num_undelivered_messages然后SAVE

自动建议指标以添加图表

基于@steeve's answer 的更新版本。 (没有pandas依赖)

请注意,您必须指定end_time而不是使用默认的utcnow()

import datetime
from google.cloud import monitoring_v3
from google.cloud.monitoring_v3 import query

project = 'my-project'
sub_name = 'my-sub'
client = monitoring_v3.MetricServiceClient()
result = query.Query(
  client,
  project,
  'pubsub.googleapis.com/subscription/num_undelivered_messages',
  end_time=datetime.datetime.now(),
  minutes=1,
  ).select_resources(subscription_id=sub_name)

for content in result:
  print(content.points[0].value.int64_value)

有一种方法可以使用自定义指标计算发布到主题的所有消息。

就我而言,我通过运行 python 脚本的 Cloud Composer (Airflow) Dag 将消息发布到 Pub/Sub 主题。

python 脚本返回有关运行的 Dag 的日志信息。

logging.info(
f"Total events in file {counter-1}, total successfully published {counter - error_counter -1}, total errors publishing {error_counter}. Events sent to topic: {TOPIC_PATH} from filename: {source_blob_name}.",
{
"metric": "<some_name>",
"type": "completed_file",
"topic": EVENT_TOPIC,
"filename": source_blob_name,
"total_events_in_file": counter - 1,
"failed_published_messages": error_counter,
"successful_published_messages": counter - error_counter - 1,
}

然后我有一个Distribution自定义指标,它过滤resource_typeresource_lablejsonPayload.metricjsonPayload.type 该指标还将字段名称设置为 jsonPayload.successful_published_messages

自定义指标过滤器:

resource.type=cloud_composer_environment AND resource.labels.environment_name={env_name} AND jsonPayload.metric=<some_name> AND jsonPayload.type=completed_file

然后将该自定义指标用于仪表板中,MQL 设置为

fetch cloud_composer_environment
| metric
'logging.googleapis.com/user/my_custom_metric'
| group_by 1d, [value_pubsub_aggregate: aggregate(value.pubsub)]
| every 1d
| group_by [],
[value_pubsub_aggregate_sum: sum(value_pubsub_aggregate)]

其中去我第一次安装具有资源类型的图标图云作曲家环境,公制:my_custom指标,加工工序:没有前工序,对齐功能:SUM,期限1单元天,你怎么想它通过分组组功能:意思。

理想情况下,您只需为按功能分组的总和选择,但它会出错,这就是为什么您随后需要使用 MQL 并手动输入总和而不是均值的原因。

在此处输入图片说明

现在,这将计算您发布的消息长达 24 个月,这是Google 为自定义指标设置的保留期。

这是一个java版本

package com.example.monitoring;

import static com.google.cloud.monitoring.v3.MetricServiceClient.create;
import static com.google.monitoring.v3.ListTimeSeriesRequest.newBuilder;
import static com.google.monitoring.v3.ProjectName.of;
import static com.google.protobuf.util.Timestamps.fromMillis;
import static java.lang.System.currentTimeMillis;

import com.google.monitoring.v3.ListTimeSeriesRequest;
import com.google.monitoring.v3.TimeInterval;

public class ReadMessagesFromGcp {

  public static void main(String... args) throws Exception {
   
    String projectId = "put here";

    var interval = TimeInterval.newBuilder()
                               .setStartTime(fromMillis(currentTimeMillis() - (120 * 1000)))
                               .setEndTime(fromMillis(currentTimeMillis()))
                               .build();

    var request = newBuilder().setName(of(projectId).toString())
           .setFilter("metric.type=\"pubsub.googleapis.com/subscription/num_undelivered_messages\"")
           .setInterval(interval)
           .setView(ListTimeSeriesRequest.TimeSeriesView.FULL)
           .build();

    var response = create().listTimeSeries(request);

    for (var subscriptionData : response.iterateAll()) {
        
        var subscription = subscriptionData.getResource().getLabelsMap().get("subscription_id");
        
        var numberOrMessages = subscriptionData.getPointsList().get(0).getValue().getInt64Value();
            
        if(numberOrMessages > 0) {
            System.out.println(subscription + " has " + numberOrMessages + " messages ");
        }
            
    }
  }
}
<dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-monitoring</artifactId>
            <version>3.3.2</version>
        </dependency>
    
        <dependency>
          <groupId>com.google.protobuf</groupId>
          <artifactId>protobuf-java-util</artifactId>
          <version>4.0.0-rc-2</version>
        </dependency>

输出

queue-1 有 36 条消息

queue-2 有 4 条消息

queue-3 有 3 条消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM