本页介绍了如何使用 Cloud Monitoring API 创建基于 PromQL 的条件提醒政策。您可以在提醒政策中使用 PromQL 查询,通过比率、动态阈值和指标评估等功能创建复杂的条件。
如需了解一般信息,请参阅使用 PromQL 的提醒政策。
如果您在 Cloud Monitoring 之外的 Prometheus 环境中工作,并且有 Prometheus 提醒规则,则可以使用 Google Cloud CLI 通过 PromQL 查询将其迁移到 Monitoring 提醒政策。如需了解详情,请参阅从 Prometheus 迁移提醒规则和接收器。
使用 PromQL 查询创建提醒政策
您可以使用 alertPolicies.create
方法以编程方式创建提醒政策。
使用基于 PromQL 的条件创建提醒政策与其他提醒政策之间的唯一区别是,您的 Condition
类型必须为 PrometheusQueryLanguageCondition
。借助此条件类型,您可以使用 PromQL 定义提醒政策。
以下示例展示了用于提醒政策条件的 PromQL 查询,该查询使用 kube-state
导出器中的一个指标来查找容器在过去 30 分钟内重启的次数:
rate(kube_pod_container_status_restarts[30m]) * 1800 > 1
构建提醒政策
如需使用基于 PromQL 的条件构建提醒政策,请使用 AlertPolicy
条件类型 PrometheusQueryLanguageCondition
。PrometheusQueryLanguageCondition
具有以下结构:
{ "query": string, "duration": string, "evaluationInterval": string, "labels": {string: string}, "ruleGroup": string, "alertRule": string }
PrometheusQueryLanguageCondition
字段的定义如下:
query
:要进行求值的 PromQL 表达式。相当于标准 Prometheus 提醒规则中的expr
字段。duration
:指定在触发提醒政策之前,每次查询评估必须生成true
值的时间长度。该值必须是分钟数,以秒表示;例如,600s
表示 10 分钟时长。如需了解详情,请参阅基于指标的提醒政策的行为。evaluationInterval
:对查询进行 PromQL 求值之间的时间间隔(以秒为单位)。默认值是 30 秒。如果PrometheusQueryLanguageCondition
是通过迁移 Prometheus 提醒规则创建的,则此值来自包含 Prometheus 提醒规则的 Prometheus 规则组。labels
:在 PromQL 表达式结果中添加或覆盖标签的可选方法。ruleGroup
:如果提醒政策是从 Prometheus 配置文件迁移的,则此字段包含 Prometheus 配置文件中规则组的name
字段的值。在 Cloud Monitoring API 中创建 PromQL 提醒政策时,此字段不是必需的。alertRule
:如果提醒政策是从 Prometheus 配置文件迁移的,则此字段包含 Prometheus 配置文件中提醒规则的alert
字段的值。在 Cloud Monitoring API 中创建 PromQL 提醒政策时,此字段不是必需的。
例如,以下条件使用 PromQL 查询查找容器在过去 30 分钟内重启的次数:
"conditionPrometheusQueryLanguage": { "query": "rate(kube_pod_container_status_restarts[30m]) * 1800 > 1", "duration": "600s", evaluationInterval: "60s", "alertRule": "ContainerRestartCount", "labels": { "action_required":"true", "severity":"critical/warning/info"} }
使用此结构作为条件中 conditionPrometheusQueryLanguage
字段的值,而该条件又嵌入到提醒政策结构中。如需详细了解这些结构,请参阅 AlertPolicy
。
下面显示了一个完整的政策,它具有 JSON 格式的 PrometheusQueryLanguageCondition
条件:
{ "displayName": "Container Restarts", "documentation": { "content": "Pod ${resource.label.namespace_name}/${resource.label.pod_name} has restarted more than once during the last 30 minutes.", "mimeType": "text/markdown", "subject": "Container ${resource.label.container_name} in Pod ${resource.label.namespace_name}/${resource.label.pod_name} has restarted more than once during the last 30 minutes." }, "userLabels": {}, "conditions": [ { "displayName": "Container has restarted", "conditionPrometheusQueryLanguage": { "query": "rate(kubernetes_io:container_restart_count[30m]) * 1800", "duration": "600s", evaluationInterval: "60s", "alertRule": "ContainerRestart", "labels": { "action_required":"true", "severity":"critical/warning/info"} } } ], "combiner": "OR", "enabled": true }
创建提醒政策
如需创建提醒政策,请将提醒政策 JSON 放入名为 POLICY_NAME.json 的文件中,然后运行以下命令:
curl -d @POLICY_NAME.json -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -X POST https://monitoring.googleapis.com/v3/projects/${PROJECT}/alertPolicies
如需详细了解用于提醒政策的 Monitoring API,请参阅使用 API 管理提醒政策。
如需详细了解如何使用 curl
,请参阅调用 curl
。
使用 Terraform
如需了解如何使用 Terraform 配置基于 PromQL 的提醒政策,请参阅 google_monitoring_alert_policy
Terraform 注册表的 condition_prometheus_query_language
部分。
如需了解有关将 Google Cloud 与 Terraform 搭配使用的一般信息,请参阅将 Terraform 与 Google Cloud 搭配使用。
调用 curl
每个 curl
调用都包含一组参数,后跟 API 资源的网址。常见参数包括 Google Cloud 项目 ID 和身份验证令牌。这些值在此处由 PROJECT_ID
和 TOKEN
环境变量表示。
您可能还需要指定其他参数,例如,指定 HTTP 请求的类型(例如 -X DELETE
)。默认请求为 GET
,因此示例未指定该请求。
每个 curl
调用具有以下一般结构:
curl --http1.1 --header "Authorization: Bearer ${TOKEN}" <other_args> https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/<request>
要使用 curl
,您必须指定项目 ID 和访问令牌。为了减少输入和错误,您可以将它们放在环境变量中,以便以这种方式将它们传递给 curl
。
要设置这些变量,请执行以下操作:
创建环境变量来保存指标范围的范围限定项目的 ID。以下步骤将调用变量
PROJECT_ID
:PROJECT_ID=a-sample-project
向 Google Cloud CLI 进行身份验证:
gcloud auth login
可选。为避免必须使用每个
gcloud
命令指定项目 ID,请使用 gcloud CLI 将项目 ID 设置为默认值:gcloud config set project ${PROJECT_ID}
创建授权令牌并将其存储到环境变量中。 以下步骤将调用变量
TOKEN
:TOKEN=`gcloud auth print-access-token`
您必须定期刷新访问令牌。如果命令突然报告您未通过身份验证,请重新发布此命令。
要验证您是否已获得访问令牌,请回显
TOKEN
变量:echo ${TOKEN} ya29.GluiBj8o....