promQL函数

abs(v instant-vector)

1
取绝对值。

absent(v instant-vector)

1
2
3
如果给函数传递的参数是存在的,返回是空,如果不存在则返回1。
例: absent (node_cpu_seconds_total{instance="10.25.143.113:9100"})
如果node 10.25.143.113:9100运行正常返回空,而如果node宕机则会触发报警。同时对于判断多个标签组合是否存在非常有用。

ceil(v instant-vector)

1
向上取整。

floor(v instant-vector)

1
向下取整。

round(v instant-vector, to_nearest=1 scalar)

1
2
3
默认四舍五入。可入第二个参数to_nearest=1,会返回v最接近to_nearest整数倍的值。to_nearest可取小数。
例: round (2.3, 0.5) 返回 2.5
round (2.249, 0.5) 返回 2

changes(v range-vector)

1
2
3
4
时间范围值变化的次数。
例: node_cpu_seconds_total{cpu="0",instance="10.25.143.113:9100",job="node",mode="idle"}[2m]
8个变量每次都变则返回7次。
可检测波动。

clamp_max(v instant-vector, max scalar)

1
如果传入向量<=max返回向量值,如果向量>max返回max值。

clamp_min(v instant-vector, min scalar)

1
如果传入向量>=min返回向量值,如果向量<min返回min值。

day_of_month(v=vector(time()) instant-vector)

1
返回被给定 UTC 时间所在月的第几天。返回值范围:1~31。

day_of_week(v=vector(time()) instant-vector)

1
返回被给定 UTC 时间所在周的第几天。返回值范围:0~6,0 表示星期天。

days_in_month(v=vector(time()) instant-vector)

1
返回当月一共有多少天。返回值范围:28~31。

delta(v range-vector)

1
2
3
时间范围内第一个值减去最后一个值。
例: round(delta(node_filesystem_avail_bytes[5m])/1024/1024)
5分钟内磁盘增加了多少兆。负值代表磁盘增加,正值代表磁盘减少。

deriv(v range-vector)

1
使用简单的线性回归计算区间向量 v 中各个时间序列的导数,用不到。

exp(v instant-vector)

1
2
指数。
特殊情况: Exp(+Inf) = +Inf  Exp(NaN) = NaN

histogram_quantile(φ float, b instant-vector)

holt_winters(v range-vector, sf scalar, tf scalar)

hour(v=vector(time()) instant-vector)

1
返回被给定 UTC 时间的当前第几个小时,时间范围:0~23。

idelta(v range-vector)

1
计算最新的 2 个样本值之间的差值。

increase(v range-vector)

1
2
3
4
取时间范围,只能作用于计数器类型。第一个和最后一个样本。
采样目标重启会使计数器复位清零。
increase(node_filesystem_avail_bytes{device="/dev/vdb",fstype="xfs",instance="10.25.143.113:9100",job="node",mountpoint="/app"} [2m] )
出图与rate一样。

irate(v range-vector)

1
2
3
瞬时增长率。最后两个样本数据。
采样目标重启会使计数器复位清零。
irate尖峰,rate平滑。故irate瞬时性强。

rate(v range-vector)

1
2
时间范围内平均增长速率。
配合sum使用必须先rate后sum。

label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, …)

1
2
3
4
5
取已有的标签组合为新的标签值,并可配置分隔符。
例: 
原值: node_cpu_seconds_total{cpu="0",instance="10.25.143.113:9100",job="node",mode="idle"}
label_join(node_cpu_seconds_total{cpu="0",instance="10.25.143.113:9100",job="node",mode="idle"} , "foo", "-", "job", "mode")
新值: node_cpu_seconds_total{cpu="0",foo="node-idle",instance="10.25.143.113:9100",job="node",mode="idle"}	

label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)

1
2
3
从已有标签中正则取值生成新的标签值。
label_replace(node_cpu_seconds_total{cpu="0",instance="10.25.143.113:9100",job="node",mode="idle"} , "foo", "$1", "instance", "(.*):.*")
获得: node_cpu_seconds_total{cpu="0",foo="10.25.143.113",instance="10.25.143.113:9100",job="node",mode="idle"}

ln(v instant-vector)

1
自然对数。

log2(v instant-vector)

1
二进制对数。

log10(v instant-vector)

1
十进制对数。

minute(v=vector(time()) instant-vector)

1
 UTC 时间当前小时的第多少分钟。结果范围:0~59。

month(v=vector(time()) instant-vector)

1
UTC 时间当前属于第几个月,结果范围:0~12。

predict_linear(v range-vector, t scalar)

1
2
3
根据范围时间样本,预计设定时间(秒)后的值。
例: predict_linear (node_filesystem_avail_bytes{device="/dev/vdb",fstype="xfs",instance="10.25.143.113:9100",job="node",mountpoint="/app"}[5m], 4*3600)
计算磁盘/app4小时之后的剩余空间。

resets(v range-vector)

1
2
对于每个时间序列,它都返回一个计数器重置的次数。两个连续样本之间的值的减少被认为是一次计数器重置。
用作计数器。

scalar(v instant-vector)

1
度量指标的样本数量大于 1 或者等于 0, 则返回NaN。

sort(v instant-vector) sort_desc()

1
升序。

sqrt(v instant-vector)

1
降序。

time() timestamp(v instant-vector)

1
返回时间戳。

vector(s scalar)

year(v=vector(time()) instant-vector)

1
返回UTC时间的当前年份。

_over_time()

1
2
3
4
5
6
7
8
avg_over_time(range-vector) : 区间向量内每个度量指标的平均值。
min_over_time(range-vector) : 区间向量内每个度量指标的最小值。
max_over_time(range-vector) : 区间向量内每个度量指标的最大值。
sum_over_time(range-vector) : 区间向量内每个度量指标的求和。
count_over_time(range-vector) : 区间向量内每个度量指标的样本数据个数。
quantile_over_time(scalar, range-vector) : 区间向量内每个度量指标的样本数据值分位数,φ-quantile (0 ≤ φ ≤ 1)。
stddev_over_time(range-vector) : 区间向量内每个度量指标的总体标准差。
stdvar_over_time(range-vector) : 区间向量内每个度量指标的总体标准方差。

查询node_exporter采集的数据

1、查询cpu使用率

100 - avg(irate(node_cpu_seconds_total{jmode=“idle”}[5m])) by (instance) * 100

2、计算cpu的个数

count (node_cpu_seconds_total{mode=“user”}) by (instance)

3、判断负载是否过高

node_load1 > on (instance) count by (instance) (node_cpu_seconds_total{mode=“user”})

4、内存相关查询

node_memory_MemTotal_bytes / 1024 /1024/1024 # 节点总内存

node_memory_MemFree_bytes / 1024 /1024/1024 # 空闲内存

node_memory_Buffers_bytes/ 1024 /1024/1024 # buffer

node_memory_Cached_bytes / 1024/1024/1024 # cache

100 - (node_memory_Cached_bytes+ node_memory_Buffers_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes * 100 # 内存使用率

5、磁盘剩余空间

round(node_filesystem_avail_bytes{fstype=~“ext.|xfs”,}/node_filesystem_size_bytes 100, 0.02) # 保留2位小时

6、四小时后磁盘是否占满

predict_linear(node_filesystem_avail_bytes{fstype=~“ext.*|xfs”}[1h], 4*3600) < 0