prometheus查询


表达式的结果可以显示为图形,可以显示为表格,也可以通过HTTP API供外部系统调用。

1、数据类型

Instant vector:瞬时矢量,一组时间序列,包含每个时间序列的单个样本,所有样本共享相同的时间戳

Range vector:范围矢量,一组时间序列,包含每个时间序列随时间变化的一系列数据点

Scalar:标量,一个浮点值。

String:字符串,当前未使用。

当前只有瞬时矢量可以直接画图,也就是说一个表达式的结果必须是瞬时向量,才能够直接绘制图形。

2、字面量

字符串字面量:

浮点数字面量:

3、时间序列选择器

瞬时矢量选择器:

举例:

http_requests_total

这个选择器会挑选所有带有度量名http_requests_total的时间序列。

http_requests_total{job="prometheus",group="canary"}

这个选择器通过标签做进一步过滤,时间序列需要同时满足:度量名为http_requests_total,job标签的值为prometheus,group标签的值为canary

job="prometheus",其中的=表示要完全一样,才算符合要求;

job!="prometheus",其中的!=表示不相等,才算符合要求;

job=~"prometheus",=~表示需要正则匹配。

job!~"prometheus",!~表示不能正则匹配。


http_requests_total{environment=~"staging|testing|development",method!="GET"}

本例中,staging,testing,development,都符合要求,同时排除了GET方法,其他方法都符合要求。

 非法,因为能匹配到空字符串。

合法,因为第一个是.+,至少会有1个字符;第二个虽然用了.*,但是第二个method作为保底标签,即使job=""也不怕。

注意:表达式http_requests_total 等价于 表达式{__name__="http_requests_total"}

该表达式会选择那些  度量名以job开头。

或者说,一个度量名的开头如果是job,则符合该表达式的要求。

度量名不能是以下关键字中的一个:

bool, on, ignoring, group_left and group_right

on{}  这是非法的

可以换一种方式:{__name__="on"}

范围矢量选择器

在过去的5分钟内,如果某些时间序列的度量名是http_requests_total,job标签的值是prometheus,那么这些时间序列就符合上述表达式。

此时,我们就选择到了过去这5分钟内的值。

持续时间

时间能组合

以下是合法的示例

偏移修改器

偏移修改器允许修改查询中 某个独立的瞬时矢量或范围矢量 的时间偏移量。

注意,offset必须紧跟着选择器。

以下这个是错误的,因为offset没有紧跟着选择器,而是跟在sum()的后面:

对于范围矢量,同样适用:

首选划定前5分钟内的数据范围,然后往前偏移1周。最后再计算相应5分钟内的速率。

比如现在是2021-11-18 18:10:00[5m]的作用是将 2021-11-18 18:05:00 ~ 2021-11-18 18:10:00范围内的数据圈起来。

offset 1w,表示向前推移1周,即2021-11-11 18:10:00,[5m]的作用是锁定 2021-11-11 18:05:00 ~ 2021-11-11 18:10:00范围内的数据,

并计算速率。

向前偏移。用-表示。比如现在是2021-11-18 18:10:00,推移后是2021-11-25 18:10:00

这个特性需要单独开启(在启动prometheus的时候增加选项)

./prometheus --enable-feature=promql-negative-offset

@ 修改器

用于指定获取某个具体时间点的值

返回http_requests_total2021-01-04T07:40:00+00:00时间点的值。

@符号后面跟时间戳。

同样的,@符号也要紧跟着选择器。

同样的,范围选择器也是一样:

在2021-01-04T07:40:00+00:00时间点,计算前5分钟的速率。

offset和@组合使用。

不管先写@还是先写offset,偏移都是相对于@符号来说的

也就是说先定位到@符号指定的时间上,再做偏移动作

@默认是关闭的,如果要开启,则添加选项:

./prometheus --enable-feature=promql-at-modifier

在@符号后,可以使用start()和end()。

对于一个即时查询来说,start()和end()都解析为计算时间

子查询的结果是范围向量。