PromeQL是prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。而且被普遍应用在prometheus的平常应用当中,包括数据查询,可视化,告警处理当中,grafana绘图就是利用了prometheus里面的PromQL
的功能node
当prometheus经过exporter采集到相对应的监控指标样本数据后,咱们就能够经过promQL对监控样本数据进行查询,
当咱们直接使用监控指标名称查询是,能够查询该指标下面的全部时间序列,例如正则表达式
prometheus_http_requests_total #等同于prometheus_http_requests_total{} #获得的就是countr类型
PromQL还支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:彻底匹配
和正则匹配
。api
PromeQL支持使用=
和!=
两种彻底匹配模式
咱们先过滤出请求头为/status
的次数:bash
prometheus_http_requests_total{handler="/status"}
而后在过滤请求头不包含/status
和/api
的less
prometheus_http_requests_total{handler!="/status",handle!="/api"}
PromQL还能够支持使用正则表达式做为匹配条件,多个表达式之间使用|
进行分离:ide
label=~regx
表示选择那些标签符合正则表达式定义的时间序列label!~regx
进行排除注意
当咱们使用正则表达式的时候,表达式里面必须指定一个能被彻底匹配的值,和一个正则表达式;函数
prometheus_http_requests_total{handler=~"/api/v1/.*"} #不合法 prometheus_http_requests_total{handler=~"/api/v1/.*",job="prometheus"} # 合法
直接经过相似于PromQL表达式prometheus_http_requests_total
查询时间序列时,返回值中只会包含该时间序列中的最新的一个样本值,这样的返回结果咱们称之为瞬时向量,而相应的这样的表达式称之为瞬时向量表达式
。
而咱们若是想获得过去一段时间范围内的样本数据时,咱们则须要使用区间向量表达式,区间向量表达式和瞬时向量表达式之间的差别在于区间向量表达式中咱们须要定义时间选择的范围,是假范围经过时间范围选择器[] 来定义。code
prometheus_http_requests_total{code="200"}[5m]
该表达式将会返回查询到的时间序列中最近5分钟的全部样本数据blog
经过区间向量表达式查询到的结果咱们成为区间向量
支持的单位:requests
在瞬间向量表达式或者区间向量表达式中,都是以当前时间为基准的:
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
通常来讲,若是描述样本特征的标签(label)在并不是惟一的状况下,经过PromQL查询数据,会返回多条知足这些特征维度的时间序列。而PromQL提供的聚合操做能够用来对这些时间序列进行处理,造成一条新的时间序列:
sum(prometheus_http_requests_total{code=~"400|200",instance="192.168.1.56:9090"}) by (code)
说明:by关键字按照什么什么分组
min(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
在上述求和的过程过选择出最小的值
max(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
avg(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
count(sum(prometheus_http_requests_total{instance="192.168.1.56:9090"}) by(code))
获得当前统计的值的数值
其中参数v 是一个区间向量,increase函数获取区间向量中的第一个和最后一个样本并返回其增加量。
increase(node_cpu_seconds_total{cpu="0"}[2m])/120
这个经过node_cpu_seconds_total
获取时间序列cpu总使用时间内进两分钟的全部样本,increase计算出近两分钟的增加量,最后除以时间120s 获得node_cpu_seconds_total
的平均增加率。
rate函数能够直接计算区间向量v在时间窗口内平均增加速率。所以,经过如下表达式能够获得与increase函数相同的结
rate(node_cpu_seconds_total{cpu="0"}[2m])
须要注意的是使用rate或者increase函数去计算样本的平均增加速率,容易陷入“长尾问题”当中,其没法反应在时间窗口内样本数据的突发变化。 例如,对于主机而言在2分钟的时间窗口内,可能在某一个因为访问量或者其它问题致使CPU占用100%的状况,可是经过计算在时间窗口内的平均增加率却没法反应出该问题。
为了解决上述问题,PromQL提供了另一个灵敏度更高的函数irate(v range-vector)。irate一样用于计算区间向量的计算率,可是其反应出的是瞬时增加率。irate函数是经过区间向量中最后两个两本数据来计算区间向量的增加速率。这种方式能够避免在时间窗口范围内的“长尾问题”,而且体现出更好的灵敏度,经过irate函数绘制的图标可以更好的反应样本数据的瞬时变化状态。
irate函数相比于rate函数提供了更高的灵敏度,不过当须要分析长期趋势或者在告警规则中,irate的这种灵敏度反而容易形成干扰。所以在长期趋势分析或者告警中更推荐使用rate函数。
PromQL操做运算符优先级从高到低