Prometheus 提供了一个叫 PromQL(Prometheus Query Language) 的函数式查询语言,允许用户实时地选择和聚合时间序列数据。查询结果可以展示为表格或者图表,或者被通过 HTTP API 来消费(比如被 grafana 使用)。
表达式语言数据类型
在 Prometheus 的表达式语言里面,一个表达式或者子表达式可以计算为以下四种类型之一:
- 即时向量:一组时间序列,每个时间序列包含一个样本,所有时间序列都共享相同的时间戳
- 范围向量:一组时间序列,包含每个时间序列随时间变化的数据点范围
- 标量:一个简单的数字浮点值
- String:一个简单的字符串值;目前未使用
时间序列选择器
即时向量选择器
- 选择名称为
http_requests_total
的所有时间序列
1 | http_requests_total |
根据标签过滤
1 | http_requests_total{job="prometheus"} |
标签匹配运算符:
=
:选择与提供的字符串完全相同的字符串!=
: 选择不等于提供的字符串的标签=~
: 选择与提供的字符串正则表达式匹配的标签!~
: 选择与提供的字符串不匹配的标签
例如,此选择所有环境为 staging
、testing
或
development
,以及 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 | 5h |
偏移修改器
- 返回
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 | sum(http_requests_total{method="GET"} @ 1609746000) // 正确 |
这同样适用于范围向量。
1 | rate(http_requests_total[5m] @ 1609746000) |
与 offset
一起使用:
1 | # offset after @ |
默认情况禁用
@
修饰符。
子查询
子查询允许你对给定的范围和分辨率运行即时查询。子查询的结果是一个范围向量:
语法:
1 | <instant_query> '[' <range> ':' [<resolution>] ']' [ @ <float_literal> ] [ offset <duration> ] |
<resolution>
是可选的。