原文地址:https://blog.51cto.com/xuexinhuan/5394859 抄一遍,方便查看
promQL
1 标签匹配模式
有两种:完全匹配和正则匹配
1.2 完全匹配
= 等于,通过使用label=value
可以选择标签满足表达式定义的时间序列
!= 不等于,通过label!=value
可以根据标签匹配 排除 时间序列
实例:
标签 cpu=0
和 cpu!=0
1.3 正则匹配
正向匹配,使用label=~regx
反向匹配, 使用label!~regx
实例:
查询指标prometheus_http_requests_total 中,所有 handler 标签以 /api/v1
开头的记录
2 范围查询
同一个指标同一个标签只返回一条数据。这样的表达式称为瞬时向量表达式,而范围的结果称为瞬时向量。例如直接查询prometheus_http_requests_total
通过使用 时间范围选择器[]
来查询一段时间范围内的样本数据,就需要使用区间向量表达式,查询出来的结果称为区间向量。例如prometheus_http_requests_total[1m]
其他的时间单位:
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
一共显示了几条数据
统计
prometheus_http_requests_total
显示的所有样本数据的总和
5 标量
在promQL中,标量是一个浮点型的数字值,没有时序。
当使用count(prometheus_http_requests_total)
,返回的数据类型是瞬时向量,可以使用 scalar() 将单个瞬时向量转换为标量。
6 操作符
数学运算符、集合运算符、布尔运算符
6.1 数学运算符
PromQL 支持的所有数学运算符如下所示:
+ (加法)
- (减法)
* (乘法)
/ (除法)
% (求余)
^ (幂运算)
node_network_receive_bytes_total{device="ens33"}/8/1024
6.2 布尔运算符
目前,Prometheus 支持以下布尔运算符如下:
== (相等)
!= (不相等)
> (大于)
< (小于)
>= (大于等于)
<= (小于等于)
prometheus_http_requests_total 查询出每个接口的请求次数,只显示请求次数超过 20 次的接口
prometheus_http_requests_total > 20
从上面的图中我们可以看到,value 的值还是具体的数值。但如果我们希望对符合条件的数据,value 变为 1。不符合条件的数据,value 变为 0。那么我们可以使用 bool 修饰符。
prometheus_http_requests_total > bool 20
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请求的总次数
without 可以让sum 指令根据相同的标签进行求和,但是忽略without涵盖的标签。如果在实际工作中需要忽略更多标签,可以根据实际情况在without里传递更多指标。
例如:将所有http请求,根据状态码进行求和,忽略url
sum without(handler)(prometheus_http_requests_total)
7.2 min 最小值
返回样本数据value中的最小值
min(prometheus_http_requests_total)
7.5 max 最大值
返回所有记录的最大值。
当我们执行如下 PromQL 时,会筛选出最大的记录值
max(prometheus_http_requests_total)
without 根据Node Exporter的指标node_filesystem_size_bytes计算每台机器上最大的文件安装系统大小:
max without(device,fstype,env,mountpoint)(node_filesystem_size_bytes)
7.6 avg 平均值
返回所有记录的平均值。
当我们执行如下 PromQL 时,会筛选出最大的记录值。
avg(prometheus_http_requests_total)
7.7 count 计数
返回所有记录的总条数
count(prometheus_http_requests_total)
,统计所有http记录的条数
7.8 bottomk 显示排序的最后几条
bottomk 用于对样本值进行排序,返回当前样本值后 N 位的时间序列。
例如获取 HTTP 请求量后 5 位的请求,可以使用表达式:
bottomk(5, prometheus_http_requests_total)
7.9 topk 显示排序的前几条
topk 用于对样本值进行排序,返回当前样本值前 N 位的时间序列。
例如获取 HTTP 请求量前 5 位的请求,可以使用表达式:
topk(5, prometheus_http_requests_total)
8 内置函数
8.1 increase 增长量
increase 函数获取区间向量中的第一个和最后一个样本值 并返回其增长量
increase(prometheus_http_requests_total{handler="/metrics"}[10m])
统计/metrics 接口 十分钟的增长量
增长量 除以 秒 可以计算出10分钟的平均增长率
increase(prometheus_http_requests_total{handler="/metrics"}[10m]) / 600
8.2 rate 增长率
rate 函数可以直接计算区间向量 v 在时间窗口内平均增长速率。因此,通过以下表达式可以得到与 increase 函数相同的结果:
rate(prometheus_http_requests_total{handler="/metrics"}[10m])
需要注意的是使用 rate 或者 increase 函数去计算样本的平均增长速率,容易陷入「长尾问题」当中,其无法反应在时间窗口内样本数据的突发变化。
例如,对于主机而言在 2 分钟的时间窗口内,可能在某一个由于访问量或者其它问题导致 CPU 占用 100% 的情况,但是通过计算在时间窗口内的平均增长率却无法反应出该问题。
8.3 irate 瞬时增长率
irate 函数是灵敏度更高的函数,同样用于计算区间向量的增长率,但是其显示的瞬时增长率,通过区间向量中最后两个样本数据来计算区间向量的增长速率。
irate(node_network_receive_bytes_total{device="ens33"}[5m])
对比
rate(node_network_receive_bytes_total{device="ens33"}[5m])
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])
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 摘要