Prometheus 提供了一种名为 PromQL(Prometheus Query Language)的功能查询语言,可以让用户实时选择和聚合时间序列数据。表达式的结果可以显示为图形,在 Prometheus 表达式浏览器中以表格数据形式查看,或者由外部系统通过 HTTP API使用。
在 Prometheus 的表达式语言中,表达式或子表达式可以计算为以下四种类型之一:
- 即时向量: 一组时间序列,每个时间序列包含一个样本,所有时间序列共享相同的时间戳
- 范围向量": 一组时间序列,其中包含每个时间序列随时间变化的一系列数据点
- 标量: 一个简单的浮点值
- String : 一个简单的字符串值;目前未使用
PromQL Web UI 的 Graph 选项卡提供了简单的用于查询数据的入口,对于 PromQL 的编写 和校验都可以在此位置,如图所示;输入【up】,然后点击 【Execute】,就能查到监控正常的 Target

如果条件简单,会筛选出来的结果过多。此时我们可以通过标签选择器进行过滤,比如过滤出job为node-exporter的监控,语法为:up{job="node-exporter"}

上面示例是使用的=的标签匹配运算符,除此之外,还存在以下标签匹配运算符:
!=:选择不等于提供的字符串的标签=~:选择与提供的字符串正则表达式匹配的标签!~:选择与提供的字符串正则表达式不匹配的标签
下面针对上述运算进行实例说明:
通过标签选择器过滤出 job不是以node-开头的监控,语法为:
up{job!~"node-.*"}

通过标签选择器过滤出 job不是以node-开头且 job不等于alertmanager-main的监控,语法为:
up{job!~"node-.*|alertmanager-main"}

查看主机监控的指标有哪些,可以输入node_,会提示所有主机监控的指标

查询Kubernetes集群中每个宿主机的磁盘总量,语法为:
node_filesystem_size_bytes/(1024 ^ 3)

说明:node_filesystem_size_bytes/(1024 ^ 3)中的1024 ^ 3是汇算成G
查询指定根分区大小,语法为:
node_filesystem_size_bytes{mountpoint="/"}

查询分区不是/boot,且磁盘是/dev/开头的分区大小,语法为:
node_filesystem_size_bytes{device=~"/dev/.*", mountpoint!="/boot"}

上述的PromQL查询出来的数据都是瞬时值,也就是Prometheus采集到的最新的数据,在时序数据库中被称为瞬时向量。因为Prometheus本身是一个时序数据库,所以也可以查询某个指标一段时间内的数据,比如查询主机k8s-master01在最近5分钟可用的磁盘空间变化,比如查询主机 k8s-master01 在最近 5 分钟可用的磁盘空间变化,语法为:
node_filesystem_avail_bytes{instance="k8s-master01", mountpoint="/", device="/dev/mapper/centos-root"}[5m]

可以看到查询的数据有一个时间戳(查询结果@符号后面),这个时间戳记录了数据样本的记录时间。并且能看到有多条查询结果为这5分钟内的所有数据,这种查询一段时间范围内的数据结果被称为区间向量。目前支持的范围单位如下:
ms- 毫秒s- 秒m- 分钟h- 小时d- 天 - 假设一天总是 24 小时w- 周 - 假设一周总是 7dy- 年 - 假设一年总是 365d
说明:可以通过串联来组合持续时间。单位必须按照从最长到最短的顺序排列。给定单位在一段时间内只能出现一次。
查询 10 分钟之前磁盘可用空间,只需要指定 offset 参数即可,该offset修饰符允许更改查询中各个瞬时向量和范围向量的时间偏移,语法为:
node_filesystem_avail_bytes{instance="k8s-master01", mountpoint="/", device="/dev/mapper/centos-root"} offset 10m

查询10分钟之前,5分钟区间的磁盘可用空间的变化,语法为:
node_filesystem_avail_bytes{instance="k8s-master01", mountpoint="/", device="/dev/mapper/centos-root"}[5m] offset 10m
