当前位置: 首页 > news >正文

PromSL详解

PromSL详解

PromQL(Prometheus Query Language)是Prometheus监控系统的核心查询语言,专门用于处理时间序列数据。下面通过一个表格快速了解其核心概念: 

 

特性分类

核心概念

说明

​数据模型​

时间序列 (Time Series)

由指标名称(Metric Name)和一组标签(Label)唯一标识的数据点序列,格式为 <metric_name>{<label_name>=<label_value>, ...}

 

指标类型 (Metric Types)

主要包括:
- ​Counter(计数器)​​:只增不减的累积指标,如请求总数

- ​Gauge(仪表盘)​​:可任意变化的瞬时指标,如CPU使用率
- ​Histogram(直方图)​​ & ​Summary(摘要)​​:用于统计和分析数据的分布情况

​查询操作​

即时向量 (Instant Vector)

每个时间序列只包含单个最新数据点的查询结果

 

范围向量 (Range Vector)

包含一个时间范围内所有数据点的查询结果

 

匹配模式

支持完全匹配(=, !=)和正则匹配(=~, !~)来过滤时间序列

​功能与应用​

聚合运算 (Aggregation)

支持使用 sum, avg, count, max, min等函数对数据进行聚合计算

 

应用场景

用于临时数据查询与调试、Grafana等工具中的数据可视化、以及定义告警规则

 

一. 核心概念

理解 PromQL 前,需要先了解其数据模型和基本数据类型

 

1.数据模型:Prometheus 的数据由时间序列(Time Series)​​ 组成,每条序列由指标名称(Metric Name)​、标签(Label)​、以及一系列的样本(Sample)​​(即 (timestamp, value) 数据点)构成。其格式通常为 <metric_name>{<label_name>=<label_value>, ...},例如 http_requests_total{method="GET", status="200", instance="localhost:9090"}

 

2.指标类型:

  • Counter(计数器):只增不减的累积指标,如 HTTP 请求总数、CPU 使用时间。适用于统计累计值和计算速率。
  • Gauge(仪表盘):可任意变化的瞬时指标,如内存使用量、CPU 使用率、温度。适用于反映当前状态。
  • Histogram(直方图)& Summary(摘要):用于统计和分析数据的分布情况,如请求延迟。

 

3.数据类型:PromQL 表达式操作或计算后,主要会产生以下几种类型的结果:

  • Instant Vector(瞬时向量):同一时间戳下的一组时间序列,每个序列包含最新的一个样本值。例如 http_requests_total
  • Range vector(范围向量):一段时间范围内的一组时间序列,每个序列包含多个样本值。例如 http_requests_total[5m]。范围向量不能直接图表化,需借助函数处理。
  • Scalar(标量):一个简单的浮点数值,如 10。
  • String(字符串):简单的字符串值(在 PromQL 中较少使用)

 

二. 查询操作

PromQL 提供了强大的选择器和操作符来查询和操作时间序列数据

 

1.时间序列选择器

  • 瞬时向量选择器:直接使用指标名称或通过 {}和标签进行过滤。
http_requests_total                     # 查询所有时间序列
http_requests_total{method="GET"}       # 完全匹配标签
http_requests_total{status=~"5.."}      # 正则匹配标签:状态码为5xx的请求
http_requests_total{environment=""}     # 匹配缺少该标签的时间序列
  • 范围向量选择器:在瞬时向量选择器后附加 [<时长>]来查询一段时间内的数据。
http_requests_total[5m]                  # 过去5分钟的所有样本
node_cpu_seconds_total{mode="idle"}[1h]   # 过去1小时CPU空闲时间

# 支持的时间单位:s(秒), m(分钟), h(小时), d(天), w(周),y(年)
  • 偏移修饰符(Offset):使用 offset关键字查询历史数据
http_requests_total offset 5m            # 查询5分钟前的瞬时数据
http_requests_total[1d] offset 1d        # 查询昨天一天的数据

 

2.操作符

PromQL 支持丰富的操作符来对数据进行运算和比较。

  • 算术运算符:+, -, *, /, %, ^(幂运算)
# 计算内存使用率
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes * 100
  • 比较运算符:==, !=, >, <, >=, <=
up == 1  # 筛选状态为 "up" 的实例
  • 逻辑/集合运算符:and, or, unless
# 找出请求量高且错误率也高的实例
rate(http_requests_total[5m]) > 100 and rate(http_errors_total[5m]) > 1
  • 聚合运算符:sum, min, max, avg, stddev, stdvar, count, group。常与 bywithout结合使用,以指定根据哪些标签进行分组聚合或排除哪些标签进行聚合。
# 按 job 分组计算请求总量
sum by(job) (http_requests_total)
# 计算所有实例的请求总量,忽略 instance 标签
sum without(instance) (http_requests_total)

 

三. 常用函数

PromQL 提供了大量内置函数来处理时间序列数据。

函数类型

函数名

说明

示例

​速率计算​

rate(v range_vector)

计算范围向量中时间序列的平均每秒增长率,自动处理计数器重置

rate(http_requests_total[5m])

 

irate(v range_vector)

计算范围向量中时间序列的瞬时每秒增长率​(基于最后两个样本),对变化更敏感

irate(http_requests_total[1m])

 

increase(v range_vector)

计算范围向量中时间序列的指定时间范围内的总增量,自动处理计数器重置

increase(http_requests_total[1h])

​聚合函数​

sum()

对时间序列的值求和

sum(rate(http_requests_total[5m])) by (job)

 

avg()

对时间序列的值求平均值

avg(rate(http_requests_total[5m])) by (method)

 

max()/ min()

找出一组时间序列中的最大值或最小值

max(rate(http_requests_total[5m]))

 

count()

统计时间序列的数量

count(up)

 

topk(k, instant_vector)

返回样本值最大的 k 条时间序列

topk(3, http_requests_total)

​时间聚合​

avg_over_time()

计算指定时间范围内每个时间序列的平均值

avg_over_time(node_memory_MemFree_bytes[5m])

​分位数计算​

histogram_quantile(φ, instant_vector)

根据直方图指标计算分位数 (φ ∈ [0,1])

histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

​数据处理​

absent()

如果具有指定名称和标签的时间序列不存在,则返回空向量,常用于检测指标是否存在

absent(up{instance="nonexistent"})

​预测​

predict_linear()

基于历史数据预测时间序列未来的值

predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)# 预测4小时后磁盘剩余空间

 

四. 实战示例

1.计算CPU使用率

100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)# rate(node_cpu_seconds_total{mode="idle"}[5m])计算每个实例过去5分钟的平均空闲率,avg by(instance)按实例聚合,最后用 100 - ... * 100得到使用率百分比

2.计算HTTP请求错误率(5xx)

sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100# 先计算状态码为5xx的请求速率和总请求速率,相除后乘以100得到错误率百分比

3.计算P99请求延迟

histogram_quantile(0.99, sum by(le) (rate(http_request_duration_seconds_bucket[5m])))# 对直方图指标 http_request_duration_seconds_bucket在5分钟内的增长率按 le(桶边界) 分组求和,然后计算99分位数

4.检查实例是否存活

up == 1# up指标为1表示实例健康,为0表示不健康

5.预测磁盘空间耗尽时间

predict_linear(node_filesystem_free_bytes{device="/dev/sda1"}[6h], 3600) / (1024 * 1024)# 基于过去6小时的数据,预测1小时后的磁盘剩余空间(MB)