Prometheus(5)数据查询

Prometheus提供一个数据查询语言,名叫PromQL。

用户可以实时选择和聚合时间序列数据。

查询的结果可以是一个图标、表格或者可以被外部http接口调用数据。

查询类型

表达式可以查询下面四种类型。

瞬时向量(Instant vector)

某一个瞬间的指标量的值,比如直接查询node_network_receive_bytes_total,可以得到两个网卡分别接收的数据量。

p1

这些数据只是展示在查询的一瞬间,这两个指标分别对应的数值。

范围向量(Range vector)

表示一段时间内的样本数据。

比如最近1分钟网络接收字节数,node_network_receive_bytes_total[1m]

后面的[1m]是限制区间时间范围,查询过去1分钟之内的数据。

p2

因为我们在prometheus.yml文件中,配置的抓取时间间隔为5秒,所以1分钟内,每一个指标的抓取数量都是12个。

标量(Scalar)

标量可以是一个整型数字,或者浮点数字,有时候为了可读性,会转化成一个非数字的字符串。

下面的值都是合法的。

1
2
3
4
5
6
23
-2.43
3.4e-9
0x8f
-Inf
NaN

比如计算当前所有网卡的接收字节数总量,sum(node_network_receive_bytes_total)

p3

字符串(string)

表示一个简单的字符串,但是当前似乎没什么用。

时间选择

时间范围

因为数据是基于时间序列的,所以时间范围的筛选是里面非常重要的一个功能。

刚才在范围向量里面已经介绍了获取过去1分钟内的数据,是用[1m]放在指标后面。

PromQL支持下面的这些时间单位:

  • ms 毫秒
  • s 秒
  • m 分钟
  • h 小时
  • d 天
  • w 周
  • y 年

注意这里面没有月份这样的表示单位。

时间范围可以组合使用,比如:

1
2
1h30m // 一小时30分钟
1y56d // 一年零56天

时间位移

上面的时间范围都是基于当前时间向前推移的,如果我们想要获取一个小时之前的1分钟内的指标,就需要使用offset关键字。

1
node_network_receive_bytes_total[1m] offset 1h

p4

除了offset关键字,PromQL提供了另外一个选项,用户可以指定特定的10位时间戳为当前时间获取数据,使用@标识符。

2023-06-25 12:00:00的时间戳为1687665600,获取这个时刻的node_network_receive_bytes_total指标。

1
node_network_receive_bytes_total @ 1687665600

p5