本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
编写表达式查询
本文档主题专为支持 Grafana 版本 10.x 的 Grafana 工作空间而设计。
有关支持 Grafana 9.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 9 中工作
有关支持 Grafana 8.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 8 中工作
服务器端表达式允许您使用数学和其他运算来操作查询返回的数据。表达式创建新数据,并且不操作数据源返回的数据。
关于表达式
服务器端表达式允许您使用数学和其他运算来操作查询返回的数据。表达式会创建新数据,并且不操纵数据源返回的数据,此外还会进行一些细微的数据重组,使表达式可以接受的数据输入。
使用表达式
Grafana 提醒最常用的是表达式。处理是在服务器端完成的,因此表达式无需浏览器会话即可运行。但是,表达式也可以用于后端数据源和可视化。
注意
表达式不适用于旧版仪表板警报。
表达式旨在通过允许合并来自不同数据源的查询或提供数据源中不可用的操作来增强数据源。
注意
如果可能,您应该在数据源内部进行数据处理。将数据从存储器复制到 Grafana 服务器进行处理效率低下,因此表达式的目标是轻量级数据处理。
表达式适用于返回时间序列或数值数据的数据源查询。它们还对多维数据进行操作。例如,返回多个系列的查询,其中每个系列由标签或标签标识。
单个表达式将一个或多个查询或其他表达式作为输入,并将数据添加到结果中。每个单独的表达式或查询都由一个变量表示,该变量是一个命名标识符,称为其 RefID(例如,默认字母A
或B
)。
要在另一个表达式中引用单个表达式或数据源查询的输出,此标识符可用作变量。
表达式的类型
表达式可以处理两种类型的数据。
-
时间序列的集合。
-
数字的集合,其中每个数字都是一个项目。
每个集合均从单个数据源查询或表达式返回,并由 ReFID 表示。每个集合都是一个集合,其中集合中的每个项目都由其尺寸唯一标识,这些维度存储为标签或键值对。
数据源查询
服务器端表达式仅支持后端数据源的数据源查询。通常假设这些数据被标记为时间序列数据。
与表达式一起使用时,数据源查询由表达式引擎运行。当它这样做时,它会将数据重组为一个时间序列或每个数据帧一个数字。因此,例如,如果使用的数据源在表格视图中的一个帧上返回多个系列,则在使用表达式运行时,您可能会注意到它看起来有所不同。
当前,使用数据框时仅支持非时间序列格式(数字),即您的表响应返回一个没有时间、字符串列和一个数字列的数据框:
下表示例生成了一个适用于表达式的数字。字符串列成为标签,数字列成为相应的值。例如{"Loc": "MIA", "Host": "A"}
,值为 1。
Loc | Host | 平均CPU |
---|---|---|
MIA |
A |
1 |
NYC |
B |
2 |
操作
你可以在表达式中使用以下运算:数学、简化和重采样。
数学
数学适用于时间序列或数字数据的自由形式数学公式。数学运算将数字和时间序列作为输入,并将其更改为不同的数字和时间序列。
例如,来自其他查询或表达式的数据使用带有美元符号前缀的 RefID 进行引用。$A
如果变量的名称中包含空格,则可以使用大括号语法,例如${my
variable}
。
数字常量可以是十进制 (2.24
)、八进制(前导零类似072
)或十六进制(前导 0x 类似)。0x2A
还支持指数和符号(例如)。-0.8e-2
运算符
支持算术(+
、二进制和一元-
、*
、、/
%
、指数**
)、关系运算符(<
、、>
、==
、!=
、>=
、<=
)和逻辑(&&
||
、和一元!
)运算符。
操作如何处理数据取决于它是数字还是时间序列数据。
对于二进制运算(例如$A + $B
或)$A || $B
,运算符的应用方式取决于数据的类型:
-
如果
$A
和$B
都是一个数字,则在两个数字之间执行运算。 -
如果一个变量是数字,而另一个变量是时间序列,则在时间序列中每个点的值和数字之间执行运算。
-
如果
$A
和$B
都是时间序列数据,则对和中存在的每个时间戳执行两个序列中每个值之间的运算$B
。$A
该Resample
操作可用于排列时间戳。
摘要:
-
数字<Operation>数字 = 数字
-
数字<Operation>系列 = 系列
-
系列<Operation>系列 = 系列
由于表达式适用于由单个变量表示的多个序列或数字,因此二进制运算还会在两个变量之间执行联合(连接)。这是根据与每个系列或数字关联的识别标签完成的。
因此,如果您的数字带有类似{host=web01}
于in的标签,$A
而另一个数字中的$B
标签相同,则在每个变量中的这两个项目之间执行操作,结果将共享相同的标签。该工会的行为规则如下:
-
没有标签的物品会加入任何东西。
-
如果两者都
$A
只包含一个项目(一个系列或一个数字),则它们将合并。$B
-
如果标签完全匹配,它们就会加入。
-
如果标签是其他标签的子集,例如,中的一个项目被标记
{host=A,dc=MIA}
了,里面的项目$A
被贴上了标签,$B
那么{host=A}
它们就会加入。 -
如果在变量中(例如每个项目
$A
都有不同的标签键),则联接行为未定义。
关系运算符和逻辑运算符返回 0 表示假 1 表示真。
数学函数
虽然大多数函数存在于自己的表达式运算中,但数学运算确实有一些类似于数学运算符或符号的函数。当函数可以采用数字或序列时,将返回与参数相同的类型。当它是一个系列时,对序列中每个点的值执行的运算。
腹肌
abs 返回其参数的绝对值,可以是数字或序列。例如,abs(-1)
或 abs($A)
。
is_inf
is_inf 取一个数字或一个序列并返回1
Inf
值(负数或正数)和其他0
值。例如 is_inf($A)
。
注意
例如,如果你需要专门检查负无穷大,你可以做一个比较,比如$A == infn()
。
is_nan
is_nan 接受一个数字或一个序列并返回1
NaN
值和其他值。0
例如 is_nan($A)
。此项检查需要此函数NaN
,因为它不等于NaN
。
is_null
is_null 接受一个数字或一个序列并返回1
null
值和其他值。0
例如 is_null($A)
。
is_number
is_number 采用一个数字或一个序列,并0
返回1
所有实数值和其他值(即null
、Inf+
Inf-
、和NaN
)。例如 is_number($A)
。
日志
Log 返回其参数的自然对数,可以是数字或序列。如果该值小于 0,NaN
则返回。例如,log(-1)
或 log($A)
。
inf、infn、nan 和 null
inf、infn、nan 和 null 函数都返回名称的单个值。它们主要是为了测试而存在的。示例:null()
。
round
四舍五入返回一个四舍五入的整数值。例如,round(3.123)
或 round($A)
。
ceil
Ceil 将数字向上舍入到最接近的整数值。例如,ceil(3.123)
将返回 4
。
floor
Floor 将数字向下舍入到最接近的整数值。例如,floor(3.123
) 返回3
。
减少
Reduce 获取从查询或表达式返回的一个或多个时间序列,并将每个序列转换为单个数字。时间序列的标签作为标签保存在每个输出的缩减数字上。
字段:
-
函数-要使用的还原函数
-
输入-要重采样的变量(RefID(例如
A
)) -
模式 — 当序列包含非数值(null、NaN、+-Inf)时,允许控制归约函数的行为
还原函数
计数
Count 返回每个系列中的分数。
平均值
Mean 返回每个系列中所有值的总和除以该系列中的点数。在strict
模式下,如果系列中的任何值为 null 或 nan,或者序列为空,则返回 NaN。
最小值和最大值
Min 和 Max 分别返回序列中的最小值或最大值。在strict
模式下,如果系列中的任何值为 null 或 nan,或者序列为空,则返回 NaN。
总计
Sum 返回该系列中所有值的总和。如果系列的长度为零,则总和将为 0。在strict
模式下,如果序列中有任何 NaN 或 Null 值,则返回 NaN。
最后一次
Last 返回序列中的最后一个数字。如果该系列没有值,则返回 NaN。
还原模式
严格
在严格模式下,按原样处理输入序列。如果该系列中有非数字值(空、NaN 或 +-Inf),则返回 NaN。
删除非数字
在此模式下,在运行归约函数之前,输入序列中的所有非数字值(null、NaN 或 +-Inf)都将被过滤掉。
替换非数字
在此模式下,所有非数字值都将替换为预定义的值。
重新采样
Resample 会将每个时间序列中的时间戳更改为具有一致的时间间隔。主要的用例是,你可以对不共享相同时间戳的时间序列进行重新采样,这样就可以在它们之间进行数学运算。这可以通过对两个系列中的每个系列进行重新采样,然后在数学运算中引用重新采样的变量来完成。
字段:
-
输入-要重采样的时间序列数据(ReFID(例如
A
))的变量 -
重采样至-例如,要重新采样的持续时间。
10s
单位可以是s
秒、m
分钟、h
小时、d
天、w
周和y
年。 -
Downsample — 当每个窗口样本有多个数据点时使用的还原函数。有关行为的详细信息,请参阅还原操作。
-
Upsample — 用于填充没有数据点的窗口样本的方法。
-
pad 填充上次已知的值
-
用下一个已知值进行@@ 回填
-
fillna 用来填充空白的样本窗口 NaNs
-
写一个表达式
如果您的数据源支持表达式,Grafana 会显示表达式按钮,并在查询编辑器列表中显示所有现有表达式。
写一个表达式
-
打开面板。
-
在查询下方,选择表达式。
-
在 “操作” 字段中,选择要编写的表达式类型。
-
写下表达式。
-
选择 应用。
特殊案例
当任何查询的数据源均未返回序列或数字时,表达式引擎将返回NoData
。例如,如果一个请求包含两个由表达式合并的数据源查询,如果NoData
至少有一个数据源查询返回,则整个查询的返回结果为NoData
。有关 Grafana 警报NoData
如何处理结果的更多信息,请参阅。配置 Grafana 托管警报规则
如果在多个查询中使用表达式,则表达式引擎要求所有查询都返回相同的时间戳。例如,如果使用数学来合并每个查询使用的多个 SQL 查询的结果SELECT NOW() AS "time"
,则只有当所有查询的计算NOW()
结果都相同的时间戳时,表达式才会起作用,而这种情况并不总是会发生。要解决此问题,可以NOW()
替换为任意时间SELECT 1 AS "time"
,例如或任何其他有效的 UNIX 时间戳。