news 2026/4/16 0:39:26

PromQL语法完全详解:从基础查询到高级函数实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PromQL语法完全详解:从基础查询到高级函数实战

一、PromQL基础入门

1.1 PromQL简介

PromQL(Prometheus Query Language)是Prometheus内置的数据查询语言,支持对时间序列数据进行查询、聚合、逻辑运算等操作。它广泛应用于Prometheus的日常应用中,包括数据查询、可视化、告警处理等场景。

简单来说,所有需要用到数据筛选的地方,都会用到PromQL,例如监控指标的设置、报警指标的设置等。

1.2 基础查询示例

访问Prometheus Web UI,选择Graph,在查询框中输入:prometheus_http_requests_total并执行:

查询结果显示所有指标名称为prometheus_http_requests_total的数据。


二、时间序列与数据类型

2.1 时间序列概念

Prometheus将所有采集到的样本数据以时间序列的方式保存,每条时间序列通过指标名称标签集命名。

样本组成

  • 指标(metric):metric name + labelsets

  • 时间戳(timestamp):精确到毫秒的时间戳

  • 样本值(value):float64浮点型数据

示例格式

text

http_request_total{status="200", method="GET"}@1434417560938 => 94355

2.2 数据类型分类

PromQL表达式返回的结果有四种类型:

类型说明示例
瞬时向量一组时间序列,每个时间序列包含单个样本(最新值)prometheus_http_requests_total
区间向量一组时间序列,每个包含一段时间范围内的样本数据prometheus_http_requests_total[5m]
标量简单的数字浮点值10
字符串简单的字符串值"example"

2.3 指标类型详解

Prometheus定义了4种指标类型:

1. Counter(计数器)

只增不减的计数器,用于记录累计值,如请求总量。

常用操作

promql

# 获取HTTP请求量的增长率 rate(http_requests_total[5m]) # 查询访问量前10的HTTP请求 topk(10, http_requests_total)
2. Gauge(仪表盘)

可增可减的计量器,用于反应当前状态,如内存使用量。

常用操作

promql

# 计算CPU温度在2小时内的差异 delta(cpu_temp_celsius{host="zeus"}[2h]) # 预测系统磁盘空间4小时后的剩余情况 predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)
3. Histogram(直方图)与 Summary(摘要)

用于统计和分析样本的分布情况,解决长尾问题

Histogram示例

text

prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="100"} 71

Summary示例

text

prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463

三、查询语法详解

3.1 完全匹配

使用=!=进行标签的完全匹配。

示例:查看非200状态的请求

promql

prometheus_http_requests_total{code!="200"}

3.2 正则匹配

使用=~!~进行正则表达式匹配。

示例:查询handler以/api/v1开头的记录

promql

prometheus_http_requests_total{handler=~"/api/v1/.*"}

3.3 范围查询

使用时间范围选择器[]定义查询时间范围。

示例:查询最近5分钟内的所有样本数据

promql

prometheus_http_requests_total{}[5m]

时间单位

  • s- 秒

  • m- 分钟

  • h- 小时

  • d- 天

  • w- 周

  • y- 年

3.4 时间位移操作

使用offset关键字进行时间位移。

示例

promql

# 查询5分钟前的最新数据 prometheus_http_requests_total{} offset 5m # 查询1天前的数据 prometheus_http_requests_total{}[1d] offset 1d

四、聚合操作

4.1 基本聚合函数

PromQL提供多种聚合函数对时间序列进行处理:

函数说明示例
sum()求和sum(prometheus_http_requests_total)
min()最小值min(prometheus_http_requests_total)
max()最大值max(prometheus_http_requests_total)
avg()平均值avg(prometheus_http_requests_total)
count()计数count(prometheus_http_requests_total)

count函数结果:

sum函数结果:

avg函数结果:

4.2 标准差与方差

用于描述数据的波动情况。

示例

promql

# 计算标准差 stddev(prometheus_http_requests_total) # 计算标准方差 stdvar(prometheus_http_requests_total)

标准差说明图:

标准差查询结果:

4.3 排名函数

promql

# 获取前5位的请求 topk(5, prometheus_http_requests_total) # 获取后5位的请求 bottomk(5, prometheus_http_requests_total)

五、操作符详解

5.1 数学运算符

支持:+(加法)、-(减法)、*(乘法)、/(除法)、%(求余)、^(幂运算)

示例:将字节单位转换为MB

promql

prometheus_http_response_size_bytes_sum/8/1024

5.2 布尔运算符

支持:==(相等)、!=(不相等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)

示例:筛选请求次数超过20次的接口

promql

prometheus_http_requests_total > 20

使用bool修饰符返回0/1值:

promql

prometheus_http_requests_total > bool 20

布尔运算符结果:

bool修饰符结果:

5.3 集合运算符

操作符说明示例
and与操作,返回两个向量中都存在的元素vector1 and vector2
or或操作,返回两个向量中的所有元素vector1 or vector2
unless排除操作,返回第一个向量中不在第二个向量中的元素vector1 unless vector2

5.4 操作符优先级

从高到低依次为:

  1. ^

  2. *,/,%

  3. +,-

  4. ==,!=,<=,<,>=,>

  5. and,unless

  6. or


六、内置函数实战

6.1 增长率计算

rate()函数

计算区间向量在时间窗口内的平均增长速率。

示例

promql

rate(node_cpu[2m])
irate()函数

计算区间向量的瞬时增长率,灵敏度更高。

示例

promql

irate(node_cpu[2m])

对比

  • rate():适合长期趋势分析和告警规则

  • irate():适合短期波动分析和瞬时状态监控

6.2 增长预测

predict_linear()函数基于简单线性回归预测时间序列的未来值。

示例:预测磁盘空间4小时后是否被占满

promql

predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

6.3 其他常用函数

scalar()函数

将单个瞬时向量转换为标量。

字符串操作

直接使用字符串作为表达式会返回字符串。


七、实战技巧与最佳实践

7.1 查询优化建议

  1. 避免全量查询:尽量使用标签过滤减少数据量

  2. 合理使用范围:根据需求选择合适的时间范围

  3. 利用聚合:在查询时进行预聚合,减少后续处理压力

7.2 常见场景示例

场景1:监控错误率

promql

# 计算HTTP 5xx错误率 sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
场景2:CPU使用率计算

promql

# 节点CPU使用率 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100)
场景3:内存使用率

promql

# 节点内存使用率 (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

总结

本文全面介绍了PromQL的核心概念、语法规则、操作符和内置函数,通过丰富的示例演示了各种查询场景。掌握PromQL是有效使用Prometheus进行监控告警的关键,建议读者:

  1. 理解数据模型:熟悉时间序列、指标类型等基础概念

  2. 掌握查询语法:熟练使用标签匹配、范围查询、聚合操作

  3. 善用内置函数:合理运用rate、irate、predict_linear等函数

  4. 优化查询性能:避免低效查询,提高监控系统效率

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:21:40

DeOldify图像上色实战:三步操作让老照片重获新生

DeOldify图像上色实战&#xff1a;三步操作让老照片重获新生 翻开家里的老相册&#xff0c;那些泛黄的黑白照片总是让人感慨万千。爷爷奶奶年轻时的模样&#xff0c;父母结婚时的场景&#xff0c;童年模糊的记忆……这些珍贵的瞬间因为缺少色彩&#xff0c;仿佛隔着一层时间的…

作者头像 李华
网站建设 2026/4/16 10:21:37

MusePublic在Ubuntu系统上的高性能部署指南

MusePublic在Ubuntu系统上的高性能部署指南 1. 为什么选择Ubuntu来部署MusePublic 很多人第一次接触MusePublic时&#xff0c;会纠结该选什么系统来跑。我试过Windows、macOS和好几种Linux发行版&#xff0c;最后发现Ubuntu确实是目前最省心的选择。不是因为官方文档只写了Ub…

作者头像 李华
网站建设 2026/4/15 12:45:58

Lychee-rerank-mm在数字营销中的创新应用案例分享

Lychee-rerank-mm在数字营销中的创新应用案例分享 1. 引言&#xff1a;当营销素材库遇上智能排序 想象一下这个场景&#xff1a;你是一家电商公司的营销负责人&#xff0c;正在为即将到来的夏季大促准备素材。市场部同事发来了一个文件夹&#xff0c;里面有500张商品图、模特…

作者头像 李华
网站建设 2026/4/16 12:05:47

ccmusic-database音乐分类模型微调:迁移学习技巧

ccmusic-database音乐分类模型微调&#xff1a;迁移学习技巧 最近在做一个音乐推荐相关的项目&#xff0c;需要更精准地识别一些细分音乐风格&#xff0c;比如区分“独立摇滚”和“另类摇滚”&#xff0c;或者识别一些融合了电子元素的流行歌曲。直接用现成的ccmusic-database…

作者头像 李华
网站建设 2026/4/16 10:19:17

RMBG-2.0轻量级AI工具部署教程:国产昇腾910B芯片适配方案

RMBG-2.0轻量级AI工具部署教程&#xff1a;国产昇腾910B芯片适配方案 1. 为什么你需要一个真正轻量又精准的抠图工具 你有没有遇到过这样的情况&#xff1a;电商运营要批量处理上百张商品图&#xff0c;每张都要换纯白背景&#xff1b;HR同事急着做入职证件照系统&#xff0c…

作者头像 李华
网站建设 2026/4/15 19:12:23

YOLO12模型的多任务学习框架设计

YOLO12模型的多任务学习框架设计 如果你正在做计算机视觉项目&#xff0c;可能会遇到一个头疼的问题&#xff1a;一个模型只能干一件事。比如&#xff0c;检测模型只能画框&#xff0c;分割模型只能抠图&#xff0c;分类模型只能打标签。要是能让一个模型同时搞定这些任务&…

作者头像 李华