一、PromQL 操作符

Prometheus 的查询语言支持基本的逻辑和算术运算符。对于两个即时向量之间的运算, 可以修改匹配行为。

Prometheus 中存在以下二元算术运算符:

  • +
  • -
  • *
  • /
  • %
  • ^

下面针对上述运算进行示例说明:

查到了所有主机磁盘的剩余空间数据,语法为:

node_filesystem_avail_bytes{mountpoint="/"}/1024/1024/1024

PromQL 操作符-1

上面语法也可修改为:

node_filesystem_avail_bytes{mountpoint="/"}/(1024 ^ 3)

PromQL 操作符-2

查询 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:磁盘空间的总大小

PromQL 操作符-3

查询所有主机根分区的可用率,语法为:

node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}

PromQL 操作符-4

也可以将结果乘以100直接得到百分比,语法为:

node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100

PromQL 操作符-5

查询集群中根分区空间可用率小于 20%的主机,语法为:

(node_filesystem_avail_bytes{mountpoint="/"} /
node_filesystem_size_bytes{mountpoint="/"} ) * 100 < 20

PromQL 操作符-6

Prometheus 中存在以下二进制比较运算符:

  • ==(等于)
  • !=(不等于)
  • >(大于)
  • <(小于)
  • >=(大于或等于)
  • <=(小于或等于)

比较运算符在标量/标量、向量/标量和向量/向量值对之间定义。默认情况下,它们会进行过滤。可以通过bool在运算符之后提供来修改它们的行为,该运算符将返回 值而不是过滤0或者1

在两个标量之间,bool必须提供修饰符,并且这些运算符会生成另一个标量,即0( false) 或1 ( true),具体取决于比较结果。

下面针对上述运算进行示例说明:

查询磁盘可用率大于 30%小于等于 60%的主机,语法为:

30 < (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} ) * 100 <= 60

PromQL 操作符-7

Prometheus 中存在以下逻辑运算符:

  • and
  • or
  • unless

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

PromQL 操作符-8

查询主机磁盘剩余空间,并且排除掉 shm 和 tmpfs 的磁盘,语法为:

node_filesystem_free_bytes unless node_filesystem_free_bytes{device=~"shm|tmpfs"}

PromQL 操作符-9

当然,这个语法也可以直接写为

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])