一 简介
PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中,包括对数据查询、可视化、告警处理当中。
简单地说,PromQL 广泛存在于以 Prometheus 为核心的监控体系中。所以需要用到数据筛选的地方,就会用到PromQL。例如:监控指标的设置、报警指标的设置等等。
二 基础用法
当Prometheus通过Exporter采集到相应的监控指标样本数据后,我们就可以通过PromQL对监控样本数据进行查询。
在expression browser中输入监控指标prometheus_http_requests_total并执行:
1 完全匹配
PromQL 支持使用 = 和 != 两种完全匹配模式。
- 等于。通过使用
label=value
可以选择那些标签满足表达式定义的时间序列。 - 不等于。通过使用
label!=value
则可以根据标签匹配排除时间序列。
例如我们上面查询出了所有指标名称为 prometheus_http_requests_total
的数据。这时候我们希望只查看错误的请求,即过滤掉所有 code 标签不是 200 的数据。那么我们的 PromQL 表达式可以修改为:prometheus_http_requests_total{code!="200"}
。
可以看到已经过滤掉了code为200的数据
2 正则匹配
PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。
- 正向匹配。使用
label=~regx
表示选择那些标签符合正则表达式定义的时间序列。 - 反向匹配。使用
label!~regx
进行排除。
例如查询指标 prometheus_http_requests_total 中,所有 handler 标签以 /api/v1
开头的记录,那表达式为:
1 | prometheus_http_requests_total{handler=~"/api/v1/.*"} |
3 范围查询
上面直接通过类似 prometheus_http_requests_total 表达式查询时间序列时,同一个指标同一标签只会返回一条数据。这样的表达式我们称之为瞬间向量表达式,而返回的结果称之为瞬间向量。
而如果我们想查询一段时间范围内的样本数据,那么我们就需要用到区间向量表达式,其查询出来的结果称之为区间向量。时间范围通过时间范围选择器 []
进行定义。例如,通过以下表达式可以选择最近5分钟内的所有样本数据:
1 | prometheus_http_requests_total{}[5m] |
通过查询结果可以看到,此时我们查询出了所有的样本数据,而不再是一个样本数据的统计值。
除了使用m表示分钟以外,PromQL的时间范围选择器支持其它时间单位:
符号 | 时间单位 |
---|---|
s | 秒 |
m | 分 |
h | 小时 |
d | 天 |
w | 周 |
y | 年 |
4 时间位移操作
在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准:
1 | # 瞬时向量表达式,选择当前最新的数据 |
如果想查询 5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据可以则可以使用位移操作,位移操作的关键字为 offset
1 | # 查询 5 分钟前的最新数据 |
5 聚合操作
一般情况下,通过 PromQL 查询到的数据都是很多的。PromQL 提供的聚合操作可以用来对这些时间序列进行处理,形成一条新的时间序列。
以 prometheus_http_requests_total
指标为例,不加任何条件查询到的数据为:
5.1 count()
计算一共有几条数据
1 | count(prometheus_http_requests_total) |
5.2 sum()
计算所有数据的 value 总和
1 | sum(prometheus_http_requests_total) |
更多内置函数参考PromQL内置函数详解
三 PromQL 操作符
1 数学运算符
PromQL支持的所有数学运算符如下所示:
符号 | 运算 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 求余 |
^ | 幂运算 |
使用例:
2 布尔运算符
PromQL支持的所有布尔运算符如下所示:
符号 | 运算 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
使用例:
列出所有value超过20的数据:
1 | prometheus_http_requests_total > 20 |
展示所有数据,原value超过20的value为1,反之为0:
1 | prometheus_http_requests_total > bool 20 |
3 集合运算符
通过集合运算,可以在两个瞬时向量与瞬时向量之间进行相应的集合操作。目前,Prometheus支持以下集合运算符:
- and 与操作
- or 或操作
- unless 排除操作
四 HTTP API
我们不仅仅可以在 Prometheus 的 Graph 页面查询 PromQL,Prometheus 还提供了一种 HTTP API 的方式,可以更灵活的将 PromQL 整合到其他系统中使用,譬如下面要介绍的 Grafana,就是通过 Prometheus 的 HTTP API 来查询指标数据的。实际上,我们在 Prometheus 的 Graph 页面查询也是使用了 HTTP API。
参考 Prometheus 的 HTTP API 官方文档,它提供了下面这些接口:
- GET /api/v1/query
- GET /api/v1/query_range
- GET /api/v1/series
- GET /api/v1/label/
/values - GET /api/v1/targets
- GET /api/v1/rules
- GET /api/v1/alerts
- GET /api/v1/targets/metadata
- GET /api/v1/alertmanagers
- GET /api/v1/status/config
- GET /api/v1/status/flags
从 Prometheus v2.1 开始,又新增了几个用于管理 TSDB 的接口:
- POST /api/v1/admin/tsdb/snapshot
- POST /api/v1/admin/tsdb/delete_series
- POST /api/v1/admin/tsdb/clean_tombstones