参考连接:https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/promqlnode
探索PromQL git
经过PromQL用户能够很是方便地对监控样本数据进行统计分析,PromQL支持常见的运算操做符,同时PromQL中还提供了大量的内置函数能够实现对数据的高级处理。固然在学习PromQL以前,用户还须要了解Prometheus的样本数据模型。PromQL做为Prometheus的核心能力除了实现数据的对外查询和展示,同时告警监控也是依赖PromQL实现。正则表达式
Metrics类型express
Prometheus定义了4中不一样的指标类型:bash
初识PromQL服务器
Prometheus经过指标名称(metrics name)以及对应的一组标签(labelset)惟必定义一条时间序列。指标名称反映了监控样本的基本标识,而label则在这个基本特征上为采集到的数据提供了多种特征维度。用户能够基于这些特征维度过滤,聚合,统计从而产生新的计算后的一条时间序列。less
查询时间序列函数
PromQL还支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:彻底匹配和正则匹配。学习
PromQL支持使用=和!=两种彻底匹配模式:spa
PromQL还能够支持使用正则表达式做为匹配条件,多个表达式之间使用 | 进行分离
例如:若是想查询多个环节下的时间序列可使用以下表达式:
http_requests_total{environment=~"staging|testing|development",method!="GET"}
范围查询
直接经过相似于PromQL表达式httprequeststotal查询时间序列时,返回值中只会包含时间序列中的最新的一个样本值,这样的返回结果咱们称之为瞬时向量。而相应的这样的表达式称之为瞬时向量表达式。
而若是咱们想要过去一段时间范围内的样本数据时,咱们则须要使用区间向量表达式。区间向量表达式和瞬时向量表达式之间的差别在于在区间向量表达式中咱们须要定义时间选择的范围,时间范围经过时间范围选择器 [] 进行定义。
例如:经过如下表达式能够选择最近5分钟内的全部样本数据:
http_request_total{}[5m]
除了使用m表示分钟之外,PromQL的时间范围选择器支持其余时间单位:
时间位移操做
在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准:
http_request_total{} # 瞬时向量表达式,选择当前最新的数据 http_request_total{}[5m] # 区间向量表达式,选择以当前时间为基准,5分钟内的数据
而若是咱们想查询,5分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢?这个时候咱们就可使用位移操做,位移操做的关键字为offset。
例如:
http_request_total{} offset 5m http_request_total{}[1d] offset 1d
使用聚合操做
通常来讲,若是描述样本特征的标签(label)在并不是惟一的状况下,经过PromQL查询数据,会返回多条知足这些特征维度的时间序列。而PromQL提供的聚合操做能够用来对这些时间序列进行处理,造成一条新的时间序列:
# 查询系统全部http请求的总量 sum(http_request_total) # 按照mode计算主机CPU的平均使用时间 avg(node_cpu) by (mode) # 按照主机查询各个主机的CPU使用率 sum(sum(irate(node_cpu{mode!='idle'}[5m])) / sum(irate(node_cpu[5m]))) by (instance)
PromQL操做符
使用PromQL除了可以方便的按照查询和过滤时间序列之外,PromQL还支持丰富的操做符,用户可使用这些操做符进一步对事件序列进行二次加工,这些操做符包括:数学运算符,逻辑运算符,布尔运算等。
数学运算
PromQL支持的全部数学运算符以下所示:
使用布尔运算过滤时间序列
使用bool修饰符改变布尔运算符的行为
布尔运算符的默认行为是对时序数据进行过滤。而在其它的状况下咱们可能须要的是真正的布尔结果。例如,只须要知道当前模块的HTTP请求量是否>=1000,若是大于等于1000则返回1(true)不然返回0(false)。这时可使用bool修饰符改变布尔运算的默认行为。 例如:
http_requests_total > bool 1000
使用bool修改符后,布尔运算不会对时间序列进行过滤,而是直接依次瞬时向量中的各个样本数据与标量的比较结果0或者1。从而造成一条新的时间序列。
使用集合运算符
使用瞬时向量表达式可以获取到一个包含多个时间序列的集合,咱们称为瞬时向量。 经过集合运算,能够在两个瞬时向量与瞬时向量之间进行相应的集合操做。目前,Prometheus支持如下集合运算符:
vector1 and vector2 会产生一个由vector1的元素组成的新的向量。该向量包含vector1中彻底匹配vector2中的元素组成。
vector1 or vector2 会产生一个新的向量,该向量包含vector1中全部的样本数据,以及vector2中没有与vector1匹配到的样本数据。
vector1 unless vector2 会产生一个新的向量,新向量中的元素由vector1中没有与vector2匹配的元素组成。
操做符优先级
PromQL聚合操做
Prometheus还提供了下列内置的聚合操做符,这些操做符做用域瞬时向量。能够将瞬时表达式返回的样本数据进行聚合,造成一个新的时间序列。
使用聚合操做的语法以下:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
其中只有count_values, quantile, topk, bottomk支持参数(parameter)。 without用于从计算结果中移除列举的标签,而保留其它标签。by则正好相反,结果向量中只保留列出的标签,其他标签则移除。经过without和by能够按照样本的问题对数据进行聚合。