

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

# 查询和条件
<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 毫秒时停止触发，并且抖动减少。