Prometheus 的查询语言支持基本的逻辑和算术运算符。对于两个瞬时向量之间的操作,可以修改匹配行为。
Prometheus 中存在以下 二元算术运算符:
+ (加法)
- 减法
*(乘法)
/(除法)
%(模)
^(幂/幂级数)
二元算术运算符在标量/标量、向量/标量和向量/向量值对之间定义:
(1)在两个标量之间,行为是显而易见的:它们会求值到另一个标量,该标量是运算符应用于两个标量操作数的结果。
(2)在瞬时向量和标量之间,运算符适用于向量中每个数据样本的值。例如,如果一个时间序列瞬时向量乘以 2,结果就是另一个向量,其中原始向量的每个样本值都乘以 2。
(3)在两个瞬时向量之间,对左侧向量中的每个条目及其右侧向量中的匹配元素应用二元算术运算。运算结果传播到结果向量中,分组标签成为输出标签集。指标名称将被删除。在右侧向量中找不到匹配项的条目将不在结果中。
Prometheus 中存在下列以弧度为单位的三角二元运算符:
atan2 (以 https://pkg.go.dev/math#Atan2 为基础)
三角运算符允许使用向量匹配在两个向量上执行三角函数,这是普通函数所不具备的,它们的作用方式与算术运算符相同。
Prometheus 中存在以下二元比较运算符:
== (等于)
!= (不等于)
> (大于)
< (小于)
>= (大于等于)
<= (小于等于)
比较运算符定义在标量/标量、向量/标量和向量/向量值对之间。默认情况下,它们会进行过滤。可以通过在操作符后提供bool来修改它们的行为,该操作符将为值返回0或1,而不是进行过滤。
在两个标量之间,必须提供 bool 修饰符,这些操作符将产生另一个标量,根据比较结果,该标量要么为 0 (false),要么为 1 (true)。
在瞬时向量和标量之间,这些运算符会应用于向量中每个数据样本的值,比较结果为假的向量元素会从结果向量中删除。如果提供了 bool 修饰符,则被放弃的向量元素的值为 0,被保留的向量元素的值为 1。如果提供了 bool 修饰符,则会删除指标名称。
在两个瞬时向量之间,这些运算符默认作为过滤器,应用于匹配项。表达式为非 true 的向量元素或在表达式另一端找不到匹配项的向量元素会从结果中删除,而其他元素会传播到结果向量中,分组标签成为输出标签集。如果提供了 bool 修饰符,则原本会被剔除的向量元素的值为 0,而保留的向量元素的值为 1,分组标签再次成为输出标签集。如果提供了 bool 修饰符,则指标名称将被删除。
这些逻辑/集合二元运算符只在瞬时向量之间定义:
and (交集)
or (并集)
unless (补集)
vector1 and vector2 的结果是一个由 vector1 中的元素组成的向量,其中 vector2 中的元素具有完全匹配的标签集。其他元素将被删除。指标名称和值将从左侧向量继承过来。
vector1 or vector2 的结果是一个包含 vector1 中所有原始元素(标签集 + 值)的向量,以及 vector2 中与 vector1 中标签集不匹配的所有元素。
vector1 unless vector2 会产生一个由 vector1 中的元素组成的向量,且在 vector2 中没有完全匹配标签集的元素。两个向量中所有匹配的元素都会被丢弃。
下面的列表显示了二元运算符在 Prometheus 中从高到低的优先级:
(1)^
(2)*, /, %, atan2
(3)+, -
(4)==, !=, <=, <, >=, >
(5)and, unless
(6)or
相同优先级的运算符是左关联运算符。例如,2 * 3 % 2 相当于 (2 * 3) % 2。然而,^ 是右关联运算,因此 2 ^ 3 ^ 2 等同于 2 ^ (3 ^ 2)。