​     PromQL(Prometheus Query Language)是 Prometheus 提供的对时序数据库能够进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理的查询语言。前面几篇文章中,虽然介绍了如何添加监控把服务监控起来,但是对于监控数据查看、指标怎么读取指标数据类型 以及后续 进行数据可视化展示、如何实现服务异常时的告警等等,都是一无所知的。那么,学习 PromQL 则是实现这些的基础,本文就介绍下 PromQL 的语法和基本使用。

一、时序数据库与数据模型

1.1、关于时序数据库 TSDB

  • Prometheus 内置的 时间序列数据库简称 TSDB (Time Series Database) , 由 Facebook 开发,被用来存储周期性的采集各种实时数据监控信息。

  • Prometheus TSDB 的作用包括 存储监控数据、优化读写性能、数据分块管理、实现数据持久化、利于数据查询、便于建立多多维数据模型等等。

  • 时间序列数据库主要是用于存储和快速检索时间序列或时间戳数据的数据库,特别适用于需要频繁查询最新数据或进行复杂时间序列分析的场景。

  • 时间序列数据的特点是随时间变化的数据点集合,每个数据点包含一个时间戳和一个或多个值,它们会按照固定的时间间隔被采样并记录下来。

  • 时间序列数据的典型特点,每个数据点都带有时间戳的属性,方便在查询时要根据需要灵活的进行 标签过滤、聚合计算、范围选择、数据选择等。

1.2、Prometheus 数据模型

  • 在 Prometheus 中,每个时间序列都是由 指标名称 (Metric Name) 和标签 (Label) 来标识和组成的,语法格式为 “{=, …}” 的形式。
  • Prometheus 通过指标名称以及对应的标签来定义一条时间序列,用户基于这些进行过滤,聚合,统计后产生新的一条时间序列。
  • 指标名称用于描述系统上要测定的某个特征,支持使用字母、数字、下划线和冒号,且必须能匹配RE2规范的正则表达式。
  • 标签是键值型数据,附加在指标名称上,从而让指标支持多纬度特征。标签名称可使用字母、数字和下划线,且必须能匹配RE2规范的正则表达式。

二、Pormetheus 数据样本与类型

2.1、 数据样本相关说明

Prometheus 会将所有采集到的样本数据以时间序列的方式保存在内存数据库中,并且定时保存到硬盘上。存放在时间序列中的每一个点称为样本(Sample),而每一个样本数据,由下面四部分组成:

  • 指标名称 (metrics): 表示这个指标是监控哪一方面的状态或者表示不同的监控维度。
  • 标签 (lables): 用于对同类 Metric 进行分类,如区分不同的 API 方法或不同的实例对象。
  • 时间戳 (timestamp): 每个数据点都带有时间戳,表示该数据点的采集时间,单位毫秒。
  • 样本值 (value): 表示该时间点上的测量值,可以是一个浮点数或一个整数。

2.2、Prometheus Metrics 类型

Prometheus 支持四种 Metric 数据类型,每种类型适用于不同的监控场景。

  • Counter(计数器): 只能递增的计数器,用于记录事件的累计次数,例如 HTTP 请求总数。计数器的值不会减少,除非系统重启或被明确重置。

  • Gauge(仪表): 可以增减的指标,用于表示瞬时值,例如当前内存使用量或 CPU 利用率。仪表的值可以上下波动,适合用于监控资源使用情况。

  • Histogram(直方图): 用于测量事件的分布情况,例如请求延迟。直方图会将测量值分布在预先定义的桶(Buckets)中,并记录每个桶内的事件数量。

  • Summary(摘要): 类似于直方图,用于统计事件的分布情况和总数,同时提供分位数计算。与直方图不同,摘要是在客户端进行分位数计算,因此更加适合低延迟场景。

三、Prometheus 数据查看相关

3.1、Prometheus 数据查看说明

Prometheus 存储的数据可以通过多种方式查看,包括其内置的 Web UI、API 以及使用第三方工具。下面是一些查看 Prometheus 存储数据的方法:

  • Prometheus Web UI:浏览器中输入 "http://prometheus-server-ip:9090" , 在提示 "Expression" 的地方输入 Metrics 查询即可
  • Prometheus API 接口:Prometheus 提供了一个 REST API ,方便大家通过 HTTP 请求来查询相关数据。
  • Prometheus Query language (PromQL):PromQL 是 Prometheus 的查询语言,用于查询时间序列数据。

3.2、Prometheus 数据查看相关

下图即是查看到的 Prometheus 中的数据

1、截图的上半部分是直接在 Prometheus Web UI 界面中查看数据

2、截图的下半部分是使用命令调用 Prometheus API 接口查看数据 P00.png

指标数据相关的三个标识部分:

  • " # HELP " : 这里是指标的一个指标的信息,表示这个是一个什么指标,是统计的对象,关乎哪些特性等
  • " # TYPE " : 表示这个指标的数据类型 ( Prometheus 的 Metrics 一共四种数据类型 )
  • " <Metric_name>{<Lable_name>=<Lable_value>, ......} Value " : 样本的表示格式,<指标名> {<标签集合>< ...>} <指标值>

3.3、样本数据的时间戳

  • Prometheus 使用 Unix 时间戳(自1970年1月1日00:00:00 UTC至现在的秒数)来表示每个样本的时间。
  • 在查询 Prometheus 数据时不指定的情况下,默认都是基于当前时间戳。查看到的是当前时间点的数据。
  • 基于 Prometheus 自动 使用 Unix 时间戳来存储数值的情况,可以查询指定时间点的时候指标特征的数据。
  • 当然,我们可以让 Prometheus 存储数据的时不带上时间戳,我们自己去定义时间戳,不过一般没这种需求。

[root@test200 ~]# curl 'http://192.168.10.200:9090/api/v1/query?query=node_load1'
{"status":"success","data":{"resultType":"vector","result":
[
{"metric":{"__name__":"node_load1","instance":"192.168.10.220:9100","job":"node_exporter"},"value":[1745742315.666,"0.05"]}
]
}}

# 默认基于当前时间的查询 , 1745742315 转换后是 2025年04月27日 16:25:15 
# 下面基于当前时间的查询 , 1745746810 转换后是 2025年04月27日 17:40:10

[root@test200 ~]# curl 'http://192.168.10.200:9090/api/v1/query?query=node_load1'
{"status":"success","data":{"resultType":"vector","result":
[
{"metric":{"__name__":"node_load1","instance":"192.168.10.220:9100","job":"node_exporter"},"value":[11745746810.666,"0.05"]}
]
}}


# 在 Prometheus Web UI 界面中,查询时基于不同的时间戳,得到的查询结果也不一样的,如下图所示

P01.png

四、PormQL 的概念相关介绍

4.1、PromQL 到底是什么

  • PromQL (Prometheus Query language) 是 Prometheus 内置的查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。

  • PromQL 是 Prometheus 自己开发的表达式语言,提供对时间序列数据的逻辑运算、过滤、聚合的支持,应用于数据查询、可视化、告警处理。

  • PromQL 语言表现力很丰富,内置很多函数。使用它可以对时序数据进行筛选和聚合,还可以使用标签将不同的指标连接在一起进行算术操作。

  • PromQL 虽然是以 QL 结尾的,但它不是类似 SQL 的语言,因为在时间序列数据执行计算和处理类型时,类 SQL语言相对缺乏一定的表达能力。

4.2、PromQL 的四种类型

PromQL 表达式计算出来的值的四种类型:

  • 即时向量 (Instant vector): 也称作瞬时向量,它是指在同一时刻点,抓取的具有相同时间戳的一组样本值。
  • 区间向量 (Range vector): 也称作范围向量,它是指在任何一个时间范围内,抓取所有度量的所有样本值。
  • 标量 (Scalar): 也称作纯量,一个简单的浮点型数数据值。
  • 字符串 (String): 一个字符串值 (暂是还未被使用)。

五、PromQL 基本数据查询

PromQL 支持不同类型的查询操作,主要分为 即时查询和范围查询,二者都是基于时间序列的查询。

5.1、即时查询

即时查询用于获取当前时间的最新值,如下图 P10.png

5.2、范围查询

范围查询用于从指定的时间范围内提取多个数据点

支持表示时间范围的条件有:s、m、h、d、w、y 分别表示 秒、分、时、天、周、年 P11png.png

5.3、偏移量查询

偏移量查询是范围查询的一种特殊形式,如下图

说明:上图表示查以当前时间为基准的五分钟内的数据,下图表示查以过去时间五分钟到十分钟内的数据 P12.pngP13.png

六、PromQL 操作符与函数

6.1、PromQL 中的匹配符

PromQL支持各种条件匹配。条件匹配符有:==、!=、=~、!~

  • = : 选择与提供的字符串完全相同的数据
  • != : 选择不等于提供的字符串的数据
  • =~ : 选择与提供的字符串进行正则表达式匹配的数据
  • !~ : 选择与提供的字符串不匹配的数据

6.2、PromQL 中的运算符

  • 比较运算符: 比较运算符有 ==、!=、>、<、>=、<= ,与其在数学中表示的含义是一样的
  • 算术运算符: 算数运算符有 +、-、*、/、%、^ ,分别为 加、减、乘、除、取余、幂次方
  • 逻辑运算符: 逻辑运算符有 and、or、unless,对应其他语言的与、或、非

6.3、PromQL 中的聚合函数

PromQL 支持多种聚合操作符,用于处理指标的不同维度和计算需求。常见的聚合操作符如下:


sum():对样本值求和
min():求取样本值中的最小者
max():求取样本值中的最大者
avg():对样本值求平均值

count() :对分组内的时间序列进行数量统计
stddev() :对样本值求标准差,以帮助用户了解数据的波动大小
stdvar() :对样本值求方差,它是求取标准差过程中的中间状态
topk()   :逆序返回分组内的样本值最大的前 k 个时间序列及其值,即最大的 k 个样本值

bottomk() :顺序返回分组内的样本值最小的前 k 个时间序列及其值,即最小的 k 个样本值
count_values() :对分组内的时间序列的样本值进行数量统计,即等于某值的样本个数
quantile():分位数,用于评估数据的分布状态,该函数会返回分组内指定的分位数的值,即数值落在小于等于指定的分位区间的比例
rate() :函数是专⻔搭配counter数据类型使⽤函数,功能是取counter数据类型在这个时间段中平均每秒的增量平均数
irate():专⻔搭配counter数据类型使⽤函数,获取的是指定时间范围内最近的两个数据来计算数据的速率,适合计算数据变化⽐较⼤的数据

七、PromQL 使用相关小结

  • PromQL 查询语言是实现监控和告警的前提,掌握 PromQL 的基本语法和使用方法,能够帮助我们更好地进行监控和告警。
  • PromQL 在使用的过程中,要注意优化查询方式,减少不必要和过多的标签使用,则能够显著提升 Prometheus 系统的性能。
  • 由于笔者能力有限,本文对 PromQL 的介绍和说明,只是一个入门的介绍阶段,真正想学精 PromQL 语音,还得下更多功夫。