查询和条件
在 Grafana 中,查询从数据源获取和转换数据,这些数据源包括 MySQL 或 PostgreSQL 等数据库、Prometheus 或 InfluxDB 等时间序列数据库,以及 Amazon CloudWatch 或 Azure Monitor 等服务。
告警规则定义了以下组成部分
告警定期运行查询和表达式,评估条件。如果条件被违反,则为每个时间序列触发一个告警实例。
数据源查询
告警查询与 Grafana 面板中使用的查询相同,但 Grafana 管理的告警仅限于查询已启用告警的数据源。
Grafana 中的查询可以根据使用的数据源和查询语言以各种方式应用。每个数据源的查询编辑器都提供了一个定制的用户界面,帮助您编写利用其独特功能的查询。
有关 Grafana 中查询的更多详细信息,请参阅查询和转换数据。

告警条件
告警条件是确定告警是否触发的查询或表达式,具体取决于值是否满足指定的比较。只有一个条件决定告警的触发。
如果查询的数据满足定义的条件,Grafana 就会触发告警。
使用默认选项时,When
输入会缩减查询数据,最后一个输入定义阈值条件。
使用高级选项时,您必须选择其中一个查询或表达式作为告警条件。
高级选项:表达式
表达式仅适用于 Grafana 管理的告警,并且在启用高级选项时可用。
在 Grafana 中,表达式允许您对查询到的数据执行计算、转换或聚合。它们通过数学运算、函数或逻辑表达式来修改现有指标。
通过表达式查询,您可以执行计算两个值之间的百分比变化、应用对数或三角函数等函数、在特定时间范围或维度上聚合数据以及实现条件逻辑来处理不同场景等任务。

以下表达式可用
缩减
将选定时间范围内的时序数据值聚合为单个数字。
缩减接受一个或多个时间序列,并将每个序列转换为一个单独的数字,然后可以在告警条件中进行比较。
包含以下聚合函数:Min
(最小值)、Max
(最大值)、Mean
(平均值)、Mediam
(中位数)、Sum
(总和)、Count
(计数) 和 Last
(最新值)。
数学计算
对时序数据和数字执行自由形式的数学函数/运算。例如,$A + 1
或 $A * 100
。
如果比较的查询结果中包含多个序列,则来自不同查询的序列如果具有相同的标签,将被匹配(连接)。例如
$A
返回序列{host=web01} 30
和{host=web02} 20
$B
返回序列{host=web01} 10
和{host=web02} 0
$A + $B
返回{host=web01} 40
和{host=web02} 20
。
在这种情况下,只有具有匹配标签的序列会被连接,并在它们之间进行计算。
有关数学计算如何处理不同数据类型的其他场景,请参阅数学计算文档。
您还可以使用数学表达式来定义告警条件。例如
- 如果 B 的值(查询或表达式)大于 70,则应触发
$B > 70
告警。 - 如果 B 的值小于 C 的值乘以 100,则应触发
$B < $C * 100
告警。
重采样
将时间范围重新对齐到一组新的时间戳,这在比较来自不同数据源的时序数据时非常有用,否则时间戳可能不对齐。
阈值
将先前查询或表达式中的单个数字(例如,$A
,$B
)与指定条件进行比较。它常用于定义告警条件。
阈值表达式允许比较两个单个值。可用的阈值函数有
- 高于:
$A > 5
- 低于:
$B < 3
- 等于:
$A == 2
- 不等于:
$B != 4
- 高于或等于:
$A >= 8
- 低于或等于:
$B <= 16
- 在范围内:
$A > 0 AND $A < 10
- 在范围外:
$B < 0 OR $B > 100
- 在范围内(包含边界):
$A >= 0 AND $A <= 10
- 在范围外(包含边界):
$B <= 0 OR $B >= 100
条件为假时,阈值返回 0
;条件为真时,返回 1
。
如果将阈值设置为告警条件,则当阈值返回 1
时,告警触发。
恢复阈值
为了减少告警状态频繁切换(Flapping alerts)带来的干扰,您可以设置一个恢复阈值,以便告警仅在跨越恢复阈值后才返回 Normal
或 Recovering
状态。
告警状态频繁切换发生在查询值反复跨越告警阈值的上下,导致状态频繁变化。这会导致一系列触发-恢复-再次触发的通知以及嘈杂的告警状态历史。
例如,如果您的延迟告警阈值为 1000ms,且数值在 1000 附近波动(例如 980 -> 1010 -> 990 -> 1020 等),那么每次波动都可能触发通知
- 980 -> 1010 触发一个触发中的告警。
- 1010 -> 990 触发一个恢复中的告警。
- 990 -> 1020 再次触发一个触发中的告警。
为了防止这种情况,您可以设置一个恢复阈值来定义两个阈值而不是一个
- 当跨越告警阈值时,告警转换为
Pending
(待处理)或Alerting
(触发中)状态。 - 然后,仅当跨越恢复阈值时,告警才转换为
Recovering
(恢复中)或Normal
(正常)状态。
在前面的示例中,将恢复阈值设置为 900ms 意味着告警仅在延迟降至 900ms 以下时才恢复正常
- 980 -> 1010 触发一个触发中的告警。
- 1010 -> 990 不会使告警恢复,而是保持在触发中状态。
- 990 -> 1020 保持告警在触发中状态。
恢复阈值可以减少不必要的告警状态变化并降低告警噪音。
经典条件(旧版)
经典条件主要出于兼容性原因而存在,应尽可能避免使用。
经典条件检查是否有任何时序数据符合告警条件。无论有多少时间序列满足条件,它始终只生成一个告警实例。
条件运算符 | 工作原理 |
---|---|
and (且) | 前后的两个条件都必须为真,整个条件才为真。 |
or (或) | 如果前后的条件中有一个为真,则整个条件为真。 |
logic-or (逻辑或) | 如果 logic-or 之前的条件为真,则整个条件立即为真,不再评估后续条件。例如,TRUE and TRUE logic-or FALSE and FALSE 的评估结果为 TRUE ,因为前一个条件返回 TRUE 。 |
以下聚合函数也可用于进一步优化您的查询。
函数 | 作用 |
---|---|
avg (平均值) | 显示值的平均值 |
min (最小值) | 显示最低值 |
max (最大值) | 显示最高值 |
sum (总和) | 显示所有值的总和 |
count (计数) | 计算结果中的值数量 |
last (最新值) | 显示最新值 |
median (中位数) | 显示中位数 |
diff (差值) | 显示最新值和最旧值之间的差值 |
diff_abs (绝对差值) | 显示差值的绝对值 |
percent_diff (百分比差值) | 显示最新值和最旧值之间差值的百分比值 |
percent_diff_abs (绝对百分比差值) | 显示 percent_diff 的绝对值 |
count_non_null (非空计数) | 显示结果集中非 null 值的数量 |
对数字数据进行告警
在某些数据源中,非时间序列的数字数据可以直接用于告警,或传递到服务器端表达式 (SSE) 中。这允许在数据源内进行更多处理并提高效率,还可以简化告警规则。当对数字数据而不是时间序列数据进行告警时,无需将每个带标签的时间序列缩减为单个数字。相反,Grafana 会接收到带标签的数字。
表格数据
此功能支持查询表格数据的后端数据源
- SQL 数据源,例如 MySQL、Postgres、MSSQL 和 Oracle。
- 基于 Azure Kusto 的服务:Azure Monitor (Logs)、Azure Monitor (Azure Resource Graph) 和 Azure Data Explorer。
对于这些数据源,使用 Grafana 管理的告警或 SSE 的查询被视为数字查询,如果
- 数据源查询中的“格式化为”选项设置为“表格”。
- 从查询返回到 Grafana 的表格响应仅包含一个数字列(例如 int、double、float),以及可选的附加字符串列。
如果存在字符串列,则这些列将成为标签。列名成为标签名称,每行中的值成为对应标签的值。如果返回多行,则每行应通过其标签唯一标识。
示例
对于名为“DiskSpace”的 MySQL 表
时间 | 主机 | 磁盘 | 空闲百分比 |
---|---|---|---|
2021 年 6 月 7 日 | web1 | /etc | 3 |
2021 年 6 月 7 日 | web2 | /var | 4 |
2021 年 6 月 7 日 | web3 | /var | 8 |
您可以查询按时间筛选的数据,但无需将时间序列返回到 Grafana。例如,当空闲空间小于 5% 时,为每个主机和磁盘触发一个告警
SELECT Host, Disk, CASE WHEN PercentFree < 5.0 THEN PercentFree ELSE 0 END FROM (
SELECT
Host,
Disk,
Avg(PercentFree)
FROM DiskSpace
Group By
Host,
Disk
Where __timeFilter(Time)
此查询返回以下表格响应到 Grafana
主机 | 磁盘 | 空闲百分比 |
---|---|---|
web1 | /etc | 3 |
web2 | /var | 4 |
web3 | /var | 0 |
当此查询用作告警规则中的条件时,非零结果将触发告警。因此,将产生三个告警实例
标签 | 状态 |
---|---|
{Host=web1,disk=/etc} | 告警 |
{Host=web2,disk=/var} | 告警 |
{Host=web3,disk=/var} | 正常 |