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