PromQL 从基础入门教程

发布于:2025-05-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

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 种数据类型:

  1. 瞬时向量(Instant Vector):某一时刻的所有时间序列(如 node_cpu_seconds_total)。
  2. 区间向量(Range Vector):某段时间内的多个时间序列(如 rate(node_cpu_seconds_total[5m]))。
  3. 标量(Scalar):单个数值(如 42)。
  4. 字符串(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 的 Graph 或 Grafana 中运行这些查询!
🚀 进阶学习:尝试编写告警规则(Alert Rules)和 Dashboard 可视化。