0%

Prometheus 查询

Prometheus 提供了一个叫 PromQL(Prometheus Query Language) 的函数式查询语言,允许用户实时地选择和聚合时间序列数据。查询结果可以展示为表格或者图表,或者被通过 HTTP API 来消费(比如被 grafana 使用)。

表达式语言数据类型

在 Prometheus 的表达式语言里面,一个表达式或者子表达式可以计算为以下四种类型之一:

  • 即时向量:一组时间序列,每个时间序列包含一个样本,所有时间序列都共享相同的时间戳
  • 范围向量:一组时间序列,包含每个时间序列随时间变化的数据点范围
  • 标量:一个简单的数字浮点值
  • String:一个简单的字符串值;目前未使用

时间序列选择器

即时向量选择器

  • 选择名称为 http_requests_total 的所有时间序列
1
http_requests_total

根据标签过滤

1
http_requests_total{job="prometheus"}

标签匹配运算符:

  • =:选择与提供的字符串完全相同的字符串
  • !=: 选择不等于提供的字符串的标签
  • =~: 选择与提供的字符串正则表达式匹配的标签
  • !~: 选择与提供的字符串不匹配的标签

例如,此选择所有环境为 stagingtestingdevelopment,以及 HTTP 方法不是 GET 的时间序列数据:

1
http_requests_total{environment=~"staging|testing|development", method!="GET"}
  • 根据指标名称匹配
1
{__name__=~"job:.*"}

范围向量选择器

范围向量字面量的工作方式与即时向量字面量类似,不同之处在于它们从当前时刻选择了一系列样本。从语法上讲,在向量选择器的末尾将持续时间附加在方括号([])中,以指定应该为每个结果范围向量元素提供多远的时间值。

  • 选择过去 5 分钟内名称为 http_requests_total 以及 job 标签为 prometheus 的所有时序数据
1
http_requests_total{job="prometheus"}[5m]

持续时间

持续时间指定为一个数字,后跟以下单位之一:

  • ms - 毫秒
  • s - 秒
  • m - 分钟
  • h - 小时
  • d - days
  • w - 周
  • y - 年

如:

1
2
3
4
5h
1h30m
5m
10s

偏移修改器

  • 返回 http_requests_total 过去 5 分钟相当于当前查询评估时间的值:
1
http_requests_total offset 5m

请注意,offset 修饰符总是需要立即跟随选择器,即以下是正确的:

1
sum(http_requests_total{method="GET"} offset 5m)

以下是不正确的:

1
sum(http_requests_total{method="GET"}) offset 5m
  • 同样适用于范围向量。返回 http_requests_total 一周前的 5 分钟频率:
1
rate(http_requests_total[5m] offset 1w)

@修饰符

  • 返回时间戳为 1609746000 的 http_requests_total 的值
1
http_requests_total @ 1609746000

请注意,@修饰符总是需要立即跟随选择器

1
2
sum(http_requests_total{method="GET"} @ 1609746000)  // 正确
sum(http_requests_total{method="GET"}) @ 1609746000 // 无效

这同样适用于范围向量。

1
rate(http_requests_total[5m] @ 1609746000)

offset 一起使用:

1
2
3
4
# offset after @
http_requests_total @ 1609746000 offset 5m
# offset before @
http_requests_total offset 5m @ 1609746000

默认情况禁用 @ 修饰符。

子查询

子查询允许你对给定的范围和分辨率运行即时查询。子查询的结果是一个范围向量:

语法:

1
<instant_query> '[' <range> ':' [<resolution>] ']' [ @ <float_literal> ] [ offset <duration> ]
  • <resolution> 是可选的。