PromQL 操作符
使用 PromQL 除了能够方便的按照查询和过滤时间序列以外,PromQL 还支持丰富的操作符,用户可以使用这些操作符进一步的对事件序列进行二次加工。
这些操作符包括:数学运算符,逻辑运算符,布尔运算符等等。
数学运算符
PromQL 支持的所有数学运算符如下所示:
+
(加法)-
(减法)*
(乘法)/
(除法)%
(求余)^
(幂运算)
布尔运算符
布尔运算支持用户根据时间序列中样本的值,对时间序列进行过滤。
PromQL 支持的布尔运算符如下:
==
(相等)!=
(不相等)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)
使用 bool 修饰符改变布尔运算符的行为
布尔运算符的默认行为是对时序数据进行过滤,可以使用 bool 修饰符改变布尔运算的默认行为,从而得到真正的布尔结果。
例如:
http_requests_total > bool 1000
使用 bool 修改符后,布尔运算不会对时间序列进行过滤,而是将瞬时向量中的各个样本数据与标量的比较结果转换为 0 或者 1,从而形成一条新的时间序列。
http_requests_total{code="200",handler="query",instance="localhost:9090",job="prometheus",method="get"} 1
http_requests_total{code="200",handler="query_range",instance="localhost:9090",job="prometheus",method="get"} 0
集合运算符
通过集合运算,可以在两个瞬时向量与瞬时向量之间进行相应的集合操作。
目前,Prometheus支持以下集合运算符:
and
(并且)or
(或者)unless
(排除)
匹配模式详解
向量与向量之间进行运算操作时会基于默认的匹配规则:依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃。
在 PromQL 中有两种典型的匹配模式:
一对一(one-to-one)
多对一(many-to-one)或一对多(one-to-many)
一对一匹配
一对一匹配模式会对操作符两边的瞬时向量依次进行比较并找到唯一匹配(标签完全一致)的样本值。
默认情况下,表达式如下:
vector1 <operator> vector2
在操作符两边表达式标签不一致的情况下,可以使用 on(label list) 或者 ignoring(label list) 来修改便签的匹配行为。
使用 ignoreing 可以在匹配时忽略某些标签
使用 on 则可以将匹配行为限定在某些标签之内
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>
多对一和一对多匹配
多对一和一对多两种匹配模式指的是 “一” 侧的每一个向量元素可以与 "多" 侧的多个元素匹配的情况。
在这种情况下,必须使用 group 修饰符:group_left 或者 group_right 来确定哪一个向量具有更高的基数(充当“多”的角色)。
<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>
最后更新于