Google PubSub - 计算主题中的消息

时间:2016-02-18 07:15:18

标签: google-cloud-platform google-cloud-pubsub

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

由于我计划使用PubSub进行分析,因此监控队列数非常重要,因此我可以扩大/减少用户数。

我错过了什么?

5 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:6)

您的问题的答案为“否”,PubSub没有显示这些计数的功能。您必须执行此操作的方法是使用Stackdriver进行日志事件监视(我也花了一些时间才能找到答案)。

对此的口头答复是逐步进行以下操作:

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

navigate from gcloud admin console

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

create new dashboard within stackdriver

  1. 点击仪表板屏幕右上方的Add Chart按钮

enter image description here

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

auto suggested metrics to add chart

答案 2 :(得分:0)

如果您正在寻找以编程方式实现此目标的方法,可能会有所帮助:

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])

答案 3 :(得分:0)

基于@steeve的here的更新版本。 (没有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)

答案 4 :(得分:0)

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

就我而言,我通过运行 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.metric 和 <强>jsonPayload.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,单位天,你希望它如何分组按函数分组: 意思。

理想情况下,您只需为 Group by function 选择 sum,但它会出错,这就是为什么您随后需要 sqitch 到 MQL 并手动输入 sum 而不是 mean。

enter image description here

这将计算您发布的消息最多 24 个月,这是 Google for the custom metrics 设置的保留期。