PromQL
时间序列
- 一个时间序列是一个以时间为索引的数据流,它是一个由时间戳和浮点数值组成的序列
# 以node_cpu_seconds_total为例,它由以下几个部分组成
|-----metrics name----|---------------labels-----------------|-timestamp-| |--value--|
node_cpu_seconds_total{cpu="0",instance="master-0",mode="idle"}@1689325440 3912085.06
|--------------------------------key--------------------------------------| |--value--|
# 存储的时候则是以key-value的形式存储
对于prometheus时间序列而言,它有四种数据类型:
- 瞬时向量
- 范围向量
- 标量
- 字符串
瞬时向量
- 在prometheus中,没从exporter拉取一次数据,便会更新一次数据,这个数据,就是瞬时向量
- 当然,旧的数据也是瞬时向量,只不过它的时间戳比较旧而已,只要是单独一个数据,就是瞬时向量
- 绘制图表展示数据时,只能对瞬时向量进行展示,因为瞬时向量一个点是一个数据,而范围向量一个点是一组数据,无法展示
node_cpu_seconds_total
范围向量
- 范围向量是一组时间序列,它们的时间戳都在一个范围内,也可以理解为一组瞬时向量
- 无法直接展示,但是可以用内置函数处理成瞬时向量,然后展示
node_cpu_seconds_total[5m]
标量
- 标量是一个单独的浮点数值,它没有时间戳,也没有标签,也就是说,它不是一个时间序列
- 只能通过内置函数scalar()将范围向量转换为标量
字符串
- 一个简单的字符串。字符串用单双引号或反引号来指定。
```promql
# rate( ... )[30m:1m]:这是一个子查询,用于计算数据的速率
# 以一分钟每次的频率查询近三十分钟的数据,也就是说会得到三十个数据点
# 在这个三十个数据点中,每次查询的内容为计算过去五分钟指标的变化速率
rate(node_cpu_seconds_total{cpu="0",instance="master-0",mode="idle"}[5m])[30m:1m]
predict_linear
- 用于预测未来的值
# predict_linear(v range-vector, t scalar)
predict_linear(node_filesystem_free_bytes[24h],240*3600)
# 以过去24小时的数据为基础,预测10天后的数据量
rate
- 用于计算速率
# rate(v range-vector)
rate(node_cpu_seconds_total{mode="idle"}[5m])
# 计算过去5分钟的CPU空闲率
sort
- 用于排序
# sort(v instant-vector)
sort(node_cpu_seconds_total{mode="idle"})
# 对CPU空闲率进行排序
topk
- 用于取出最大的K个值
# topk(k int, v instant-vector)
topk(5, node_cpu_seconds_total{mode="idle"})
# 取出CPU空闲率最高的5个节点
bottomk
- 用于取出最小的K个值
# bottomk(k int, v instant-vector)
bottomk(5, node_cpu_seconds_total{mode="idle"})
# 取出CPU空闲率最低的5个节点
quantile
- 用于计算分位数
# quantile(φ float, v instant-vector)
quantile(0.9, node_cpu_seconds_total{mode="idle"})
# 计算CPU空闲率的90%分位数
histogram_quantile
- 用于计算直方图的分位数
# histogram_quantile(φ float, b instant-vector)
histogram_quantile(0.9, node_cpu_seconds_total{mode="idle"})
# 计算CPU空闲率的90%分位数
absent
- 用于判断指标是否存在
# absent(v instant-vector)
absent(node_cpu_seconds_total{mode="idle"})
# 判断CPU空闲率是否存在
changes
- 用于计算指标值发生变化的次数
# changes(v range-vector)
changes(node_cpu_seconds_total{mode="idle"}[5m])
# 计算过去5分钟CPU空闲率发生变化的次数
delta
- 用于计算指标值的增量
# delta(v range-vector)
delta(node_cpu_seconds_total{mode="idle"}[5m])
# 计算过去5分钟CPU空闲率的增量
deriv
- 用于计算指标值的导数
# deriv(v range-vector)
deriv(node_cpu_seconds_total{mode="idle"}[5m])
# 计算过去5分钟CPU空闲率的导数
idelta
- 用于计算指标值的增量
# idelta(v range-vector)
idelta(node_cpu_seconds_total{mode="idle"}[5m])
# 计算过去5分钟CPU空闲率的增量