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% 的循环折扣。