PromQL基础 #
一、PromQL概述 #
1.1 什么是PromQL #
text
PromQL定义:
┌─────────────────────────────────────────────┐
│ PromQL (Prometheus Query Language) │
├─────────────────────────────────────────────┤
│ • Prometheus的查询语言 │
│ • 用于查询和聚合时序数据 │
│ • 支持数学运算和逻辑运算 │
│ • 支持函数和聚合操作 │
│ • 表达式语言,非声明式 │
└─────────────────────────────────────────────┘
1.2 查询类型 #
text
PromQL查询类型:
┌─────────────────────────────────────────────┐
│ 1. 即时查询(Instant Query) │
├─────────────────────────────────────────────┤
│ • 查询某个时间点的数据 │
│ • 返回即时向量或标量 │
│ • 示例:http_requests_total │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 2. 范围查询(Range Query) │
├─────────────────────────────────────────────┤
│ • 查询一段时间范围的数据 │
│ • 返回范围向量 │
│ • 示例:http_requests_total[5m] │
└─────────────────────────────────────────────┘
二、数据类型 #
2.1 四种数据类型 #
text
PromQL数据类型:
┌─────────────────────────────────────────────┐
│ 1. 即时向量(Instant Vector) │
├─────────────────────────────────────────────┤
│ • 一组时间序列,每个序列有一个样本值 │
│ • 查询结果示例: │
│ http_requests_total{instance="a"} 100 │
│ http_requests_total{instance="b"} 200 │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 2. 范围向量(Range Vector) │
├─────────────────────────────────────────────┤
│ • 一组时间序列,每个序列有多个样本值 │
│ • 查询结果示例: │
│ http_requests_total{instance="a"}: │
│ 1700000000: 100 │
│ 1700000015: 105 │
│ 1700000030: 110 │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 3. 标量(Scalar) │
├─────────────────────────────────────────────┤
│ • 一个简单的数字值 │
│ • 示例:100, 3.14, -5 │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 4. 字符串(String) │
├─────────────────────────────────────────────┤
│ • 一个简单的字符串值 │
│ • 示例:"hello", 'world' │
│ • 主要用于调试 │
└─────────────────────────────────────────────┘
2.2 类型使用场景 #
text
数据类型使用场景:
即时向量:
• 用于图表展示
• 用于告警规则
• 用于当前状态查询
范围向量:
• 用于计算速率
• 用于趋势分析
• 用于函数计算
标量:
• 用于数学运算
• 用于阈值比较
• 用于常量值
字符串:
• 用于调试
• 用于标签值匹配
三、即时向量选择器 #
3.1 基本语法 #
promql
# 最简单的查询:选择所有时间序列
http_requests_total
# 按标签过滤
http_requests_total{method="GET"}
# 多标签过滤
http_requests_total{method="GET", status="200"}
# 正则匹配
http_requests_total{method=~"GET|POST"}
# 正则不匹配
http_requests_total{method!~"DELETE"}
# 不等于
http_requests_total{status!="404"}
3.2 匹配操作符 #
text
标签匹配操作符:
┌─────────────────────────────────────────────┐
│ 操作符 │ 说明 │ 示例 │
├───────────┼────────────────┼────────────────┤
│ = │ 精确匹配 │ method="GET" │
│ != │ 不等于 │ status!="404" │
│ =~ │ 正则匹配 │ method=~"GET|POST" │
│ !~ │ 正则不匹配 │ method!~"DELETE" │
└─────────────────────────────────────────────┘
正则匹配示例:
# 匹配以/api开头的路径
http_requests_total{path=~"/api/.*"}
# 匹配2xx状态码
http_requests_total{status=~"2.."}
# 匹配多个实例
http_requests_total{instance=~"node[1-3]:.*"}
# 匹配非数字状态码
http_requests_total{status!~"[0-9]+"}
3.3 指标名称匹配 #
promql
# 通过__name__标签匹配指标名称
{__name__="http_requests_total"}
# 正则匹配多个指标
{__name__=~"http_.*"}
# 匹配特定前缀的指标
{__name__=~"node_.*"}
# 排除特定指标
{__name__!~"go_.*"}
四、范围向量选择器 #
4.1 基本语法 #
promql
# 查询过去5分钟的数据
http_requests_total[5m]
# 查询过去1小时的数据
http_requests_total[1h]
# 查询过去1天的数据
http_requests_total[1d]
# 带标签过滤的范围查询
http_requests_total{method="GET"}[5m]
4.2 时间单位 #
text
时间单位:
┌─────────────────────────────────────────────┐
│ 单位 │ 说明 │ 示例 │
├─────────┼────────────┼─────────────────────┤
│ ms │ 毫秒 │ [500ms] │
│ s │ 秒 │ [30s] │
│ m │ 分钟 │ [5m] │
│ h │ 小时 │ [1h] │
│ d │ 天 │ [1d] │
│ w │ 周 │ [1w] │
│ y │ 年 │ [1y] │
└─────────────────────────────────────────────┘
组合使用:
http_requests_total[1h30m] # 1小时30分钟
http_requests_total[2d12h] # 2天12小时
4.3 时间偏移 #
promql
# 查询5分钟前的数据
http_requests_total offset 5m
# 查询1小时前的数据
http_requests_total offset 1h
# 范围查询带偏移
http_requests_total[5m] offset 1h
# 查询昨天的数据
http_requests_total[1d] offset 1d
# 查询上周的数据
http_requests_total[1w] offset 1w
4.4 @修饰符 #
promql
# 查询特定时间点的数据
http_requests_total @ 1700000000
# 查询特定时间点的范围数据
http_requests_total[5m] @ 1700000000
# 使用start()和end()函数
http_requests_total @ start()
http_requests_total @ end()
# 组合使用
http_requests_total[5m] @ start()
五、偏移修饰符 #
5.1 offset语法 #
promql
# 基本语法
<向量表达式> offset <时间>
# 示例
http_requests_total offset 5m
http_requests_total{method="GET"} offset 10m
rate(http_requests_total[5m]) offset 1h
5.2 offset应用场景 #
text
offset应用场景:
┌─────────────────────────────────────────────┐
│ 1. 同比分析 │
├─────────────────────────────────────────────┤
│ # 与昨天同时段对比 │
│ http_requests_total │
│ / │
│ http_requests_total offset 1d │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 2. 环比分析 │
├─────────────────────────────────────────────┤
│ # 与上周同时段对比 │
│ http_requests_total │
│ / │
│ http_requests_total offset 1w │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 3. 趋势预测 │
├─────────────────────────────────────────────┤
│ # 预测未来值 │
│ predict_linear(http_requests_total[1h], 3600)│
└─────────────────────────────────────────────┘
六、子查询 #
6.1 子查询语法 #
promql
# 子查询语法
<表达式>[<范围>:<分辨率>]
# 示例:查询过去1小时内每分钟的速率
rate(http_requests_total[5m])[1h:]
# 指定分辨率
rate(http_requests_total[5m])[1h:1m]
# 带偏移的子查询
rate(http_requests_total[5m])[1h:] offset 1h
6.2 子查询应用 #
promql
# 查询过去1小时内每分钟的最大值
max_over_time(http_requests_total[1h:1m])
# 查询过去1小时内每分钟的最小值
min_over_time(http_requests_total[1h:1m])
# 查询过去1小时内每分钟的平均值
avg_over_time(http_requests_total[1h:1m])
# 计算过去1小时内速率的最大值
max_over_time(rate(http_requests_total[5m])[1h:])
七、注释 #
promql
# 单行注释
http_requests_total # 这是注释
# 多行查询
http_requests_total{ # 查询HTTP请求总数
method="GET", # 只查询GET请求
status="200" # 只查询成功请求
}
八、查询示例 #
8.1 基础查询 #
promql
# 查询所有实例的CPU使用时间
node_cpu_seconds_total
# 查询特定模式的CPU使用时间
node_cpu_seconds_total{mode="idle"}
# 查询特定实例的内存使用
node_memory_MemAvailable_bytes{instance="localhost:9100"}
# 查询特定服务的HTTP请求
http_requests_total{service="user-service"}
8.2 过滤查询 #
promql
# 查询GET和POST请求
http_requests_total{method=~"GET|POST"}
# 查询非错误状态码
http_requests_total{status!~"5.."}
# 查询特定路径前缀
http_requests_total{path=~"/api/.*"}
# 查询特定环境的指标
node_memory_MemAvailable_bytes{environment="production"}
8.3 范围查询 #
promql
# 查询过去5分钟的请求数
http_requests_total[5m]
# 查询过去1小时的内存使用
node_memory_MemAvailable_bytes[1h]
# 查询过去30分钟的CPU使用
node_cpu_seconds_total[30m]
# 带过滤的范围查询
http_requests_total{method="GET"}[5m]
8.4 偏移查询 #
promql
# 查询5分钟前的数据
http_requests_total offset 5m
# 查询1小时前的范围数据
http_requests_total[5m] offset 1h
# 查询昨天的数据
http_requests_total[1d] offset 1d
# 比较当前和昨天
http_requests_total / http_requests_total offset 1d
九、API查询 #
9.1 即时查询API #
bash
# 即时查询
curl 'http://localhost:9090/api/v1/query?query=up'
# 带标签过滤
curl 'http://localhost:9090/api/v1/query?query=up{job="prometheus"}'
# 带时间参数
curl 'http://localhost:9090/api/v1/query?query=up&time=1700000000'
# URL编码查询
curl 'http://localhost:9090/api/v1/query?query=http_requests_total%7Bmethod%3D%22GET%22%7D'
9.2 范围查询API #
bash
# 范围查询
curl 'http://localhost:9090/api/v1/query_range?query=up&start=1700000000&end=1700003600&step=15s'
# 带时间戳
curl 'http://localhost:9090/api/v1/query_range?query=rate(http_requests_total%5B5m%5D)&start=1700000000&end=1700003600&step=60s'
# 使用RFC3339时间格式
curl 'http://localhost:9090/api/v1/query_range?query=up&start=2024-01-01T00:00:00Z&end=2024-01-01T01:00:00Z&step=15s'
十、总结 #
PromQL基础要点:
| 概念 | 说明 |
|---|---|
| 即时向量 | 单个时间点的样本集 |
| 范围向量 | 时间范围内的样本集 |
| 标量 | 简单数字值 |
| 字符串 | 简单字符串值 |
匹配操作符:
| 操作符 | 说明 |
|---|---|
| = | 精确匹配 |
| != | 不等于 |
| =~ | 正则匹配 |
| !~ | 正则不匹配 |
时间单位:
| 单位 | 说明 |
|---|---|
| s | 秒 |
| m | 分钟 |
| h | 小时 |
| d | 天 |
| w | 周 |
下一步,让我们学习PromQL函数!
最后更新:2026-03-27