Prometheus的查询语言支持基本的逻辑和算术运算符。 对于两个瞬时向量之间的操作,匹配规则可被修改。
Prometheus中存在以下二进制算术运算符:
+
(加法)-
(减法)*
(乘法)/
(除法)%
(取余)^
(幂/指数)二元运算操作符支持scalar/scalar(标量/标量)
、vector/scalar(向量/标量)
、和vector/vector(向量/向量)
之间的操作。
Prometheus中存在以下二进制比较运算符:
==
(相等)!=
(不等)>
(大于)<
(小于)>=
(大于或等于)<=
(小于或等于)比较二元操作符被应用于scalar/scalar(标量/标量)
、vector/scalar(向量/标量)
,和vector/vector(向量/向量)
。比较操作符得到的结果是bool
布尔类型值,返回1或者0值。
false
,则这个时间序列数据被丢弃掉,如果是true
, 则这个时间序列数据被保留在结果中。逻辑/集合二元操作符只能作用在瞬时向量, 包括:
and
(交集)or
(并集)unless
(补集)例如:vector1 and vector2
:vector1
中的每个样本数据与vector2
中的所有样本数据进行标签匹配,不匹配的,全部丢弃。运算结果保留左侧向量的度量名称和值。vector1 or vector2
:保留vector1
向量中的每一个元素,对于vector2
向量元素,将不匹配vector1
向量的元素,追加到结果元素中。vector1 unless vector2
:包含在vector1
中的元素,但是该元素不在vector2
向量所有元素列表中,则写入到结果集中。
向量之间的匹配是指右边向量中的每一个元素,在左边向量中也存在。这里有两种基本匹配行为特征:
vector1 [operate] vector2
。如果它们有相同的标签和值,则表示相匹配。ingoring
关键字是指,向量匹配时可以忽略指定标签。on
关键字是指,在指定标签上进行匹配。格式如下所示:
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>
输入示例:
method_code:http_errors:rate5m{method="get", code="500"} 24
method_code:http_errors:rate5m{method="get", code="404"} 30
method_code:http_errors:rate5m{method="put", code="501"} 3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
查询示例:
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
多对一和一对多的匹配,是指向量元素中的一个样本数据标签匹配到了多个样本数据标签。这里必须直接指定两个修饰符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>
这个group带标签的修饰符标签列表包含了“一对多”中的“一”一侧的额外标签。对于on
标签只能是这些列表中的一个。结果向量中的每一个时间序列数据都是唯一的。group
修饰符只能被用在比较操作符和算术运算符。
查询示例:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
在这个例子中,左向量的标签数量多于右边向量的标签数量,所以我们使用group_left
。右边向量的时间序列元素匹配左边的所有相同method
标签:
{method="get", code="500"} 0.04 // 24 / 600
{method="get", code="404"} 0.05 // 30 / 600
{method="post", code="500"} 0.05 // 6 / 120
{method="post", code="404"} 0.175 // 21 / 120
Prometheus支持下面的内置聚合操作符。这些聚合操作符被用于聚合单个瞬时向量的所有时间序列数据,把聚合的结果值存入到新的向量中。
sum
(在维度上求和)max
(在维度上求最大值)min
(在维度上求最小值)avg
(在维度上求平均值)stddev
(求标准差)stdvar
(求方差)count
(统计向量元素的个数)count_values
(统计相同数据值的元素数量)bottomk
(样本值第k个最小值)topk
(样本值第k个最大值)quantile
(统计分位数)这些操作符被用于聚合所有标签维度,或者通过without
或者by
子句来保留不同的维度。
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
parameter
只能用于count_values
, quantile
, topk
和bottomk
。without
移除结果向量中的标签集合,其他标签被保留输出。by
关键字的作用正好相反,即保留结果向量中的标签集合并输出,其他标签被丢弃。keep_common
子句允许保留额外的标签(在元素之间相同,但不在by子句中的标签)count_values
对每个唯一的样本值输出一个时间序列。每个时间序列都附加一个标签。这个标签的名字有聚合参数指定,同时这个标签值是唯一的样本值。每一个时间序列值是结果样本值出现的次数。topk
和bottomk
与其他输入样本子集聚合不同,返回的结果中包括原始标签。by
和without
仅仅作用于输入向量。
例如: 如果度量指标名称http_requests_total
包含由group
, application
, instance
的标签组成的时间序列数据,我们可以通过以下方式计算去除instance
标签后的http请求总数:
sum(http_requests_total) without (instance)
//等价于
sum(http_requests_total) by (application, group)
如果我们只对我们在所有应用程序中看到的HTTP请求总数感兴趣,我们可以简单地写:
sum(http_requests_total)
count_values("version", build_version)
通过所有实例,获取http请求第5个最大值,我们可以简单地写下:
topk(5, http_requests_total)
以下列表显示了Prometheus中二进制运算符的优先级,按优先级从高到低排序为:
^
*
, /
, %
+
, -
==
, !=
, <=
, <
, >=
, >
and
, unless
or
在文档使用中是否遇到以下问题
更多建议
匿名提交