当没有客户端从 Pub/Sub 订阅中拉出时,如何通过 Stackdriver 获得可靠的警报?

How can I get a reliable alert via Stackdriver when there are no clients pulling from a Pub/Sub subscription?

我目前设置了一些警报以在 subscription/pull_request_count 为 0 时报告。但是,在 中,我发现一旦没有数据,指标和警报就会中断,我相信这会发生当没有订阅时。

我的目的是弄清楚我的服务器是否已停止提取消息。我想到了 2 个细节很重要的场景。

  1. 即使没有消息被发布,我也想知道我是否不再退出订阅以确保一切正常。
  2. 如果大量未确认的消息排队只是因为我拉了它们但没有确认它们(例如,合作伙伴 API 已关闭),我不希望此警报成为触发

除了使用 subscription/pull_request_count 作为条件(在没有数据输入时(至少在一段时间后)不起作用)之外,我如何设置一个警报,通知我没有客户拉动来自 Pub/Sub 订阅?

由于您希望在没有拉取消息操作时收到警报,因此您必须使用 subscription/pull_request_count 指标。如果一段时间后指标被删除而不是报告 0 次拉动,您可以使用两个条件:is absent for 3 minutesis below 1 for 1 minute:

但是,这里的问题是 UI 过滤掉了所有未使用的资源和指标(过去 6 周)。虽然这大大简化了设置警报和浏览 运行 操作的指标,但它需要一种不同的方法来在系统投入生产之前创建新警报。最简单的解决方案是创建一个虚拟订阅并拉取消息,以便显示指标。

但您仍然可以使用 Stackdriver Monitoring API 来设置它们(我实际上在过去几个月没有实例的工作区中使用 Spanner 指标测试了它)。请记住,警报政策 API 在 Beta 中,因此它可能会发生非向后兼容的更改。

我建议首先检查已构建 projects.alertPolicies/list and see how the AlertPolicy 正文的现有策略。

然后你可以设置一些初始变量:

TOKEN="$(gcloud auth print-access-token)"
PROJECT=$(gcloud config get-value project 2>\dev\null)
SUBSCRIPTION=PUBSUB_SUBSCRIPTION_ID
CHANNEL=NOTIFICATION_CHANNEL_ID

在我的例子中,我在整个示例中只监视特定的 Pub/Sub 订阅,并且我已经有一个通知渠道(用于我的电子邮件)。由于您还有现有政策,因此您可以获得通知渠道 ID here

使用 projects.alertPolicies/create 您可以创建新的警报策略:

curl -X POST \
    -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "https://monitoring.googleapis.com/v3/projects/$PROJECT/alertPolicies" \
  -d @alert.json

其中 alert.json 是(根据需要替换变量):

{
  "displayName": "no-pull-alert",
  "combiner": "OR",
  "conditions": [
    {
      "conditionAbsent": {
        "filter": "metric.type=\"pubsub.googleapis.com/subscription/pull_request_count\" resource.type=\"pubsub_subscription\" resource.label.\"project_id\"=\"$PROJECT\" resource.label.\"subscription_id\"=\"$SUBSCRIPTION\"",
        "duration": "180s",
        "trigger": {
          "count": 1
        },
        "aggregations": [
          {
            "alignmentPeriod": "60s",
            "perSeriesAligner": "ALIGN_RATE"
          }
        ]
      },
      "displayName": "Pull requests absent for $PROJECT, $SUBSCRIPTION"
    },
    {
      "conditionThreshold": {
        "filter": "metric.type=\"pubsub.googleapis.com/subscription/pull_request_count\" resource.type=\"pubsub_subscription\" resource.label.\"project_id\"=\"$PROJECT\" resource.label.\"subscription_id\"=\"$SUBSCRIPTION\"",
        "comparison": "COMPARISON_LT",
        "thresholdValue": 1,
        "duration": "60s",
        "trigger": {
          "count": 1
        },
        "aggregations": [
          {
            "alignmentPeriod": "60s",
            "perSeriesAligner": "ALIGN_RATE"
          }
        ]
      },
      "displayName": "Pull requests are 0 for $PROJECT, $SUBSCRIPTION"
    }
  ],
  "documentation": {
    "content": "**ALERT**\n\nNo pull message operations",
    "mimeType": "text/markdown"
  },
  "notificationChannels": [
    "projects/$PROJECT/notificationChannels/$CHANNEL"
  ],
  "enabled": true
}

简而言之,您不需要传递政策或条件 ID,因为这些将由 API 填充。使用 OR 作为组合器(满足任何条件时违反策略 )以在指标不存在 (conditionAbsent) 或低于 1 (conditionThreshold).当然,您可以修改参数以更好地适应您的用例、显示名称、描述等。