当没有客户端从 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 个细节很重要的场景。
- 即使没有消息被发布,我也想知道我是否不再退出订阅以确保一切正常。
- 如果大量未确认的消息排队只是因为我拉了它们但没有确认它们(例如,合作伙伴 API 已关闭),我不希望此警报成为触发
除了使用 subscription/pull_request_count
作为条件(在没有数据输入时(至少在一段时间后)不起作用)之外,我如何设置一个警报,通知我没有客户拉动来自 Pub/Sub 订阅?
由于您希望在没有拉取消息操作时收到警报,因此您必须使用 subscription/pull_request_count
指标。如果一段时间后指标被删除而不是报告 0 次拉动,您可以使用两个条件:is absent for 3 minutes
或 is 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
).当然,您可以修改参数以更好地适应您的用例、显示名称、描述等。
我目前设置了一些警报以在 subscription/pull_request_count
为 0 时报告。但是,在
我的目的是弄清楚我的服务器是否已停止提取消息。我想到了 2 个细节很重要的场景。
- 即使没有消息被发布,我也想知道我是否不再退出订阅以确保一切正常。
- 如果大量未确认的消息排队只是因为我拉了它们但没有确认它们(例如,合作伙伴 API 已关闭),我不希望此警报成为触发
除了使用 subscription/pull_request_count
作为条件(在没有数据输入时(至少在一段时间后)不起作用)之外,我如何设置一个警报,通知我没有客户拉动来自 Pub/Sub 订阅?
由于您希望在没有拉取消息操作时收到警报,因此您必须使用 subscription/pull_request_count
指标。如果一段时间后指标被删除而不是报告 0 次拉动,您可以使用两个条件:is absent for 3 minutes
或 is 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
).当然,您可以修改参数以更好地适应您的用例、显示名称、描述等。