PromQL

PromQL

PromeQL是prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。而且被普遍应用在prometheus的平常应用当中,包括数据查询,可视化,告警处理当中,grafana绘图就是利用了prometheus里面的PromQL的功能node

查询时间序列

当prometheus经过exporter采集到相对应的监控指标样本数据后,咱们就能够经过promQL对监控样本数据进行查询,
当咱们直接使用监控指标名称查询是,能够查询该指标下面的全部时间序列,例如正则表达式

prometheus_http_requests_total  #等同于prometheus_http_requests_total{}
#获得的就是countr类型

image.png
image.png

PromQL还支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:彻底匹配正则匹配api

彻底匹配

PromeQL支持使用=!=两种彻底匹配模式
咱们先过滤出请求头为/status的次数:bash

prometheus_http_requests_total{handler="/status"}

image.png

而后在过滤请求头不包含/status/apiless

prometheus_http_requests_total{handler!="/status",handle!="/api"}

image.png

正则表表达式做为过滤条件

PromQL还能够支持使用正则表达式做为匹配条件,多个表达式之间使用 进行分离:ide

  • 使用 label=~regx 表示选择那些标签符合正则表达式定义的时间序列
  • 反之使用label!~regx进行排除

注意
当咱们使用正则表达式的时候,表达式里面必须指定一个能被彻底匹配的值,和一个正则表达式;函数

prometheus_http_requests_total{handler=~"/api/v1/.*"} #不合法
prometheus_http_requests_total{handler=~"/api/v1/.*",job="prometheus"} # 合法

image.png

范围查询

直接经过相似于PromQL表达式prometheus_http_requests_total查询时间序列时,返回值中只会包含该时间序列中的最新的一个样本值,这样的返回结果咱们称之为瞬时向量,而相应的这样的表达式称之为瞬时向量表达式
而咱们若是想获得过去一段时间范围内的样本数据时,咱们则须要使用区间向量表达式,区间向量表达式和瞬时向量表达式之间的差别在于区间向量表达式中咱们须要定义时间选择的范围,是假范围经过时间范围选择器[] 来定义。code

prometheus_http_requests_total{code="200"}[5m]

该表达式将会返回查询到的时间序列中最近5分钟的全部样本数据
image.pngblog

经过区间向量表达式查询到的结果咱们成为区间向量
支持的单位:requests

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

时间位移操做

在瞬间向量表达式或者区间向量表达式中,都是以当前时间为基准的:

prometheus_http_requests_total{} #瞬间向量表达式,选择当前最新的数据
prometheus_http_requests_total{}[5m] #区间向量表达式,选择以当前时间为基准,5分钟内的数据

而若是咱们想查询,5分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢? 这个时候咱们就可使用位移操做,位移操做的关键字为offset
可使用offset时间位移操做:

prometheus_http_requests_total{} offset 5m
prometheus_http_requests_total{}[1d] offset 1d

PromQL函数

sum求和函数

通常来讲,若是描述样本特征的标签(label)在并不是惟一的状况下,经过PromQL查询数据,会返回多条知足这些特征维度的时间序列。而PromQL提供的聚合操做能够用来对这些时间序列进行处理,造成一条新的时间序列:

sum(prometheus_http_requests_total{code=~"400|200",instance="192.168.1.56:9090"}) by (code)

说明:by关键字按照什么什么分组
image.png

min 求最小值

min(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

在上述求和的过程过选择出最小的值
image.png

max 求最大值

max(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

image.png

avg 求平均值

avg(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

image.png

count 记数

count(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))

获得当前统计的值的数值

increase(v range-vector)增加率

其中参数v 是一个区间向量,increase函数获取区间向量中的第一个和最后一个样本并返回其增加量。

increase(node_cpu_seconds_total{cpu="0"}[2m])/120

这个经过node_cpu_seconds_total获取时间序列cpu总使用时间内进两分钟的全部样本,increase计算出近两分钟的增加量,最后除以时间120s 获得node_cpu_seconds_total的平均增加率。

rate 求平均增加率

rate函数能够直接计算区间向量v在时间窗口内平均增加速率。所以,经过如下表达式能够获得与increase函数相同的结

rate(node_cpu_seconds_total{cpu="0"}[2m])

image.png

须要注意的是使用rate或者increase函数去计算样本的平均增加速率,容易陷入“长尾问题”当中,其没法反应在时间窗口内样本数据的突发变化。 例如,对于主机而言在2分钟的时间窗口内,可能在某一个因为访问量或者其它问题致使CPU占用100%的状况,可是经过计算在时间窗口内的平均增加率却没法反应出该问题。

irate 求平均值

为了解决上述问题,PromQL提供了另一个灵敏度更高的函数irate(v range-vector)。irate一样用于计算区间向量的计算率,可是其反应出的是瞬时增加率。irate函数是经过区间向量中最后两个两本数据来计算区间向量的增加速率。这种方式能够避免在时间窗口范围内的“长尾问题”,而且体现出更好的灵敏度,经过irate函数绘制的图标可以更好的反应样本数据的瞬时变化状态。
image.png

irate函数相比于rate函数提供了更高的灵敏度,不过当须要分析长期趋势或者在告警规则中,irate的这种灵敏度反而容易形成干扰。所以在长期趋势分析或者告警中更推荐使用rate函数。

数学运算符

基本运算符

  • / 除
  • % 求余
  • ^ 幂运算

布尔运算符

  • == (相等)
  • != (不相等)
  • > (大于)
  • < (小于)
  • >= (大于等于)
  • <= (小于等于)

集合运算符

  • and (而且)
  • or (或者)
  • unless (排除)

操做符优先级

PromQL操做运算符优先级从高到低

  1. ^
  2. *, /, %
  3. +, -
  4. ==, !=, <=, <, >=, >
  5. and, unless
  6. or
相关文章
相关标签/搜索