介绍
PromQL是Prometheus的自定义查询语言。通过PromQL用户可以非常方便地对监控样本数据进行统计分析,PromQL支持常见的运算操作符,同时PromQL中还提供了大量的内置函数可以实现对数据的高级处理。被广泛应用在Prometheus的日常应用当中,包括对数据查询、可视化、告警处理当中。
类型
PromQL支持以下四种类型:
- Instant vector:瞬时向量,表示一组时间序列,每个时间序列只有一个样本值。
- Range vector:区间向量,表示一组时间序列,每个时间序列有多个样本值。
- 标量:表示单个浮点值。
- 字符串:表示单个字符串值。
时间序列选择器
1
<metric name>{label=value,label=value,...}[range]
标签选择器
1
2
# 查询Prometheus http状态码为400的请求数量。
prometheus_http_requests_total{code="400"}
标签匹配运算符:
- =:与字符串匹配
- !=:与字符串不匹配
- =~:与正则匹配
- !~:与正则不匹配
1
2
3
4
# 查询Prometheus http状态码为4xx或5xx并且handler为/api/v1/query的请求数量
prometheus_http_requests_total{code=~"4..|5..",handler="/api/v1/query"}
# 或
{code=~"4.*|5.*",handler="/api/v1/query",__name__="prometheus_http_requests_total"}
PromQL中,标签选择器可以同时使用多个标签,多个标签之间使用逗号分隔。
范围选择器
1
2
# 查询过去5分钟Prometheus健康检查的采样记录。
prometheus_http_requests_total{code="200",handler="/-/healthy"}[5m]
单位:ms、s、m、h、d、w、y
时间串联:[1h5m]一小时5分钟
通过offset
1
2
# 通过offset将时间倒退5分钟,即查询5分钟之前的数据。
prometheus_http_requests_total{code="200"} offset 5m
@修饰符
1
2
3
# 修饰符@允许更改查询中各个瞬时向量和范围向量的评估时间。提供给@修饰符的时间是 unix 时间戳,用浮点文字描述。
prometheus_http_requests_total{code="200"} @ 1646089826
修饰符@支持上述所有数字文字的表示。它与offset修饰符一起使用,其中偏移量相对于修饰符时间应用@ 。无论修饰符的顺序如何,结果都是相同的。
1
2
3
4
# offset after @
prometheus_http_requests_total @ 1609746000 offset 5m
# offset before @
prometheus_http_requests_total offset 5m @ 1609746000
此外,start()和end()也可以作为@特殊值用作修饰符的值。对于范围查询,它们分别解析为范围查询的开始和结束,并且在所有步骤中保持不变。对于即时查询,start()和end()解析至评估时间。
1
2
3
prometheus_http_requests_total @ start()
rate(prometheus_http_requests_total[5m] @ end())
# 请注意,@修饰符允许查询提前查看其评估时间。
子查询
子查询允许您针对给定的范围和分辨率运行即时查询。子查询的结果是一个范围向量。
1
<instant_query> '[' <range> ':' [<resolution>] ']' [ @ <float_literal> ] [ offset <duration> ]
<resolution>
是可选的。默认为全局评估间隔。
运算符
算术运算符
- +(加法)
- -(减法)
- *(乘法)
- /(除法)
- %(取模)
- ^(幂)
1
prometheus_http_response_size_bytes_sum / 1024
比较运算符
==
(相等)!=
(不相等)>
(大于)<
(小于)>=
(大于或等于)<=
(小于或等于)
逻辑运算符
- and(与)
- or(或)
- unless(非)
向量匹配
这部分内容和sQL中的join类似。
向量匹配关键字
- on :允许将考虑的标签集缩减为提供的列表
- ignoring :允许在匹配时忽略某些标签
分组修饰符
这部分的内容很像sql中的left join
和righ join
。
- group_left
- group_right
如果两个瞬时向量数量不一致时可通过group_left、group_right指定以那一侧为准
一对一向量匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>
# 输入示例:
method_code:http_errors:rate5m{method="get", code="500"} 24
method_code:http_errors:rate5m{method="get", code="404"} 30
method_code:http_errors:rate5m{method="put", code="501"} 3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
#示例查询:
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
#结果:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
多对一和一对多向量匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>
# 输入示例:
method_code:http_errors:rate5m{method="get", code="500"} 24
method_code:http_errors:rate5m{method="get", code="404"} 30
method_code:http_errors:rate5m{method="put", code="501"} 3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
示例查询:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
#结果:
{method="get", code="500"} 0.04 // 24 / 600
{method="get", code="404"} 0.05 // 30 / 600
{method="post", code="500"} 0.05 // 6 / 120
{method="post", code="404"} 0.175 // 21 / 120
聚合运算符
Prometheus 支持以下内置聚合运算符,可用于聚合单个即时向量的元素,从而生成具有聚合值且元素较少的新向量:
- sum(计算维度总和)
- min(选择最小尺寸)
- max(选择最大尺寸)
- avg(计算各个维度的平均值)
- group(结果向量中的所有值都是 1)
- stddev(计算维度上的总体标准差)
- stdvar(计算各维度的总体标准方差)
- count(计算向量中元素的数量)
- count_values(计算具有相同值的元素数量)
- bottomk(按样本值最小的 k 个元素)
- topk(按样本值最大的 k 个元素)
- quantile(计算维度上的 φ 分位数 (0 ≤ φ ≤ 1))
手册是就算说这个是运算符而不是函数
优先级
Prometheus 中二元运算符的优先级,从高到低。
^
*
,/
,%
,atan2
+
,-
==
,!=
,<=
,<
,>=
,>
and
,unless
or
函数
- abs()
- absent()
- absent_over_time()
- ceil()
- changes()
- clamp()
- clamp_max()
- clamp_min()
- day_of_month()
- day_of_week()
- day_of_year()
- days_in_month()
- delta()
- deriv()
- exp()
- floor()
- histogram_avg()
- histogram_count()和histogram_sum()
- histogram_fraction()
- histogram_quantile()
- histogram_stddev()和histogram_stdvar()
- holt_winters()
- hour()
- idelta()
- increase()
- irate()
- label_join()
- label_replace()
- ln()
- log2()
- log10()
- minute()
- month()
- predict_linear()
- rate()
- resets()
- round()
- scalar()
- sgn()
- sort()
- sort_desc()
- sort_by_label()
- sort_by_label_desc()
- sqrt()
- time()
- timestamp()
- vector()
- year()
<aggregation>_over_time()
- 三角函数
参考
https://zhuanlan.zhihu.com/p/477177336
https://yunlzheng.gitbook.io/prometheus-book
https://prometheus.io/docs/prometheus/latest/querying/basics/