PromQL 从基础入门教程
PromQL 从基础入门教程
PromQL(Prometheus Query Language)是 Prometheus 的查询语言,用于从时间序列数据库中提取和计算监控数据。本教程从基础语法开始,逐步介绍 PromQL 的核心概念和常见用法。
1. PromQL 基础概念
1.1 时间序列(Time Series)
Prometheus 存储的数据是 时间序列(Time Series),格式如下:
<指标名称>{<标签1>=<值1>, <标签2>=<值2>, ...} <时间戳> <值>
例如:
http_requests_total{method="GET", status="200"} @1650000000 42
http_requests_total
是指标名{method="GET", status="200"}
是标签(用于筛选)1650000000
是时间戳(Unix 时间)42
是该时间点的值
1.2 数据类型
PromQL 支持 4 种数据类型:
- 瞬时向量(Instant Vector):某一时刻的所有时间序列(如
node_cpu_seconds_total
)。 - 区间向量(Range Vector):某段时间内的多个时间序列(如
rate(node_cpu_seconds_total[5m])
)。 - 标量(Scalar):单个数值(如
42
)。 - 字符串(String):文本(较少使用)。
2. 基本查询
2.1 查询瞬时数据
node_cpu_seconds_total # 查询所有 CPU 时间
node_cpu_seconds_total{mode="idle"} # 只查询空闲 CPU 时间
node_cpu_seconds_total{instance="10.0.0.1:9100"} # 查询特定实例
2.2 查询区间数据
node_cpu_seconds_total[5m] # 查询过去 5 分钟的数据
rate(node_cpu_seconds_total[5m]) # 计算 5 分钟内的平均增长率
3. 常用运算符
3.1 算术运算
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes # 计算已用内存
node_filesystem_free_bytes / node_filesystem_size_bytes * 100 # 计算磁盘剩余百分比
3.2 比较运算
node_memory_MemAvailable_bytes < 1e9 # 可用内存 < 1GB
rate(node_network_receive_bytes_total[5m]) > 1e6 # 网络接收速率 > 1MB/s
3.3 逻辑运算
node_load5 > 5 or node_load5 < 1 # 高负载或低负载
up == 0 # 宕机的实例
4. 聚合操作
4.1 sum()
求和
sum(node_cpu_seconds_total) # 所有 CPU 时间总和
sum by(instance)(node_cpu_seconds_total) # 按实例分组求和
4.2 avg()
求平均
avg(node_memory_MemAvailable_bytes) # 平均可用内存
4.3 max()
/ min()
最大/最小值
max(rate(node_network_receive_bytes_total[5m])) # 最大网络接收速率
4.4 count()
计数
count(node_cpu_seconds_total) # 有多少个 CPU 核心
5. 高级查询
5.1 rate()
计算增长率
rate(http_requests_total[5m]) # 5 分钟内 HTTP 请求的增长率
5.2 increase()
计算增量
increase(http_requests_total[1h]) # 过去 1 小时的 HTTP 请求增量
5.3 irate()
瞬时增长率
irate(node_network_receive_bytes_total[5m]) # 更灵敏的网络流量计算
5.4 predict_linear()
预测未来值
predict_linear(node_filesystem_free_bytes[1h], 4*3600) # 预测 4 小时后磁盘剩余空间
6. 实战示例
6.1 CPU 使用率
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
6.2 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
6.3 磁盘使用率
(node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100
6.4 网络流量
rate(node_network_receive_bytes_total[5m]) / 1024 / 1024 # MB/s
7. 总结
功能 | 示例 |
---|---|
基本查询 | node_cpu_seconds_total |
标签过滤 | node_cpu_seconds_total{mode="idle"} |
区间查询 | node_cpu_seconds_total[5m] |
聚合计算 | sum by(instance)(node_cpu_seconds_total) |
增长率 | rate(http_requests_total[5m]) |
预测 | predict_linear(node_filesystem_free_bytes[1h], 3600) |
8. 学习资源
- Prometheus 官方文档
- PromQL Cheat Sheet
- Grafana + Prometheus 实战
✅ 现在你可以尝试在 Prometheus 的 Graph 或 Grafana 中运行这些查询!
🚀 进阶学习:尝试编写告警规则(Alert Rules)和 Dashboard 可视化。