原文地址:https://blog.51cto.com/xuexinhuan/5394859 抄一遍,方便查看

promQL

1 标签匹配模式

有两种:完全匹配正则匹配

1.2 完全匹配

= 等于,通过使用label=value可以选择标签满足表达式定义的时间序列 != 不等于,通过label!=value可以根据标签匹配 排除 时间序列 实例: 标签 cpu=0cpu!=0 image.png

image.png

1.3 正则匹配

正向匹配,使用label=~regx 反向匹配, 使用label!~regx 实例: 查询指标prometheus_http_requests_total 中,所有 handler 标签以 ​​/api/v1​​​ 开头的记录 image.png

2 范围查询

同一个指标同一个标签只返回一条数据。这样的表达式称为瞬时向量表达式,而范围的结果称为瞬时向量。例如直接查询prometheus_http_requests_total 通过使用 时间范围选择器[] 来查询一段时间范围内的样本数据,就需要使用区间向量表达式,查询出来的结果称为区间向量。例如prometheus_http_requests_total[1m] image.png 其他的时间单位:

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

3 时间位移操作

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

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

查询5分钟千的瞬时样本数据,或昨天一天的区间内的样本数据,需要使用位移操作 offset

# 查询 5 分钟前的最新数据
prometheus_http_requests_total offset 5m
# 往前移动 1 天,查询 1 天前的数据
# 例如现在是 2020-10-07 00:00:00
# 那么这个表达式查询的数据是:2020-10-05 至 2020-10-06 的数据
prometheus_http_requests_total[1d] offset 1d

4 聚合操作

通过promQL查询到的数据很多,可以使用聚合操作对这些时间序列进行处理,形成一条新的时间序列 实例: 统计prometheus_http_requests_total 一共显示了几条数据 image.png 统计prometheus_http_requests_total 显示的所有样本数据的总和 image.png

5 标量

在promQL中,标量是一个浮点型的数字值,没有时序。 当使用count(prometheus_http_requests_total),返回的数据类型是瞬时向量,可以使用 scalar() 将单个瞬时向量转换为标量。 image.png

6 操作符

数学运算符、集合运算符、布尔运算符

6.1 数学运算符

PromQL 支持的所有数学运算符如下所示: ​​+ (加法)​​ ​​- (减法)​​ ​​* (乘法)​​ / (除法) % (求余) ^ (幂运算) node_network_receive_bytes_total{device="ens33"}/8/1024 image.png

6.2 布尔运算符

目前,Prometheus 支持以下布尔运算符如下: ​​== (相等)​​ ​​!= (不相等)​​ ​​> (大于)​​ ​​< (小于)​​ ​​>= (大于等于)​​ ​​<= (小于等于)​​ prometheus_http_requests_total 查询出每个接口的请求次数,只显示请求次数超过 20 次的接口 prometheus_http_requests_total > 20 image.png 从上面的图中我们可以看到,value 的值还是具体的数值。但如果我们希望对符合条件的数据,value 变为 1。不符合条件的数据,value 变为 0。那么我们可以使用 bool 修饰符。 prometheus_http_requests_total > bool 20 image.png

6.3 集合运算符

通过集合运算,可以在两个瞬时向量与瞬时向量之间进行相应的集合操作。目前,Prometheus 支持以下集合运算符: and 与操作 or 或操作 unless 排除操作 and 与操作 vector1 and vector2 进行一个与操作,会产生一个新的集合。该集合中的元素同时在 vector1 和 vector2 中都存在。

例如我们有 vector1 为 A B C,vector2 为 B C D,那么 vector1 and vector2 的结果为:B C。

or 或操作 vector1 and vector2 进行一个或操作,会产生一个新的集合。该集合中包含 vector1 和 vector2 中的所有元素。

例如我们有 vector1 为 A B C,vector2 为 B C D,那么 vector1 or vector2 的结果为:A B C D。

unless 排除操作 vector1 and vector2 进行一个或操作,会产生一个新的集合。该集合首先取 vector1 集合的所有元素,然后排除掉所有在 vector2 中存在的元素。

例如我们有 vector1 为 A B C,vector2 为 B C D,那么 vector1 unless vector2 的结果为:A。

7 聚合操作

Prometheus 还提供了聚合操作符,这些操作符作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。目前支持的聚合函数有: sum (求和) min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准方差) count (计数) count_values (对 value 进行计数) bottomk (后 n 条时序) topk (前 n 条时序) quantile (分位数)

7.1 sum 求和

对样本数据 value 值进行求和 sum(prometheus_http_requests_total) 统计所有http请求的总次数 image.png without 可以让sum 指令根据相同的标签进行求和,但是忽略without涵盖的标签。如果在实际工作中需要忽略更多标签,可以根据实际情况在without里传递更多指标。 例如:将所有http请求,根据状态码进行求和,忽略url sum without(handler)(prometheus_http_requests_total) image.png

7.2 min 最小值

返回样本数据value中的最小值 min(prometheus_http_requests_total) image.png

7.5 max 最大值

返回所有记录的最大值。 当我们执行如下 PromQL 时,会筛选出最大的记录值 max(prometheus_http_requests_total) image.png without 根据Node Exporter的指标node_filesystem_size_bytes计算每台机器上最大的文件安装系统大小: max without(device,fstype,env,mountpoint)(node_filesystem_size_bytes) image.png

7.6 avg 平均值

返回所有记录的平均值。 当我们执行如下 PromQL 时,会筛选出最大的记录值。 avg(prometheus_http_requests_total) image.png

7.7 count 计数

返回所有记录的总条数 count(prometheus_http_requests_total),统计所有http记录的条数 image.png

7.8 bottomk 显示排序的最后几条

bottomk 用于对样本值进行排序,返回当前样本值后 N 位的时间序列。 例如获取 HTTP 请求量后 5 位的请求,可以使用表达式: bottomk(5, prometheus_http_requests_total) image.png

7.9 topk 显示排序的前几条

topk 用于对样本值进行排序,返回当前样本值前 N 位的时间序列。 例如获取 HTTP 请求量前 5 位的请求,可以使用表达式: topk(5, prometheus_http_requests_total) image.png

8 内置函数

8.1 increase 增长量

increase 函数获取区间向量中的第一个和最后一个样本值 并返回其增长量 increase(prometheus_http_requests_total{handler="/metrics"}[10m]) 统计/metrics 接口 十分钟的增长量 image.png 增长量 除以 秒 可以计算出10分钟的平均增长率 increase(prometheus_http_requests_total{handler="/metrics"}[10m]) / 600 image.png

8.2 rate 增长率

rate 函数可以直接计算区间向量 v 在时间窗口内平均增长速率。因此,通过以下表达式可以得到与 increase 函数相同的结果: rate(prometheus_http_requests_total{handler="/metrics"}[10m]) image.png 需要注意的是使用 rate 或者 increase 函数去计算样本的平均增长速率,容易陷入「长尾问题」当中,其无法反应在时间窗口内样本数据的突发变化。 例如,对于主机而言在 2 分钟的时间窗口内,可能在某一个由于访问量或者其它问题导致 CPU 占用 100% 的情况,但是通过计算在时间窗口内的平均增长率却无法反应出该问题。

8.3 irate 瞬时增长率

irate 函数是灵敏度更高的函数,同样用于计算区间向量的增长率,但是其显示的瞬时增长率,通过区间向量中最后两个样本数据来计算区间向量的增长速率。 irate(node_network_receive_bytes_total{device="ens33"}[5m]) image.png image.png 对比 rate(node_network_receive_bytes_total{device="ens33"}[5m]) image.png

8.4 predict_linear 增长预测

predict_linear(v range-vector, t scalar) 函数可以预测时间序列v在t秒后的值。 基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测,例如:基于2小时的样本数据 来预测主机可用磁盘空间是否在4个小时内被占满: predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

8.5 delta 差异变化

delta 函数可以获取样本数据在一段时间内的变化情况。例如:计算根分区剩余空间在10分钟内的差异: delta(node_filesystem_free_bytes{mountpoint="/"}[10m]) image.png

9 Metric 指标

在 Prometheus 中,我们所有的信息都以 Metrics(指标) 的形式存在。 Metrics 由 metric name 和 label name 组成。 <metric name>{<label name>=<label value>, ...} api_http_requests_total{method="POST", handler="/messages"} Prometheus 中主要有四种不同的指标类型,用来适应不同的指标类型:

  • counter 计数器
  • gauges 仪表盘
  • histogram 直方图
  • summary 摘要

9.1 counter计数器

数据从0开始累积,理想状态下应该是永远增长或者是不变 使用于例如开机时间、http访问量等数值

9.2 gauges 仪表盘

获取一个返回值,采集的数值就是瞬时值,不累计 使用于硬盘容量、cpu内存使用率

9.3 histogram 直方图

counter 和 gauges 反应的是数值的情况,而histogram则是反应数值的分布情况 histogram 柱状图反映了样本的区间分布梳理,经常用来表示请求持续时间、相应大小等信息 例如:我们 1 分钟内有 1000 个 http 请求,我们想要知道大多数的请求耗时是多少。这时我们使用评价耗时可能不太准,但是我们使用 histogram 柱状图就可以看出这些请求大多数都是分布在哪个耗时区间。 summary 摘要