一、PromQL 操作符¶
Prometheus 的查询语言支持基本的逻辑和算术运算符。对于两个即时向量之间的运算, 可以修改匹配行为。
Prometheus 中存在以下二元算术运算符:
+-*/%^
下面针对上述运算进行示例说明:
查到了所有主机磁盘的剩余空间数据,语法为:
node_filesystem_avail_bytes{mountpoint="/"}/1024/1024/1024

上面语法也可修改为:
node_filesystem_avail_bytes{mountpoint="/"}/(1024 ^ 3)

查询 k8s-node01 根分区磁盘使用率,语法为:
1-(node_filesystem_avail_bytes{instance="k8s-node01",mountpoint="/",device="/dev/mapper/centos-root"} /
node_filesystem_size_bytes{instance="k8s-node01",mountpoint="/",device="/dev/mapper/centos-root"})
上面参数说明:
- node_filesystem_avail_bytes:系统可用的磁盘空间
- node_filesystem_size_bytes:磁盘空间的总大小

查询所有主机根分区的可用率,语法为:
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}

也可以将结果乘以100直接得到百分比,语法为:
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100

查询集群中根分区空间可用率小于 20%的主机,语法为:
(node_filesystem_avail_bytes{mountpoint="/"} /
node_filesystem_size_bytes{mountpoint="/"} ) * 100 < 20

Prometheus 中存在以下二进制比较运算符:
==(等于)!=(不等于)>(大于)<(小于)>=(大于或等于)<=(小于或等于)
比较运算符在标量/标量、向量/标量和向量/向量值对之间定义。默认情况下,它们会进行过滤。可以通过bool在运算符之后提供来修改它们的行为,该运算符将返回 值而不是过滤0或者1
在两个标量之间,bool必须提供修饰符,并且这些运算符会生成另一个标量,即0( false) 或1 ( true),具体取决于比较结果。
下面针对上述运算进行示例说明:
查询磁盘可用率大于 30%小于等于 60%的主机,语法为:
30 < (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} ) * 100 <= 60

Prometheus 中存在以下逻辑运算符:
andorunless
vector1 and vector2结果是一个由元素组成的向量, vector1其中的元素vector2具有完全匹配的标签集。其他元素被删除。度量名称和值是从左侧向量继承而来的。
vector1 or vector2结果是一个向量,其中包含 的所有原始元素(标签集 + 值)vector1以及vector2 中没有匹配标签集的所有元素vector1。
vector1 unless vector2结果是一个由元素组成的向量 vector1,其中不存在vector2具有完全匹配的标签集的元素。两个向量中的所有匹配元素都将被删除。
下面针对上述运算进行示例说明:
使用 and 进行联合查询磁盘可用率大于 30%小于等于 60%的主机,语法为:
(node_filesystem_avail_bytes{mountpoint="/"} /
node_filesystem_size_bytes{mountpoint="/"} ) * 100 > 30 and
(node_filesystem_avail_bytes{mountpoint="/"} /
node_filesystem_size_bytes{mountpoint="/"} ) * 100 <=60

查询主机磁盘剩余空间,并且排除掉 shm 和 tmpfs 的磁盘,语法为:
node_filesystem_free_bytes unless node_filesystem_free_bytes{device=~"shm|tmpfs"}

当然,这个语法也可以直接写为
node_filesystem_free_bytes{device!~"shm|tmpfs"}
二、PromQL 常用函数¶
下面主要介绍使用一些常用函数对数据进一步处理:
使用 sum 函数统计当前监控目标所有主机根分区剩余的空间,语法为:
sum(node_filesystem_free_bytes{mountpoint="/"}) / 1024^3
计算所有的请求总量,语法为:
sum(http_request_total)
根据 statuscode 和 handler 两个指标进一步统计,语法为:
sum(http_request_total) by (statuscode, handler)
根据 statuscode 和 handler 两个指标进一步统计,找到排名前五的数据,语法为:
topk(5, sum(http_request_total) by (statuscode, handler))
根据 statuscode 和 handler 两个指标进一步统计,找到排名最后三个的数据,语法为:
bottomk(3, sum(http_request_total) by (statuscode, handler))
找出统计结果中最小的数据,语法为:
min(node_filesystem_avail_bytes{mountpoint="/"}) / 1024 ^ 3
找出统计结果中最大的数据,语法为:
max(node_filesystem_avail_bytes{mountpoint="/"}) / 1024 ^ 3
找出统计结果中数据的平均值,语法为:
avg(node_filesystem_avail_bytes{mountpoint="/"}) / 1024 ^ 3
四舍五入,向上取最接近的整数,比如2.79 → 3,语法为:
ceil(node_filesystem_avail_bytes{mountpoint="/"}) / 1024 ^ 3
向下取整数,比如2.79 → 2,语法为:
floor(node_filesystem_avail_bytes{mountpoint="/"}) / 1024 ^ 3
对结果进行正向排序,语法为:
sort(sum(http_request_total) by (statuscode, handler))
对结果进行逆向排序,语法为:
sort_desc(sum(http_request_total) by (statuscode, handler))
函数 predict_linear 可以用于预测分析和预测性告警,比如可以根据一天的数据,预测 4 个 小时后,磁盘分区的空间会不会小于 0,语法为:
predict_linear(node_filesystem_files_free{mountpoint="/"}[1d], 4*3600) < 0
函数increase 是 计算在一段时间范围内数据的增长(只能计算 count 类型的数据),比如查询某个请求在每秒的时间增长了多少,语法为:
increase(kubelet_http_requests_total{metrics_path="/metrics"}[10m])/600
函数rate和函数irate 是计算增长率,相对于 increase,rate 可以直接计算出某个指标在给定时间范围内的增长率,比如还是计算 1s 的增长率,可以用 rate 函数进行计算,语法为:
rate(kubelet_http_requests_total{metrics_path="/metrics"}[10m])