PromQL(Prometheus 查询语言)语法详解
以下是 PromQL(Prometheus 查询语言) 的核心语法详解,结合关键概念、操作符、函数及实际用例,助您快速掌握:
一、基础结构
1. 时间序列选择
- 精确匹配
http_requests_total{job="api-server", status="200"} # 选择 job=api-server 且 status=200 的序列
- 正则匹配
http_requests_total{status=~"5.."} # 匹配状态码为 5xx 的序列 node_disk_bytes_read{device!~"nvme.*"} # 排除 NVMe 磁盘
2. 数据类型
类型 | 说明 | 示例 |
---|---|---|
即时向量 | 单一时间戳的数据点集合 | node_cpu_seconds_total |
范围向量 | 指定时间窗口内的数据点集合 | http_requests_total[5m] |
标量 | 纯数值(可参与计算) | 3.14 |
二、核心操作符
1. 算术运算(结果为新向量)
# 将内存字节转为 MB
node_memory_used_bytes / (1024 * 1024)
2. 比较运算(过滤数据)
# 筛选内存不足 100MB 的节点
node_memory_free_bytes < 100 * 1024^2
3. 逻辑运算
# 合并两个条件的序列
up{job="app"} or up{job="db"}
# 排除满足条件的序列
http_errors unless test_environment
4. 聚合运算
# 按 job 分组计算每秒请求率
sum by(job) (rate(http_requests_total[5m]))
# 排除 instance 标签后取最大值
max without(instance) (cpu_usage)
三、关键函数
1. 速率与增量
函数 | 用途 | 示例 |
---|---|---|
rate(v range) | 计算每秒平均增长率(推荐计数器) | rate(http_requests_total[5m]) |
irate(v range) | 计算瞬时增长率(敏感但易尖峰) | irate(network_bytes[1m]) |
increase(v range) | 计算时间窗口内总增量 | increase(user_signups[24h]) |
2. 时间窗口聚合
# 过去 1 小时内存可用量的平均值
avg_over_time(node_memory_free_bytes[1h])
# 过去 30 分钟磁盘 IO 最大值
max_over_time(disk_io_ops[30m])
3. 其他高频函数
# 预测磁盘 6 小时后是否满载
predict_linear(node_filesystem_free_bytes[1h], 6*3600) < 0
# 统计不同状态码的数量
count by(status_code) (http_requests_total)
四、高级技巧
1. 时间偏移(offset
)
# 对比今日与昨日同时段流量
rate(http_requests_total[1h] offset 1d)
2. 子查询
# 计算过去 1 小时内每 5 分钟速率的最大值
max_over_time( rate(http_requests_total[5m])[1h:] )
五、经典场景示例
1. CPU 使用率
100 - ( avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
)
2. HTTP 错误率
# 5xx 错误率
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
3. 内存不足预警
# 根分区剩余空间 < 20%
node_filesystem_free_bytes{mountpoint="/"}
/
node_filesystem_size_bytes{mountpoint="/"} < 0.2
六、避坑指南
-
范围向量需搭配函数:
❌http_requests_total[5m]
(无效)
✅rate(http_requests_total[5m])
(正确) -
避免全量扫描:
用标签缩小查询范围(如{cluster="prod"}
)。 -
计数器重置问题:
使用rate()
或increase()
自动处理计数器归零。
官方资源
- PromQL 完整文档
- 函数大全
提示:在 Grafana 中使用
Explore
模式实时验证查询,结合Time Range
和Step
调整精度。