PromQL查询

Prometheus采用时序数据库存储监控信息的时间序列数据,因此PromQL其实就是针对这种时间序列数据的查询表达式,这篇笔记我们学习PromQL的用法。

基本概念

Prometheus收集的数据被称为时间序列,时间序列由样本组成。样本由三部分组成:

  • 指标(metric):包括指标名和若干标签
  • 时间戳(timestamp):收集样本的时间,精确到毫秒
  • 样本值(value):具体数据,浮点类型

其中指标格式如下:

<metric name>{<label name>=<label value>, ...}

其中,指标名表示监控样本的含义,标签则代表当前样本的一些特征,用于对数据筛选过滤等。

metric具有4中指标类型:

  • Counter:计数器,不断累加的指标,比如网络接口的传输数据总量node_network_transmit_bytes_total
  • Gauge:仪表盘,实时增减的指标,比如当前空闲内存node_memory_MemFree
  • Histogram:直方图
  • Summary:摘要

在官方提供的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

PromQL使用

我们直接输入指标名,即可查询该指标的所有数据,例如:

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支持按bywithout进行分组统计,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

使用HTTP接口执行PromQL

前面我们执行PromQL都是在Prometheus的页面中进行的,实际上Prometheus提供了HTTP接口,我们在自己写的程序中也能很方便的访问。接口地址例子如下:

GET http://localhost:9090/api/v1/query?query=<PromQL表达式>

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap