文章详情页 您现在的位置是:网站首页>文章详情

PromQL语法

图片丢失 Jeyrce.Lu 发表于:2020年11月5日 19:44 分类:【服务器 4027次阅读

Prometheus除了是一套监控系统,他有自身的同名时序数据库prometheus,类似于关系型数据库有自己的SQL,那么promQL就是prometheus的SQL

表达式值类型

PromQL表达式或子表达式可以得到四种类型的值

瞬时向量——一组样本值,所有样本值共享时间序列(时间戳相同)

区间向量——一组一段时间范围类的样本值

标量——一个固定的浮点数,-x.y 、n.m格式

字符串——一个字符类型的值,可以使用单引号、双引号、反引号包裹,遵循goalng语法的转义规则

瞬时向量过滤器

可以使用大括号对向量进行筛选,得到我们需要的样本值,如:

node_metric{name="Jeeyshe", ip="10.10.100.5"}  查询名为 node_metric 标签name和ip 分别固定的一组指标值

其中大括号内的表达式支持完全匹配和正则匹配两种模式,括号内标签一共有这几种运算符:

匹配相同字符串

!= 匹配不相同字符串

=~ 匹配正则表达式字符串

~! 匹配正则表达式不相同字符串

node_metric{name=~"Jeeyshe|Athena", ip="10.10.100.5", type!="compute"}  查询名为 node_metric, name为Jeeyshe或Athena,type不是计算的节点指标


正则表达式支持RE2语法,表达式必须至少包含一个指标名称或者一个不会匹配到空字符串的标签过滤器

{job=~".*"}   # 不合法,既不包含指标名,标签过滤又会匹配到空字符串
{job=~".+"}  # 合法,不包含指标名,但是标签过滤器一定不会匹配到空字符串
{job=~".*", name="xx"}  # 合法,不包含指标名,标签过滤器在job和name组合筛选时不会匹配到空字符串
node_metric{job=~".*"}  # 合法,包含指标名,标签可以匹配到空字符串


除用户自定义标签外,每个指标还携带有一些内置的标签,如__name__即为指标名称

{__name__="node_metric", ip="10.10.100.5"} 和 node_metric{ip="10.10.100.5"} 等价

区间向量过滤器

除了大括号以外,还可以使用中括号来筛选出一段时间范围内的样本值

node_metric{ip="10.10.100.5"}[5m]  # 筛选过去五分钟内ip为10.10.100.5的node_metric指标


时间窗口使用数字加单位组合表示,其中单位包括:

s 秒
m 分
h 时
d 天
w 周
y 年

时间位移运算

在查询中,我们默认都是以当前时间为基准去查寻瞬时或区间向量,但是有些场景我们需要查询过去某个时间点为基准的样本,就需要用到位移操作关键字 offset

node_metric{}   offset 5m  # 查询5m前的node_metric指标
rate(node_metric[5m] offset 1w)  # 查询一周前5m内的node_metric指标增长率

二元运算符

除了以上描述的指标运算符之外,PromQL还支持算术类、比较类、逻辑类三类二元运算符,其中二元运算符特指瞬时向量,不包含区间向量

(1)算术类

+加
-减
* 乘
/ 除
% 取模
^ 乘方


其中按照二元类型的不同,又可以分为以下几种运算结果:

标量:标量——新标量
向量:标量——新向量(向量每一个元素和标量进行运算,线性代数)
向量:向量——新向量(前面的向量会在后面的向量中寻找匹配元素,匹配则进行计算,否则丢弃元素,结果组成一个新的向量,匹配规则在下面单独讲解)

(2)比较类

比较类操作符有以下三组6条,表达式格式为:值1  运算符 bool 值二

== 相等
!= 不等
> 大于
< 小于
>= 大于等于
<= 小于等于

按照二元类型不同,同样可将运算分为三类:

标量:标量——得到一个布尔值0或1,并且必须跟随 bool 关键字否则语法错误,
向量:标量——将向量中每一个标量和标量进行比较,真则保留,假则丢弃。跟随bool运算符则保留或丢弃结果为1或0.
向量:向量——新向量(前面的向量每一个值和后面匹配或比较,为真则保留前值,为假则丢弃,不匹配也丢弃),跟随bool运算符则保留丢弃结果为1或0

假设有这样一组瞬时向量,分别进行运算

node_metric{ip="10.10.100.5"} 1
node_metric{ip="10.10.100.6"} 2
node_metric{ip="10.10.100.7"} 3
进行运算
2 < node_metric  前两个向量被丢弃,得到结果
node_metric{ip="10.10.100.7"}  3
2 < node_metric 前两个向量被置为0,后面结果被置为1
node_metric{ip="10.10.100.5"} 0
node_metric{ip="10.10.100.6"} 0
node_metrci{ip="10.10.100.7"} 1
2 < bool 1 # 为假,得到结果0
2 > bool 1 # 为真,得到结果1
2 >1 或 2 < 1 # 语法错误,必须跟随布尔

(3)逻辑类

逻辑运算符必须在向量之间进行!

and 交集, v1 and v2 结果由v1对v2进行元素匹配(标签键值对相同)中v1元素组成
or 并集 , v1 or v2 结果由v1和v2中不匹配v1的元素共同组成
unless 补集(差集),v1 unless v2 结果由v1中在v2找不见匹配的元素组成

(4)二元运算符优先级

按照从高到底优先级排列为:算术 > 比较 > 逻辑, 算术中(乘方 > 乘除模 > 加减),比较全部同级,逻辑类(交差>并)

^
*, /, %
+,  -
==, !=, >, <, >=, <=
and, unless
or

向量匹配

向量的二元运算中均需要对向量元素进行匹配,匹配可以分为两种模式

(1)one-to-one

两组向量里面标签键值对相同则为匹配,且匹配值只有一个。可以使用on关键字指定匹配标签或ingoring关键字忽略标签

向量1   运算符  on(要匹配的标签列表) 向量2
向量1  运算符 ignoring(要忽略的标签列表) 向量2

(2)one-to-many|many-to-one

相比于one-to-one需要使用组修饰符group_left或group_right指明匹配元素多的一侧,此种情况特别复杂,应当尽量少用,如果出现多匹配,则尽量使用ignoring关键字忽略对应标签。

向量1      运算符    on(要匹配的标签列表)  group_left 向量2
向量1      运算符    ignoring(要忽略的标签列表)  group_right 向量2

聚合函数和内置函数

如上文我们使用到的sum()就是一种聚合函数,由于函数较多,此部分由下一篇文章单独讲解。


版权声明 本文属于本站  原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: http://blog.lujianxin.com/x/art/21l7z2ard4tj

文章评论区

作者名片

图片丢失
  • 作者昵称:Jeyrce.Lu
  • 原创文章:61篇
  • 转载文章:3篇
  • 加入本站:1799天

站点信息

  • 运行天数:1800天
  • 累计访问:164169人次
  • 今日访问:0人次
  • 原创文章:69篇
  • 转载文章:4篇
  • 微信公众号:第一时间获取更新信息