你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Prometheus 的 Azure Monitor 托管服务规则组

Prometheus 中的规则在数据收集时对其进行处理。 它们配置为 Prometheus 规则组的一部分,该规则组应用于 Azure Monitor 工作区中的 Prometheus 指标。

规则类型

有两种类型的 Prometheus 规则。

类型 DESCRIPTION
警报 通过警报规则 ,可以根据 Prometheus 查询语言(PromQL)查询的结果创建 Azure Monitor 警报。 Azure 托管 Prometheus 警报规则触发的警报会以类似于其他 Azure Monitor 警报的方式处理和触发通知。
记录 记录规则可预先计算经常需要的或计算量大的表达式,并将其结果存储为一组新时序。 通过记录规则创建的时序将作为新的 Prometheus 指标引入回 Azure Monitor 工作区。

创建 Prometheus 规则

可以使用 Azure 资源类型 Microsoft.AlertsManagement/prometheusRuleGroups创建和配置 Azure 托管 Prometheus 规则组、记录规则和警报规则。 警报规则和记录规则定义为规则组属性的一部分。 Prometheus 规则组是在特定 Azure Monitor 工作区的范围内定义的。 可以使用 Azure 资源管理器模板(ARM 模板)、API、Azure CLI 或 PowerShell 创建 Prometheus 规则组。

Azure 托管 Prometheus 规则组遵循开源 Prometheus 规则组的结构和术语。 Azure 版本支持规则名称、表达式、 for 子句、标签和注释。 请注意开源软件规则组与 Azure 托管 Prometheus 之间的以下主要差异:

  • Azure 托管的 Prometheus 规则组作为 Azure 资源进行管理,并包含资源管理所需的关键信息,例如该规则组应位于哪个订阅和资源组中。
  • Azure 托管 Prometheus 警报规则包括专用属性,这些属性允许像其他 Azure Monitor 警报一样处理警报。 例如,作为 Azure 托管 Prometheus 警报规则的一部分,支持警报严重性、作组关联和警报自动解决配置。

注释

对于已启用 Azure Kubernetes 服务(AKS)或已启用 Azure Arc 的 Kubernetes 群集,可以使用一些建议的警报规则。 有关预定义的警报规则,请参阅 此网站

将规则限制为特定群集

可以选择性地将规则组中的规则限制为通过向规则组添加群集范围或使用规则组 clusterName 属性来查询源自单个特定群集的数据。 如果 Azure Monitor 工作区包含来自多个群集的大量数据,请将规则限制为单个群集。 在这种情况下,担心对所有数据应用同一组规则可能会导致性能或限流问题。 通过使用群集范围,可以创建多个规则组,每个组使用同一规则进行配置,并将每个组限制为涵盖不同群集。

若要 使用 ARM 模板将规则组限制为群集范围,请将群集的 Azure 资源 ID 值添加到规则组 scopes[] 列表中。 范围列表仍必须包含 Azure Monitor 工作区资源 ID。 支持将以下群集资源类型作为群集范围:

  • Azure Kubernetes 服务群集 (Microsoft.ContainerService/managedClusters
  • 已启用 Azure Arc 的 Kubernetes 群集 (Microsoft.kubernetes/connectedClusters
  • Azure 连接设备(Microsoft.ResourceConnector/appliances

除了群集 ID,还可以配置 clusterName 规则组的属性。 该 clusterName 属性必须与从特定群集中擦除时添加到指标的 cluster 标签匹配。 默认情况下,此标签设置为群集 ID 的最后一部分(即资源名称)。 如果使用群集擦除 ConfigMap 中的 cluster_alias 设置更改了此标签,则必须在规则组 clusterName 属性中包含更新的值。 如果擦除使用默认 cluster 标签值,则 clusterName 属性是可选的。

以下示例展示了如何将规则组配置为限制查询特定群集:

{
    "name": "sampleRuleGroup",
    "type": "Microsoft.AlertsManagement/prometheusRuleGroups",
    "apiVersion": "2023-03-01",
    "location": "northcentralus",
    "properties": {
         "description": "Sample Prometheus Rule Group limited to a specific cluster",
         "scopes": [
             "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/microsoft.monitor/accounts/<azure-monitor-workspace-name>",
             "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/microsoft.containerservice/managedclusters/<myClusterName>"
         ],
         "clusterName": "<myCLusterName>",
         "rules": [
             {
                ...
             }
         ]
    }
}        

如果未为规则组指定群集 ID 范围和 clusterName 属性,则组中的规则将从所有群集中的所有群集查询数据。

还可以使用 门户 UI 将规则组限制为群集范围。

在 Azure 门户中创建或编辑 Prometheus 规则组

若要从 Azure 门户主页创建新的规则组,请执行以下作:

  1. Azure 门户中,选择“ 监视>警报”。

  2. 选择 Prometheus 规则组

    显示如何从 Azure Monitor 警报屏幕访问 Prometheus 规则组的屏幕截图。

  3. 选择 “+ 创建 ”以打开用于创建规则组的向导。

    显示创建新 Prometheus 规则组的步骤的屏幕截图。

若要从门户主页编辑新规则组,请执行以下操作:

  1. Azure 门户中,选择“ 监视>警报”。
  2. 选择 Prometheus 规则组 以查看订阅中现有规则组的列表。
  3. 选择要转到的规则组。 输入编辑模式。

配置规则组范围

“作用域 ”选项卡上:

  1. 从订阅中可用的工作区列表中选择 Azure Monitor 工作区。 本组规则会从工作区查询数据。

  2. 若要将规则组限制为群集范围,请选择 “特定群集 ”选项:

    • 从已连接到所选 Azure Monitor 工作区的群集列表中选择群集。
    • 系统会为你输入默认的“群集名称”值。 仅当使用 cluster_alias更改群集标签值时,才更改此值。
  3. 选择 “下一步 ”以配置规则组详细信息。

    显示 Prometheus 规则组范围的配置的屏幕截图。

配置规则组详细信息

在“详细信息”选项卡上:

  1. 选择应在其中存储规则组的订阅和资源组。

  2. 输入规则组名称和说明。 创建规则组后,无法更改此名称。

  3. 选择规则组的“评估间隔”时间。 一分钟是默认值。

  4. 选择创建规则组时是否启用该规则组。

  5. 选择“下一步”以配置组中的规则。

    显示 Prometheus 规则组配置详情的屏幕截图。

配置组中的规则

在“ 规则 ”选项卡上,可以看到组中记录规则和警报规则的列表。 一个组中最多可以添加 20 条规则。

规则按它们在组中排列的顺序执行。 可以使用 上移下移 选项更改规则的顺序。

若要添加新记录规则,请执行以下操作:

  1. 选择“+ 添加记录规则”,打开“创建记录规则”窗格。
  2. 输入规则的名称。 此名称是规则创建的指标的名称。
  3. 使用 PromQL 敏感表达式编辑器框输入规则的 PromQL 表达式值。 可以在预览图表中查看可视化的表达式查询的结果。 可以修改预览时间范围以放大或缩小表达式结果历史记录。
  4. 选择是否在创建时启用规则。
  5. 可以为规则输入可选的“标签”键值对。 这些标签将添加到规则创建的指标中。
  6. 选择“创建”将新规则添加到规则列表中。

显示 Prometheus 规则组录制规则的配置的屏幕截图。

若要添加新的警报规则,请执行以下操作:

  1. 选择 “+ 添加警报规则 ”以打开 “创建警报规则 ”窗格。
  2. 选择此规则触发的警报的 严重性 值。
  3. 输入规则的名称。 此名称是规则触发的警报的名称。
  4. 使用支持 PromQL 的表达式编辑器框输入规则的 PromQL 表达式 值。 可以在预览图表中查看可视化的表达式查询的结果。 可以修改预览时间范围以放大或缩小表达式结果历史记录。
  5. 选择警报表达式首次变为 true 且直到触发警报为止的时间段的等待值。
  6. 可以为规则输入可选的“注释”键值对。 这些注释将添加到规则触发的警报中。
  7. 可以为规则输入可选的“标签”键值对。 这些标签会被添加到由规则触发的警报中。
  8. 选择规则触发的操作组
  9. 选择“自动解除警报”,以在“自动解除的时间”段期间,当规则条件不再为 true 时自动解除警报。
  10. 选择是否在创建时启用规则。
  11. 选择“创建”将新规则添加到规则列表中。

显示 Prometheus 规则组警报规则的配置的屏幕截图。

注释

对于警报规则,表达式查询通常仅返回满足表达式条件的时序。 如果未显示预览图表,并且收到消息“查询未返回结果”,则可能是在预览时间范围内未满足条件。

完成创建规则组

  1. 在“标记”选项卡上,设置要添加到规则组资源的任何所需的 Azure 资源标记。

    显示创建新警报规则时“标记”选项卡的屏幕截图。

  2. “审阅 + 创建”选项卡上,会对规则组进行验证,并告知你存在的任何问题。 在此选项卡上,还可以选择 “查看自动化模板 ”选项,并下载要创建的组的模板。

  3. 验证通过并查看设置后,选择“ 创建”。

    显示创建新警报规则时“查看 + 创建”选项卡的屏幕截图。

  4. 可以跟进规则组部署,以确保它成功完成或收到任何错误通知。

使用 ARM 模板创建 Prometheus 规则组

可以使用 ARM 模板创建和配置 Prometheus 规则组、警报规则和记录规则。 使用 ARM 模板,可以在所有环境中以一致且可重现的方式以编程方式创建和配置规则组。

基本步骤包括:

  1. 将以下模板用作描述如何创建规则组的 JSON 文件。
  2. 使用任何部署方法(例如 Azure 门户Azure CLIAzure PowerShellREST API)部署模板。

Prometheus 规则组的模板示例

以下示例模板创建 Prometheus 规则组,包括一个记录规则和一个警报规则。 此模板将创建类型为 Microsoft.AlertsManagement/prometheusRuleGroups 的资源。 此组的范围仅限于单个 AKS 群集。 规则按组内显示的顺序运行。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [
        {
           "name": "sampleRuleGroup",
           "type": "Microsoft.AlertsManagement/prometheusRuleGroups",
           "apiVersion": "2023-03-01",
           "location": "northcentralus",
           "properties": {
                "description": "Sample Prometheus Rule Group",
                "scopes": [
                    "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/microsoft.monitor/accounts/<azure-monitor-workspace-name>",
                    "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/microsoft.containerservice/managedclusters/<myClusterName>"
                ],
                "enabled": true,
                "clusterName": "<myCLusterName>",
                "interval": "PT1M",
                "rules": [
                    {
                        "record": "instance:node_cpu_utilisation:rate5m",
                        "expression": "1 - avg without (cpu) (sum without (mode)(rate(node_cpu_seconds_total{job=\"node\", mode=~\"idle|iowait|steal\"}[5m])))",
                        "labels": {
                            "workload_type": "job"
                        },
                        "enabled": true
                    },
                    {
                        "alert": "KubeCPUQuotaOvercommit",
                        "expression": "sum(min without(resource) (kube_resourcequota{job=\"kube-state-metrics\", type=\"hard\", resource=~\"(cpu|requests.cpu)\"})) /  sum(kube_node_status_allocatable{resource=\"cpu\", job=\"kube-state-metrics\"}) > 1.5",
                        "for": "PT5M",
                        "labels": {
                            "team": "prod"
                        },
                        "annotations": {
                            "description": "Cluster has overcommitted CPU resource requests for Namespaces.",
                            "runbook_url": "https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubecpuquotaovercommit",
                            "summary": "Cluster has overcommitted CPU resource requests."
                        },
                        "enabled": true,
                        "severity": 3,
                        "resolveConfiguration": {
                            "autoResolved": true,
                            "timeToResolve": "PT10M"
                        },
                        "actions": [
                            {
                               "actionGroupID": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/microsoft.insights/actiongroups/<action-group-name>"
                            }
                        ]
                    }
                ]
            }
        }
    ]
}        

下表描述了规则定义中的每个属性。

规则组

规则组包含以下属性。

名字 必选 类型 DESCRIPTION
name True 字符串 Prometheus 规则组名称。
type True 字符串 Microsoft.AlertsManagement/prometheusRuleGroups
apiVersion True 字符串 2023-03-01
location True 字符串 资源位置不受支持的区域。
properties.description 字符串 规则组说明。
properties.scopes True 字符串[] 必须包含目标 Azure Monitor 工作区 ID。 可以选择再包含一个群集 ID。
properties.enabled 布尔 启用/禁用该组。 默认值为 true
properties.clusterName 字符串 必须与添加到从目标群集中抓取的指标的 cluster 标签匹配。 默认情况下,设置为显示在 scopes[] 中的群集 ID 的最后部分(资源名称)。
properties.interval 字符串 组评估间隔。 默认值 = PT1M

记录规则

rules 部分包含以下记录规则属性。

名字 必选 类型 DESCRIPTION
record True 字符串 记录规则名。 此名称用于新的时间序列。
expression True 字符串 用于计算新时序值的 PromQL 表达式。
labels True 字符串 Prometheus 规则标记键/值对。 这些标签将添加到记录的时序中。
enabled 布尔 启用/禁用组。 默认值为 true

警报规则

rules 部分包含以下警报规则属性。

名字 必选 类型 DESCRIPTION 注释
alert 字符串 警报规则名称。
expression True 字符串 要计算的 PromQL 表达式。
for 字符串 警报触发超时。 值 = PT1MPT5M等等。
labels 对象 将键/值对加上标签。 Prometheus 警报规则标签。 这些标签将添加到此规则触发的警报中。
rules.annotations 对象 要添加到警报的批注键/值对。
enabled 布尔 启用/禁用组。 默认值为 true
rules.severity 整数 警报严重性。 0-4,默认值为 3 (信息性)。
rules.resolveConfigurations.autoResolved 布尔 启用后,当条件不再为 true 时,会自动解除警报。 默认值 = true
rules.resolveConfigurations.timeToResolve 字符串 警报自动解除超时。 默认值 = PT5M
rules.action[].actionGroupId false 字符串 一个或多个操作组资源 ID。 当警报被触发时,每个都会被激活。

将 Prometheus 规则文件转换为 Prometheus 规则组 ARM 模板

如果有 Prometheus 规则配置文件 (采用 YAML 格式),现在可以使用 az-prom-rules-converter 实用工具将其转换为 Azure Prometheus 规则组的 ARM 模板。 规则文件可以包含一个或多个规则组的定义。

除了规则文件,还必须为实用工具提供创建 Azure Prometheus 规则组所需的其他属性。 这些属性包括订阅、资源组、地理位置、目标 Azure Monitor 工作区、目标群集的 ID 和名称以及操作组(用于警报规则)。 该实用工具创建一个模板文件,该文件可以直接部署,也可以在部署管道中部署,其中一些属性作为参数提供。

为实用工具提供的属性用于模板中的所有规则组。 例如,文件中的所有规则组都在同一订阅、资源组和位置中创建,并使用同一 Azure Monitor 工作区。 如果操作组作为实用工具的参数提供,则模板中的所有警报规则都使用相同的操作组。 如果要更改此默认配置(例如,在不同的规则中使用不同的作组),可以在部署模板之前根据需要编辑生成的模板。

注释

az-prom-convert-utility 工具作为免费服务提供。" 建议查看生成的模板,并验证它是否与预期配置匹配。

使用 Azure CLI 创建 Prometheus 规则组

可以使用 Azure CLI 创建和配置 Prometheus 规则组、警报规则和记录规则。 以下示例代码使用 Azure Cloud Shell

  1. 门户中,选择“Cloud Shell”。 在提示符下,使用以下命令。

  2. 若要创建 Prometheus 规则组,请使用 az alerts-management prometheus-rule-group create 命令。 有关此命令的详细信息,请参阅 有关创建和管理 Prometheus 规则组的 Azure CLI 命令的文档

示例:使用规则创建新的 Prometheus 规则组

 az alerts-management prometheus-rule-group create -n TestPrometheusRuleGroup -g TestResourceGroup -l westus --enabled --description "test" --interval PT10M --scopes "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/testrg/providers/microsoft.monitor/accounts/testaccount" --rules [{"record":"test","expression":"test","labels":{"team":"prod"}},{"alert":"Billing_Processing_Very_Slow","expression":"test","enabled":"true","severity":2,"for":"PT5M","labels":{"team":"prod"},"annotations":{"annotationName1":"annotationValue1"},"resolveConfiguration":{"autoResolved":"true","timeToResolve":"PT10M"},"actions":[{"actionGroupId":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/testrg/providers/microsoft.insights/actionGroups/test-action-group-name1","actionProperties":{"key11":"value11","key12":"value12"}},{"actionGroupId":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/testrg/providers/microsoft.insights/actionGroups/test-action-group-name2","actionProperties":{"key21":"value21","key22":"value22"}}]}]

使用 PowerShell 创建新的 Prometheus 规则组

若要使用 PowerShell 创建 Prometheus 规则组,请使用 new-azprometheusrulegroup cmdlet。

示例:使用规则创建 Prometheus 规则组定义

$rule1 = New-AzPrometheusRuleObject -Record "job_type:billing_jobs_duration_seconds:99p5m"
$action = New-AzPrometheusRuleGroupActionObject -ActionGroupId /subscriptions/fffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/MyresourceGroup/providers/microsoft.insights/actiongroups/MyActionGroup -ActionProperty @{"key1" = "value1"}
$Timespan = New-TimeSpan -Minutes 15
$rule2 = New-AzPrometheusRuleObject -Alert Billing_Processing_Very_Slow -Expression "job_type:billing_jobs_duration_seconds:99p5m > 30" -Enabled $false -Severity 3 -For $Timespan -Label @{"team"="prod"} -Annotation @{"annotation" = "value"} -ResolveConfigurationAutoResolved $true -ResolveConfigurationTimeToResolve $Timespan -Action $action
$rules = @($rule1, $rule2)
$scope = "/subscriptions/fffffffff-ffff-ffff-ffff-ffffffffffff/resourcegroups/MyresourceGroup/providers/microsoft.monitor/accounts/MyAccounts"
New-AzPrometheusRuleGroup -ResourceGroupName MyresourceGroup -RuleGroupName MyRuleGroup -Location eastus -Rule $rules -Scope $scope -Enabled

查看 Prometheus 规则组

可以通过以下方法之一在 Azure 门户中查看 Prometheus 规则组及其包含的规则:

  • 门户主页的搜索框中,查找 Prometheus 规则组

  • 门户主页上,选择“ 监视>警报”,然后选择 “Prometheus 规则组”。

    显示如何从警报屏幕查看 Prometheus 规则组的屏幕截图。

  • 在特定 AKS 资源或特定 Azure Monitor 工作区的页面上,选择“ 监视>警报”,然后选择 “Prometheus 规则组 ”以查看此特定资源的规则组列表。 可以从列表中选择要查看或编辑其详细信息的规则组。

查看 Prometheus 规则组的资源运行状况状态

现在可以查看门户中 Prometheus 规则组的资源运行状况状态。 可以检测规则组中的问题,例如配置不正确或查询限制问题。

  1. 门户中,转到要监视的 Prometheus 规则组的概述。

  2. 在左窗格中的“ 帮助”下,选择 “资源运行状况”。

    显示如何查看 Prometheus 规则组的资源运行状况状态的屏幕截图。

  3. “资源运行状况 ”窗格中,可以看到规则组的当前可用性状态。 您还可以查看最近资源健康事件的记录,最长可追溯至过去 30 天。

    显示如何查看 Prometheus 规则组的资源运行状况历史记录的屏幕截图。

    • 如果规则组标记为 “可用”,则会按预期工作。
    • 如果规则组标记为 降级,则组中的一个或多个规则无法按预期工作。 规则查询可能会受到限制,否则其他问题可能会导致规则评估失败。 展开状态条目,了解有关检测到的问题、缓解建议或进一步故障排除的详细信息。
    • 如果规则组标记为 “不可用”,则整个规则组无法按预期工作。 可能存在配置问题(例如,无法检测到 Azure Monitor 工作区)或内部服务问题。 展开状态条目,了解有关检测到的问题、缓解建议或进一步故障排除的详细信息。
    • 如果规则组标记为“未知”,则整个规则组处于禁用状态或处于未知状态。

禁用和启用规则组

若要启用或禁用规则,请在 Azure 门户中选择规则组。 可选择“启用”或“禁用”来更改其状态。