PromQL 查询语言完全指南

PromQL(Prometheus Query Language)是 Prometheus 内置的查询语言,用于实时查询和聚合时间序列数据。掌握 PromQL 是使用 Prometheus 和 Grafana 进行监控的关键技能。本文将从基础语法到高级用法全面讲解 PromQL。

一、基础概念

  • 指标(Metric):一个带有名称的时间序列数据流,如 node_cpu_seconds_total
  • 标签(Label):附加在指标上的键值对,用于区分不同维度,如 {instance="server01", mode="idle"}
  • 样本(Sample):某个时间点的具体值,由时间戳和数值组成。

指标类型有四种:Counter(只增计数器)、Gauge(可增减仪表)、Histogram(直方图)、Summary(摘要)。

二、选择器

2.1 即时向量选择器

# 选择所有 node_cpu_seconds_total 指标
node_cpu_seconds_total

# 精确匹配标签
node_cpu_seconds_total{mode="idle"}

# 多个标签条件
node_cpu_seconds_total{mode="idle", instance="server01:9100"}

# 不等于匹配
node_cpu_seconds_total{mode!="idle"}

# 正则匹配
node_cpu_seconds_total{mode=~"user|system"}

# 正则不匹配
node_cpu_seconds_total{mode!~"idle|iowait"}

2.2 范围向量选择器

# 最近 5 分钟的数据
node_cpu_seconds_total{mode="idle"}[5m]

# 时间单位:s(秒) m(分) h(时) d(天) w(周) y(年)
node_network_receive_bytes_total[1h]

# 偏移修饰符:查询 1 小时前的数据
node_cpu_seconds_total{mode="idle"} offset 1h

# 范围向量加偏移
rate(node_cpu_seconds_total{mode="idle"}[5m] offset 1h)

三、运算符

3.1 算术运算符

# 内存使用率(百分比)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 字节转 GB
node_memory_MemTotal_bytes / 1024 / 1024 / 1024

# 磁盘剩余空间百分比
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100

3.2 比较运算符

# CPU 使用率超过 80% 的实例
(1 - avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 80

# 磁盘使用率低于 20% 的分区(即剩余超过 80%)
node_filesystem_avail_bytes / node_filesystem_size_bytes * 100 < 20

# 使用 bool 修饰符返回 0/1
up == bool 1

3.3 逻辑运算符

# and:取交集
node_cpu_seconds_total{mode="idle"} and node_cpu_seconds_total{cpu="0"}

# or:取并集
up{job="node"} or up{job="prometheus"}

# unless:取差集
node_cpu_seconds_total unless node_cpu_seconds_total{mode="idle"}

四、函数

4.1 速率函数

# rate:计算每秒增长率(推荐用于 Counter 类型)
rate(node_cpu_seconds_total{mode="idle"}[5m])

# irate:基于最近两个样本的瞬时速率
irate(node_cpu_seconds_total{mode="idle"}[5m])

# increase:计算时间范围内的增长量
increase(node_network_receive_bytes_total[1h])

4.2 聚合函数

# sum:求和
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m]))

# avg:平均值
avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))

# max / min:最大/最小值
max by(instance) (node_filesystem_size_bytes)

# count:计数
count(up == 1)

# topk / bottomk:前 N / 后 N 个
topk(5, rate(node_network_receive_bytes_total[5m]))

# quantile:分位数
quantile(0.95, rate(http_request_duration_seconds[5m]))

4.3 时间函数

# 当前时间戳
time()

# 一天中的小时(0-23)
hour()

# SSL 证书剩余天数
(probe_ssl_earliest_cert_expiry - time()) / 86400

# 服务运行时长
time() - process_start_time_seconds

4.4 其他常用函数

# abs:绝对值
abs(rate(node_cpu_seconds_total[5m]))

# ceil / floor:向上/向下取整
ceil(node_memory_MemTotal_bytes / 1073741824)

# clamp_min / clamp_max:限制最小/最大值
clamp_min(free_memory_percent, 0)

# label_replace:替换标签值
label_replace(up, "hostname", "$1", "instance", "(.*):.*")

# predict_linear:线性预测
predict_linear(node_filesystem_avail_bytes[6h], 24*3600)

五、常用查询模板

5.1 CPU 监控

# 总 CPU 使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 按模式分类的 CPU 使用分布
avg by(mode) (rate(node_cpu_seconds_total[5m])) * 100

# 1/5/15 分钟负载
node_load1 / count without(cpu, mode) (node_cpu_seconds_total{mode="idle"})

5.2 内存监控

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

# 可用内存(GB)
node_memory_MemAvailable_bytes / 1073741824

# Swap 使用情况
node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes

5.3 磁盘监控

# 磁盘使用率
(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100

# 预测磁盘将在多少小时后填满
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*3600) < 0

5.4 网络监控

# 入站速率(Mbps)
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8 / 1000000

# 出站速率(Mbps)
rate(node_network_transmit_bytes_total{device="eth0"}[5m]) * 8 / 1000000

六、查询优化建议

  • 优先使用标签过滤缩小查询范围,避免全量扫描。
  • 使用 rate() 而非 irate() 进行长时间范围的平滑计算。
  • 在 Grafana 中使用 $__rate_interval 变量代替硬编码时间范围。
  • 避免使用过于复杂的正则表达式匹配标签。
  • 对高基数指标使用 without 代替 by 进行聚合。

七、在 Prometheus Web UI 中调试

访问 http://你的IP:9090,在「Graph」页面可以输入 PromQL 查询并查看结果。「Console」视图显示当前值,「Graph」视图显示时间序列图表。

# 查看所有可用的指标名称
curl http://localhost:9090/api/v1/label/__name__/values | python3 -m json.tool

# 查看指标的标签
curl "http://localhost:9090/api/v1/series?match[]=node_cpu_seconds_total" | python3 -m json.tool

总结

PromQL 是 Prometheus 监控体系的核心技能,熟练掌握后可以在 Grafana 中创建各种 自定义仪表板,也能编写精准的 告警规则。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。