

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 关于警报规则
<a name="v10-alerting-explore-rules"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

警报规则是一组评估标准，用于确定警报实例是否会触发。该规则包含一个或多个查询和表达式、一个条件、评估频率以及开始触发需要满足条件的持续时间。

当查询和表达式选择要评估的数据集时，*条件*设置警报必须达到或超过该阈值才能创建警报。

*时间间隔*指定评估警报规则的频率。配置的*持续时间*表示必须满足条件的持续时间。警报规则还可以定义缺少数据时的警报行为。

**Topics**
+ [警报规则类型](v10-alerting-explore-rules-types.md)
+ [记录规则](v10-alerting-explore-rule-recording.md)
+ [查询和条件](v10-alerting-explore-rules-queries.md)
+ [警报实例](v10-alerting-rules-instances.md)
+ [命名空间、文件夹和组](v10-alerting-rules-grouping.md)
+ [警报规则评估](v10-alerting-rules-evaluation.md)
+ [警报规则的状态和运行状况](v10-alerting-explore-state.md)
+ [通知模板化](v10-alerting-rules-notification-templates.md)

# 警报规则类型
<a name="v10-alerting-explore-rules-types"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

Grafana 支持多种警报规则类型。了解每种警报规则类型及其工作原理，并确定哪种类型最适合您的用例。

## Grafana 管理的警报
<a name="v10-alerting-explore-rule-types-grafana"></a>

Grafana 管理的规则是最灵活的警报规则类型。通过这些规则，您可以创建警报，而这些警报可以作用于任何现有数据来源中的数据。

除了支持多个数据来源，您还可以添加[表达式](v10-panels-query-xform-expressions.md)来转换数据和表示警报条件。

在 Grafana 管理的警报中：
+ 警报规则是在 Grafana 中根据一个或多个数据来源创建的。
+ 警报规则由 Grafana 中的警报规则评估引擎评估。
+ 警报使用内部 Grafana Alertmanager 发送。

**注意**  
您也可以将警报配置为使用外部 Alertmanager 发送，或者同时使用内部和外部 Alertmanager。有关更多信息，请参阅[添加外部 Alertmanager](v10-alerting-setup-alertmanager.md)。

## 数据来源管理的警报
<a name="v10-alerting-explore-rule-types-datasource"></a>

要创建数据来源管理的警报规则，您必须拥有兼容的 Prometheus 或 Loki 数据来源。您可以通过测试数据来源并观察是否支持 Ruler API 来检查您的数据来源是否支持通过 Grafana 创建规则。

在数据来源管理的警报中：
+ 警报规则在数据来源中创建和存储。
+ 警报规则只能基于 Prometheus 数据创建。
+ 警报规则评估和发送分布在多个节点上，以实现高可用性和容错性。

## 选择警报规则类型
<a name="v10-alerting-explore-rule-types-choose"></a>

在选择要使用的警报规则类型时，请考虑以下 Grafana 管理的警报规则和数据来源管理的警报规则之间的比较。


| 功能 | Grafana 管理的警报规则 | Loki/Mimir 管理的警报规则 | 
| --- | --- | --- | 
| 根据我们支持的任何数据来源中的数据创建警报规则 | 是 | 否：您只能创建基于 Prometheus 数据的警报规则。数据来源必须启用 Ruler API。  | 
| 混合搭配数据来源 | 是 | 否 | 
| 包括对记录规则的支持 | 否 | 是 | 
| 添加表达式以转换数据并设置警报条件 | 是 | 否 | 
| 在警报通知中使用映像 | 是 | 否 | 
| 扩展 | 更资源密集型，依赖于数据库，可能会出现暂时性错误。只能垂直扩展。 | 将警报规则存储在数据来源中，并允许“无限”扩展。从数据位置生成和发送警报通知。 | 
| 警报规则评估和发送 | 警报规则评估和发送是在 Grafana 中使用外部 Alertmanager 或两者完成的。 | 警报规则评估和警报发送是分布式的，这意味着不存在单点故障。 | 

# 记录规则
<a name="v10-alerting-explore-rule-recording"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

*记录规则仅适用于兼容的 Prometheus 或 Loki 数据来源。*

记录规则让您可以预先计算经常需要或计算开销较大的表达式，将其结果另存为一组新的时间序列。如果要对聚合数据运行警报，或者如果您的控制面板重复查询计算开销较大的表达式，此功能将非常有用。

查询这个新时间序列的速度更快，特别是对于控制面板而言，因为控制面板每次刷新时都会查询相同的表达式。

阅读有关 Prometheus 中[记录规则](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)的更多信息。

# 查询和条件
<a name="v10-alerting-explore-rules-queries"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

在Grafana中，查询在从支持的数据源获取和转换数据方面起着至关重要的作用，这些数据源包括MySQL和PostgreSQL等数据库、Prometheus、InfluxDB和Graphite等时间序列数据库以及亚马逊、Azure Monitor和谷歌云监控等服务。 OpenSearch CloudWatch

有关支持的数据来源的更多信息，请参阅 [数据来源和 Grafana Alerting](v10-alerting-overview-datasources.md)。

执行查询的过程包括定义数据来源、指定要检索的数据以及应用相关的筛选条件或转换。使用特定于所选数据来源的查询语言或语法来构造这些查询。

在 Alerting 中，定义查询以获取要测量的数据，以及触发警报规则之前需要满足的条件。

警报规则由一个或多个查询和表达式组成，用于选择要测量的数据。

有关查询和表达式的更多信息，请参阅 [查询和转换数据](v10-panels-query-xform.md)。

## 数据来源查询
<a name="v10-alerting-explore-rules-queries-data-source-queries"></a>

Grafana 中的查询可以通过多种方式应用，具体取决于使用的数据来源和查询语言。每个数据来源的查询编辑器都提供了一个自定义的用户界面，可帮助您编写利用其独特功能的查询。

由于查询语言之间的差异，每个数据来源查询编辑器的外观和功能都不同。根据您的数据来源，查询编辑器可能会提供自动完成功能、指标名称、变量建议或可视化查询构建界面。

一些常见的查询组件类型包括：

**指标或数据字段**：指定要检索的特定指标或数据字段，例如 CPU 使用率、网络流量或传感器读数。

**时间范围**：定义要提取数据的时间范围，例如最近一小时、特定日期或自定义时间范围。

**筛选条件**：应用筛选条件，根据特定标准缩小数据范围，例如按特定标签、主机或应用程序筛选数据。

**聚合**：对数据执行聚合，以计算给定时间段内的平均值、总和或计数等指标。

**分组**：按特定维度或标签对数据分组，以创建聚合视图或细分。

**注意**  
Grafana 不支持使用模板变量的警报查询。有关更多信息，请访问[此处](https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514)的 Grafana Labs 论坛。

## 表达式查询
<a name="v10-alerting-explore-rules-queries-expression-queries"></a>

在 Grafana 中，表达式用于对数据来源查询的数据执行计算、转换或聚合。您可以根据数学运算、函数或逻辑表达式创建自定义指标或修改现有指标。

通过利用表达式查询，用户可以执行诸如计算两个值之间的百分比变化、应用对数或三角函数等函数、聚合特定时间范围或维度的数据以及实施条件逻辑来处理不同场景等任务。

在 Alerting 中，您只能对 Grafana 管理的警报规则使用表达式。对于每个表达式，您可以选择 math、reduce 和 resample 表达式。这些表达式称为多维规则，因为它们为每个序列生成单独的警报。

您还可以使用经典条件，该条件创建一个警报规则，在满足条件时触发单个警报。因此，即使满足多个序列的警报条件，Grafana 也只发送一个警报。

**注意**  
经典条件的存在主要是出于兼容性原因，应尽可能避免使用。

**Reduce**

将选定时间范围内的时间序列值聚合为一个值。

**数学**

对时间序列和数字数据执行自由形式的数学运算 functions/operations 。可用于预处理时间序列数据或定义数字数据的警报条件。

**Resample**

将时间范围重新对齐到一组新的时间戳，此功能在比较来自不同数据来源的时间序列数据时很有用，否则时间戳不会对齐。

**Threshold**

检查是否有任何时间序列数据符合阈值条件。

您可以使用阈值表达式比较两个单一值。当条件为 false 时返回 `0`，条件为 true 时，返回 `1`。可使用以下阈值函数：
+ 大于（x > y）
+ 小于（x < y）
+ 在范围内（x > y1 且 x < y2）
+ 超出范围（x < y1 且 x > y2）

**经典条件**

检查是否有任何时间序列数据符合警报条件。

**注意**  
无论有多少个时间序列满足条件，经典条件表达式查询始终只生成一个警报实例。经典条件的存在主要是出于兼容性原因，应尽可能避免使用。

## 聚合
<a name="v10-alerting-explore-rules-queries-aggregations"></a>

Grafana Alerting 提供以下聚合函数，使您能够进一步优化查询。

这些函数仅适用于 **Reduce** 和**经典条件**表达式。


| 函数 | Expression | 作用 | 
| --- | --- | --- | 
| avg | Reduce/经典 | 显示平均值 | 
| min | Reduce/经典 | 显示最低值 | 
| max | Reduce/经典 | 显示最高值 | 
| sum | Reduce/经典 | 显示所有值的和 | 
| count | Reduce/经典 | 计算结果中值的数量 | 
| last | Reduce/经典 | 显示最后一个值 | 
| median | Reduce/经典 | 显示中位值 | 
| diff | Classic | 显示最新值和最旧值的差值 | 
| diff\$1abs | Classic | 显示差值的绝对值 | 
| percent\$1diff | Classic | 显示最新值和最旧值的百分比差值 | 
| percent\$1diff\$1abs | Classic | 显示百分比差值的绝对值 | 
| count\$1non\$1null | Classic | 显示结果集中非 null 值的计数 | 

## 警报条件
<a name="v10-alerting-explore-rules-queries-alert-condition"></a>

警报条件是一个查询或表达式，可根据警报产生的值决定是否触发警报。触发警报的条件只能有一个。

定义查询 and/or 表达式后，选择其中一个作为警报规则条件。

当查询的数据满足定义的条件时，Grafana 会触发关联的警报，该警报可以配置为通过各种渠道发送通知，例如电子邮件、Slack 或。 PagerDuty通知会通知您满足的条件，以便您采取适当的措施或调查潜在问题。

默认情况下，最后添加的表达式用作警报条件。

## 恢复阈值
<a name="v10-alerting-explore-rules-queries-recovery-threshold"></a>

为了减少警报抖动带来的噪音，您可以设置一个不同于警报阈值的恢复阈值。

当指标徘徊在警报阈值条件附近时，就会出现抖动警报，这可能会导致频繁的状态变化，从而生成过多的通知。

Grafana 管理的警报规则将在特定的时间间隔内评估。在每次评估期间，都会根据警报规则中设置的阈值检查查询结果。如果指标的值高于阈值，则会触发警报规则并发送通知。当该值低于阈值，且该指标存在活动警报时，警报将得到解决，并发送另一个通知。

为有噪声的指标创建警报规则可能很麻烦。也就是说，指标的值持续高于或低于阈值。这称为抖动，并导致一系列“触发-已解决-触发”通知和嘈杂的警报状态历史记录。

例如，如果您有一个阈值为 1000 毫秒的延迟警报，并且该数字在 1000 附近波动（例如 980 ->1010 -> 990 -> 1020 等），则每个警报都将触发通知。

要解决此问题，您可以设置一个（自定义）恢复阈值，这基本上意味着有两个阈值而不是一个。当超过第一个阈值时会触发警报，只有在超过第二个阈值时才会解决。

例如，您可以将阈值设置为 1000 毫秒，将恢复阈值设置为 900 毫秒。这样，警报规则仅在低于 900 毫秒时停止触发，并且抖动减少。

# 警报实例
<a name="v10-alerting-rules-instances"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

Grafana 管理的警报支持多维警报。每条警报规则可以生成多个警报实例。如果您在单个表达式中观察到多个序列，这将非常有用。

请看下面的 PromQL 表达式：

```
sum by(cpu) (
  rate(node_cpu_seconds_total{mode!="idle"}[1m])
)
```

使用此表达式的规则将创建的警报实例数量与 CPUs 我们在第一次评估后观察到的数量一样多，从而允许一条规则报告每个 CPU 的状态。

# 命名空间、文件夹和组
<a name="v10-alerting-rules-grouping"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

您可以使用 Grafana 管理的规则文件夹以及 Mimir、Loki 或 Prometheus 规则和组名称的命名空间来整理警报。

**命名空间和文件夹**

创建 Grafana 管理的规则时，可使用文件夹执行访问控制，并授予或拒绝对特定文件夹内所有规则的访问权限。

一个命名空间包含一个或多个组。组中的规则以固定时间间隔按顺序运行。默认的时间间隔为一分钟。您可以重命名 Grafana Mimi 或 Loki 规则命名空间和组，并编辑组评估间隔。

**组**

组中的规则以固定的间隔按顺序运行，这意味着不会同时评估任何规则，并按显示顺序评估。默认的时间间隔为一分钟。您可以重命名 Grafana Mimir 或 Loki 规则命名空间或 Loki 规则命名空间和组，并编辑组评估间隔。

**提示**  
如果您希望按不同的时间间隔同时评估规则，请考虑将其存储在不同的组中。

**注意**  
Grafana 管理的警报规则是同时评估，而不是按顺序评估的。

# 警报规则评估
<a name="v10-alerting-rules-evaluation"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

使用警报规则评估来确定评估警报规则的频率以及更改状态的速度。

为此，您需要确保警报规则位于正确的评估组中，并设置最适合用例的待处理时间段。

## 评估组
<a name="v10-alerting-rules-evaluation-group"></a>

每个警报规则都是评估组的一部分。每个评估组都包含一个评估间隔，用于确定检查警报规则的频率。

同一组中**数据来源管理的**警报规则会逐一评估，而不同组中的警报规则可同时评估。当您要确保在任何警报规则之前评估记录规则时，此功能特别有用。

无论警报规则组如何，**Grafana 管理的**警报规则都会同时评估。默认评估间隔设置为 10 秒，这意味着 Grafana 管理的警报规则每 10 秒评估一次，评估时间接近时钟上的 10 秒窗口，例如 10:00:00、10:00:10、10:00:20 等。如果需要，您还可以配置自己的评估间隔。

**注意**  
通知策略中的评估组和警报分组是两个独立的东西。通知策略中的分组允许在同一时间消息中发送共享标签的多个警报。

## 待处理期
<a name="v10-alerting-rules-evaluation-pending-period"></a>

设置待处理期后，可以避免因临时问题而发出不必要的警报。

在待处理期，您可以选择警报规则在触发之前可以违反条件的时段。

**示例**

假设您将警报规则评估间隔设置为每 30 秒一次，将待处理期设置为 90 秒。

评估方式如下：

[00:30] 第一次评估 - 未满足条件。

[01:00] 第二次评估 - 违反条件。待处理计数器启动。**警报开始待处理。**

[01:30] 第三次评估 - 违反条件。待处理计数器 = 30 秒。**待处理状态。**

[02:00] 第四次评估 - 违反条件。待处理计数器 = 60 秒**待处理状态。**

[02:30] 第五次评估 - 违反条件。待处理计数器 = 90 秒。**警报开始触发**

如果警报规则有一个条件，需要在违反该条件一定时间后才能采取行动，则其状态将发生如下变化：
+ 第一次违反条件时，规则将进入“待处理”状态。
+ 规则一直处于“待处理”状态，直到在规定的时间（待处理期）内违反条件。
+ 一旦过了规定的时间，规则就会进入“触发”状态。
+ 如果在待处理期不再违反条件，规则就会恢复到正常状态。

**注意**  
如果要跳过待处理状态，只需将待处理期设置为 0。这实际上跳过了待处理期，一旦违反条件，警报规则就会立即触发。

当警报规则触发时，会生成警报实例，然后发送到 Alertmanager。

# 警报规则的状态和运行状况
<a name="v10-alerting-explore-state"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

警报规则的状态和运行状况可帮助您了解有关警报的几个关键状态指标。

有三个关键组件：*警报规则状态*、*警报实例状态*和*警报规则运行状况*。尽管相关，但每个组件传达的信息略有不同。

**警报规则状态**

警报规则可能处于以下状态之一：


| 州 | 说明 | 
| --- | --- | 
| Normal | 评估引擎返回的时间序列均未处于 `Pending` 或 `Firing` 状态。 | 
| 待定 | 评估引擎返回的时间序列中至少有一个处于 `Pending` 状态。 | 
| 触发 | 评估引擎返回的时间序列中至少有一个处于 `Firing` 状态。 | 

**注意**  
警报先过渡到 `pending`，然后过渡到 `firing`，因此至少需要两个评估周期才会触发警报。

**警报实例状态**

警报实例可能处于以下状态之一：


| 州 | 说明 | 
| --- | --- | 
| Normal | 警报的状态既不是触发也不是待处理，一切正常。 | 
| 待定 | 警报处于活动状态的时间少于配置的阈值持续时间。 | 
| 警报 | 警报处于活动状态的时间超过配置的阈值持续时间。 | 
| NoData | 在配置的时间窗口内未收到任何数据。 | 
| 错误 | 尝试评估警报规则时发生的错误。 | 

**保留上一状态**

可以将警报规则配置为在遇到 `NoData` 或 `Error` 状态时保留上一个状态。这既可以防止警报触发，也可以阻止解决和重新触发。与正常评估一样，待处理期过后，警报规则将从 `Pending` 变为 `Firing`。

**警报规则运行状况**

警报规则可能具有以下运行状况之一：


| 州 | 说明 | 
| --- | --- | 
| 确定 | 评估警报规则时无错误。 | 
| 错误 | 在评估警报规则时发生错误。 | 
| NoData | 规则评估期间返回的至少一个时间序列中没有数据。 | 

**`NoData` 和 `Error` 的特殊警报**

当警报规则的评估产生 `NoData` 或 `Error` 状态时，Grafana Alerting 将生成具有以下附加标签的特殊警报：


| 标签 | 说明 | 
| --- | --- | 
| alertname | `DatasourceNoData` 或 `DatasourceError`，视状态而定。 | 
| datasource\$1uid | 导致该状态的数据来源 UID。 | 

您可以像处理常规警报一样处理这些警报，方法是添加静默、路由到联系点等。

# 通知模板化
<a name="v10-alerting-rules-notification-templates"></a>

****  
本文档主题专为支持 **Grafana 10.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 9.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 9](using-grafana-v9.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

通过联系点发送的通知是使用通知模板生成的。Grafana 的默认模板基于 [Go 模板系统](https://golang.org/pkg/text/template)，其中一些字段作为文本评估，而另一些字段则作为 HTML 评估（可能会影响转义）。

默认模板 [default\$1template.go](https://github.com/grafana/alerting/blob/main/templates/default_template.go) 是自定义模板的有用参考。

大部分联系点字段都可以模板化，因此您可以创建可重复使用的自定义模板，并在多个联系点中使用它们。要了解使用模板的自定义通知，请参阅 [自定义通知](v10-alerting-manage-notifications.md)。

**嵌套模板**

您可以将模板嵌入到其他模板中。

例如，您可以使用 `define` 关键字定义一个模板片段：

```
{{ define "mytemplate" }}
  {{ len .Alerts.Firing }} firing. {{ len .Alerts.Resolved }} resolved.
{{ end }}
```

然后，您可以使用 `template` 关键字将自定义模板嵌入到此片段中。例如：

```
Alert summary:
{{ template "mytemplate" . }}
```

您可以使用以下内置模板选项嵌入自定义模板。


| Name | 注意 | 
| --- | --- | 
| `default.title` | 显示概览状态信息。 | 
| `default.message` | 提供已触发和已解决警报的格式化摘要。 | 
| `teams.default.message` | 类似于 `default.messsage`，针对 Microsoft Teams 进行了格式化。 | 

**通知模板中的 HTML**

警报通知模板中的 HTML 已转义。不支持在生成的通知中渲染 HTML。

某些通知程序支持其他更改通知外观的方法。例如，Grafana 会将警报电子邮件的基本模板安装到 `<grafana-install-dir>/public/emails/ng_alert_notification.html`。您可以编辑此文件，以更改所有警报电子邮件的外观。