Prometheus监控实战系列六:PromQL语法(下篇)
一. 操作符
在PromQL的查询中,还可以通过表达式操作符,进行更加复杂的结果查询,常见的操作有下列几种。
数学运算符
数据运算符使用的加、减、乘、除等方式,对样本值进行计算,并返回计算后的结果。
例如,通过process_virtual_memory_bytes获取到的内存值单位为byte,我们希望转换为GB为单位时,只需要使用下列表达式处理
process_virtual_memory_bytes/(1024*1024*1024)
PromQL支持的所有数学运算符如下所示:
-
+
(加法) -
-
(减法) -
*
(乘法) -
/
(除法) -
%
(求余) -
^
(幂运算)
比较运算符
比较运算符支持用户根据时间序列样本的值,对时间序列进行过滤。
例如,我们只想查询Prometheus请求量大于1千的接口数据,则可以使用下列比较表达式进行过滤。
prometheus_http_requests_total{code="200"} > 1000
比较表达式还可以与bool修饰符进行搭配,添加bool后表达式将不再对数据进行过滤,而是根据比较结果返回1(true)或0(false)。
例如 :
prometheus_http_requests_total{code="200"} > bool 1000
Prometheus支持的比较运算符如下:
-
==
(相等) -
!=
(不相等) -
>
(大于) -
<
(小于) -
>=
(大于等于) -
<=
(小于等于)
逻辑运算符
逻辑运算符支持的操作有 and、or、unless(排除)三种,其中and为并集,用于匹配表达式中相同的结果。
如下示例,该表达式将匹配大于100小于1000区间的时间序列样本
prometheus_http_requests_total < 1000 or prometheus_http_requests_total > 100
其中,表达式1为显示所有小于1千的样本,而表达式2则是显示所有大于100的样本,在并集匹配后,将会显示两者间相同的数据,即小于1千大于100这个区间的样本。
unless与and正好相反,匹配结果将会排除两者中相同的样本,只显示其中对方互不包含部分的合集;而or的匹配范围最广,它除了会匹配表达式1所有的数据外,还会匹配表达式2中与其不相同的样本。
注意:Prometheus 的运算符之间存在着优先级,其中由高到低依次为(^)> (*, /, %) > (+, -) > (==, !=, <=, <, >=, >) > (and, unless) > (or) ,在使用过程中需要注意优先级关系,避免出现错误结果。
二. 内置函数
Prometheus内置不少函数,通过灵活的应用这些函数,可以更方便的查询及数据格式化。本文将选取其中较常使用到的几个函数进行讲解。
ceil 函数
ceil函数会将返回结果的值向上取整数。
示例:
ceil(avg(prometheus_http_requests_total{code="200"}))
floor 函数
floor 函数与ceil相反,将会进行向下取整的操作。
示例:
floor(avg(prometheus_http_requests_total{code="200"}))
rate函数
rate函数是使用频率最高,也是最重要的函数之一。rate用于取某个时间区间内每秒的平均增量数,它会以该时间区间内的所有数据点进行统计。rate函数通常作用于Counter类型的指标,用于了解增量情况。
示例:获取http_request_total在2分钟内,平均每秒新增的请求数
rate(prometheus_http_requests_total{handler="/rules"}[1m])
irate函数
相比rate函数,irate提供了更高的灵敏度。irate函数是通过时间区间中最后两个样本数据来计算区间向量的增长速率,从而避免范围内的平均值拉低峰值的情况。
示例:该函数用法与rate相同
irate(prometheus_http_requests_total{handler="/rules"}[1m])
其它内置函数
除了上面提到的这些函数外,PromQL还提供了大量的其他函数供使用,功能范围涵盖了日常所需的功能,如用于标签替换的label_replace函数、统计Histogram指标分位数的histogram_quantile函数,更多信息可参阅官方文档:https://prometheus.io/docs/prometheus/latest/querying/functions/。