news 2026/5/14 19:19:30

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/5/14 14:00:53

MedGemma 1.5模型联邦学习:跨医院协作的隐私保护方案

MedGemma 1.5模型联邦学习&#xff1a;跨医院协作的隐私保护方案 1. 当医疗AI遇上数据孤岛&#xff1a;一个现实困境的直观呈现 你有没有想过&#xff0c;为什么一家三甲医院的肺结节识别模型&#xff0c;在另一家同等级医院却表现平平&#xff1f;不是因为医生水平不同&…

作者头像 李华
网站建设 2026/5/14 14:00:34

PP-DocLayoutV3实战教学:学术论文元素智能提取

PP-DocLayoutV3实战教学&#xff1a;学术论文元素智能提取 1. 引言 如果你是一名研究生、科研人员&#xff0c;或者经常需要处理大量学术文献&#xff0c;你一定遇到过这样的烦恼&#xff1a;面对一篇几十页的PDF论文&#xff0c;想要快速提取其中的摘要、图表、公式和参考文…

作者头像 李华
网站建设 2026/5/14 14:01:06

Asian Beauty Z-Image Turbo效果展示:同一Prompt下不同CFG Scale人像表现差异

Asian Beauty Z-Image Turbo效果展示&#xff1a;同一Prompt下不同CFG Scale人像表现差异 如果你用过AI画图工具&#xff0c;可能会发现一个有趣的现象&#xff1a;明明输入了同样的描述词&#xff0c;但每次生成的图片风格、细节和“听话”程度却不太一样。这背后&#xff0c…

作者头像 李华
网站建设 2026/5/13 7:26:08

Qwen3-ASR-0.6B与STM32嵌入式系统集成

Qwen3-ASR-0.6B与STM32嵌入式系统集成 1. 为什么要在STM32上跑语音识别模型 你有没有想过&#xff0c;让一个只有几百KB内存的微控制器听懂人说话&#xff1f;这不是科幻电影里的场景&#xff0c;而是正在发生的现实。当我们在智能家电、工业设备或便携终端上需要语音交互能力…

作者头像 李华
网站建设 2026/5/12 22:25:07

移动端集成方案:Qwen3-ForcedAligner-0.6B在Android端的优化实践

移动端集成方案&#xff1a;Qwen3-ForcedAligner-0.6B在Android端的优化实践 最近在做一个需要给视频自动打上精确字幕的项目&#xff0c;核心需求就是音文对齐&#xff0c;也就是给音频里的每个词都标上开始和结束的时间点。一开始在服务器上跑&#xff0c;效果不错&#xff…

作者头像 李华