Prometheus采用时序数据库存储监控信息的时间序列数据,因此PromQL其实就是针对这种时间序列数据的查询表达式,这篇笔记我们学习PromQL的用法。
Prometheus收集的数据被称为时间序列,时间序列由样本组成。样本由三部分组成:
其中指标格式如下:
<metric name>{<label name>=<label value>, ...}
其中,指标名表示监控样本的含义,标签则代表当前样本的一些特征,用于对数据筛选过滤等。
metric具有4中指标类型:
node_network_transmit_bytes_total
node_memory_MemFree
在官方提供的Node Exporter
中,我们找到相关例子:
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
# TYPE node_network_transmit_bytes_total counter
node_network_transmit_bytes_total{device="bond0"} 0
node_network_transmit_bytes_total{device="dummy0"} 0
node_network_transmit_bytes_total{device="eth0"} 1076
node_network_transmit_bytes_total{device="lo"} 666466
node_network_transmit_bytes_total{device="sit0"} 0
我们直接输入指标名,即可查询该指标的所有数据,例如:
node_network_transmit_bytes_total
我们查询结果中,只包含最新的样本值,这被称为瞬间向量,除此之外后面还会介绍区间向量。
我们还可以使用大括号{}
指定标签,筛选指定数据:
node_network_transmit_bytes_total{device="lo"}
我们可以在查询语句中指定时间段:
node_network_transmit_bytes_total{device="lo"}[1m]
该语句查询当前1分钟内的数据,我们可以看到返回结果中包含多个值,这种结果被成为区间向量。
查询也可以指定偏移量:
node_network_transmit_bytes_total{device="lo"}[1m] offset 1m
该语句查询2分钟前到1分钟前的数据。
之前我们使用node_network_transmit_bytes_total
时,由于数据存在多个标签组合,结果数据返回了多条,如果想统计总数,则可以使用sum()
函数。例子如下:
sum(node_network_transmit_bytes_total)
PromQL支持按by
和without
进行分组统计,by
表示按指定的标签分组,without
则相反。下面例子中,指定按device
标签分组求和:
sum(node_network_transmit_bytes_total) by (device)
除此之外,PromQL还支持min()
、max()
、avg()
等统计聚合函数,这里就不多介绍了。
PromQL提供了一些统计常用的函数,其中最常用的是配合Counter类型的指标使用的rate()
、increase()
等函数。
下面命令统计了node_network_transmit_bytes_total
指标一分钟内的增长量:
increase(node_network_transmit_bytes_total[1m])
PromQL支持运算符对返回数据进行处理,下面例子我们统计了node_network_transmit_bytes_total
一分钟内的增长量,并除以1024将其从字节(B)换算成千字节(KiB):
increase(node_network_transmit_bytes_total[1m]) / 1024
前面我们执行PromQL都是在Prometheus的页面中进行的,实际上Prometheus提供了HTTP接口,我们在自己写的程序中也能很方便的访问。接口地址例子如下:
GET http://localhost:9090/api/v1/query?query=<PromQL表达式>