菜单
Grafana Cloud Enterprise 开源

查询和条件

在 Grafana 中,查询从数据源获取和转换数据,这些数据源包括 MySQL 或 PostgreSQL 等数据库、Prometheus 或 InfluxDB 等时间序列数据库,以及 Amazon CloudWatch 或 Azure Monitor 等服务。

告警规则定义了以下组成部分

  • 指定要从数据源检索的数据的查询,其语法取决于使用的数据源类型。
  • 在触发告警规则之前必须满足的条件
  • 用于对检索到的数据执行转换的可选表达式

告警定期运行查询和表达式,评估条件。如果条件被违反,则为每个时间序列触发一个告警实例。

数据源查询

告警查询与 Grafana 面板中使用的查询相同,但 Grafana 管理的告警仅限于查询已启用告警的数据源

Grafana 中的查询可以根据使用的数据源和查询语言以各种方式应用。每个数据源的查询编辑器都提供了一个定制的用户界面,帮助您编写利用其独特功能的查询。

有关 Grafana 中查询的更多详细信息,请参阅查询和转换数据

Define alert query and alert condition
定义告警查询和告警条件

告警条件

告警条件是确定告警是否触发的查询或表达式,具体取决于值是否满足指定的比较。只有一个条件决定告警的触发。

如果查询的数据满足定义的条件,Grafana 就会触发告警。

使用默认选项时,When 输入会缩减查询数据,最后一个输入定义阈值条件。

使用高级选项时,您必须选择其中一个查询或表达式作为告警条件。

高级选项:表达式

表达式仅适用于 Grafana 管理的告警,并且在启用高级选项时可用。

在 Grafana 中,表达式允许您对查询到的数据执行计算、转换或聚合。它们通过数学运算、函数或逻辑表达式来修改现有指标。

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

Alert rule expressions
告警规则表达式

以下表达式可用

缩减

将选定时间范围内的时序数据值聚合为单个数字。

缩减接受一个或多个时间序列,并将每个序列转换为一个单独的数字,然后可以在告警条件中进行比较。

包含以下聚合函数: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)带来的干扰,您可以设置一个恢复阈值,以便告警仅在跨越恢复阈值后才返回 NormalRecovering 状态。

告警状态频繁切换发生在查询值反复跨越告警阈值的上下,导致状态频繁变化。这会导致一系列触发-恢复-再次触发的通知以及嘈杂的告警状态历史。

例如,如果您的延迟告警阈值为 1000ms,且数值在 1000 附近波动(例如 980 -> 1010 -> 990 -> 1020 等),那么每次波动都可能触发通知

  • 980 -> 1010 触发一个触发中的告警。
  • 1010 -> 990 触发一个恢复中的告警。
  • 990 -> 1020 再次触发一个触发中的告警。

为了防止这种情况,您可以设置一个恢复阈值来定义两个阈值而不是一个

  1. 当跨越告警阈值时,告警转换为 Pending(待处理)或 Alerting(触发中)状态。
  2. 然后,仅当跨越恢复阈值时,告警才转换为 Recovering(恢复中)或 Normal(正常)状态。

在前面的示例中,将恢复阈值设置为 900ms 意味着告警仅在延迟降至 900ms 以下时才恢复正常

  • 980 -> 1010 触发一个触发中的告警。
  • 1010 -> 990 不会使告警恢复,而是保持在触发中状态。
  • 990 -> 1020 保持告警在触发中状态。

恢复阈值可以减少不必要的告警状态变化并降低告警噪音。

对数字数据进行告警

在某些数据源中,非时间序列的数字数据可以直接用于告警,或传递到服务器端表达式 (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/etc3
2021 年 6 月 7 日web2/var4
2021 年 6 月 7 日web3/var8

您可以查询按时间筛选的数据,但无需将时间序列返回到 Grafana。例如,当空闲空间小于 5% 时,为每个主机和磁盘触发一个告警

sql
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/etc3
web2/var4
web3/var0

当此查询用作告警规则中的条件时,非零结果将触发告警。因此,将产生三个告警实例

标签状态
{Host=web1,disk=/etc}告警
{Host=web2,disk=/var}告警
{Host=web3,disk=/var}正常