PromQL查询
程序员文章站
2024-03-17 13:52:22
...
一、数据格式了解
exporter暴漏的数据以下边的方式进行呈现
# HELP node_filesystem_free_bytes Filesystem free space in bytes. #解释
# TYPE node_filesystem_free_bytes gauge #数据类型
node_filesystem_free_bytes{device="/dev/mapper/centos_test- root",fstype="xfs",mountpoint="/"} 1.163782144e+10 #metric和对应的值
node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs",mountpoint="/boot"} 7.6972032e+07
node_filesystem_free_bytes{device="rootfs",fstype="rootfs",mountpoint="/"} 1.163782144e+10
node_filesystem_free_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run"} 9.43960064e+08
node_filesystem_free_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/0"} 1.90795776e+08
# HELP node_filesystem_readonly Filesystem read-only status.
# TYPE node_filesystem_readonly gauge
node_filesystem_readonly{device="/dev/mapper/centos_test-root",fstype="xfs",mountpoint="/"} 0
node_filesystem_readonly{device="/dev/sda1",fstype="xfs",mountpoint="/boot"} 0
node_filesystem_readonly{device="rootfs",fstype="rootfs",mountpoint="/"} 0
node_filesystem_readonly{device="tmpfs",fstype="tmpfs",mountpoint="/run"} 0
node_filesystem_readonly{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/0"} 0
然后prometheus拉取瞬时的(那一刻的数据)exporter暴露的数据,以时间序列的格式存储在自身的tsdb(时间序列数据库)数据库,当在prometheus web查询时,获取的数据也是那一瞬间的数据,可称作瞬时向量。存储在tsdb的数据格式如下:
<--------------- metric ---------------------><-timestamp -><-value->
up{instance="192.168.71.21:9100",job="node_exporter"}@1600572300 =>1
up{instance="192.168.71.22:9100",job="node_exporter"}@1600572300 =>0
up{instance="localhost:9090",job="prometheus"}@1600572300 =>1
二、PromQL操作符
标签匹配(瞬时向量)
根据标签进行匹配,获取的值是那一瞬间的值
- = :根据label进行匹配。匹配device为/dev/mapper/centos_test-root的时间序列
node_filesystem_avail_bytes{device="/dev/mapper/centos_test-root"}
- != :正则,不等于
node_filesystem_avail_bytes{device!="/dev/mapper/centos_test-root"}
- ~ :label=~regx,正则匹配。匹配挂载点为/boot、/、/run的时间序列
node_filesystem_avail_bytes{mountpoint=~"/boot|/|/run"}
- ~! :非。匹配除了挂载点为/boot、/、/run的时间序列
node_filesystem_avail_bytes{mountpoint=~!"/boot|/|/run"}
范围查询(区间向量查询)
查询一定时间范围内的数据
- []:时间范围选择.查看1分钟内所有时间点的剩余内存(这个时间点是由prometheus抓取数据的频率决定,这里定义的是每15秒抓取一次数据)
node_memory_MemFree_bytes{}[1m]
时间单位有:
- s - 秒
- m - 分钟
- h - 小时
- d - 天
- w - 周
- y - 年
时间位移查询
查询之前某个时间点的数据,也是瞬时向量
- offset:位移操作符,metric{label=value} offset 1d。查询1分钟前的剩余内存
node_memory_MemFree_bytes{} offset 1m
数学运算符
- + (加法)
- - (减法)
- * (乘法)
- / (除法)
- % (求余)
- ^ (幂运算)
布尔运算
- == (相等)
- != (不相等)
-
(大于)
- < (小于)
-
= (大于等于)
- <= (小于等于)
布尔操作符,改变运算行为,使结果输出为1或0,符合运算就输出0,否则输出1
metric{label=value} > bool 100
集合运算符
- vector1 and vector2
- vector1 or vector2
- vector1 unless vector2
操作符优先级
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or
向量与向量之间的计算
- ignoring:在匹配时忽略某些标签
- on:将匹配限定在某些标签之内
- group_left:如果左边标签多的话,也就是多对一,使用group_left
- group_right:如果右边标签多的话,也就是一对多,使用group_right
- 一对一匹配(标签数量相同,排除不同的标签或限制指定的标签进行匹配)
vector1 / ignoring(code) vector2 - 多对一匹配和一对多
vector1 on(label) group_left vector2
vector1 on(label) group_right vector2
像
node_filesystem_avail_bytes / ignoring(device,fstype,mountpoint) group_left up
三、PromQL聚合操作
- sum (求和)
- min (最小值)
- max (最大值)
- avg (平均值)
- stddev (标准差)
- stdvar (标准方差)
- count (计数)
- count_values (对value进行计数)
- bottomk (后n条时序)
- topk (前n条时序)
- quantile (分位数)
1. 按照mode计算cpu平均使用时间
avg(node_cpu_seconds_total) by (mode)
2. 计算http请求数前5位的时间序列
topk(5,prometheus_http_requests_total)
四、PromQL内置函数
- up:查看exporter状态,正常为1,异常为0
- rate:计算增长率
- irate:跟rate一样,但是irate是根据区间向量最后两个数据进行计算,更加灵敏
- predict_linear:预测函数,根据简单线性回归进行计算。
- label_replace:标签替换
1. 根据2小时内的数据,计算未来4个小时,磁盘剩余空间是否为0
predict_linear(node_filesystem_files_free{device="/dev/mapper/centos_test-root"}[2h],4*3600)<0
2. 标签替换
格式
label_replace(v,dest_label,dest_value,replace_label,regx)
没有替换时
替换之后
上一篇: Java中需要注意的一些案例
下一篇: 数据库系统2:SQL数据查询