点击蓝色“陈树义”关注我哟
我们在 Prometheus 入门教程(三):Grafana 图表配置快速入门 中提到可以针对业务指标做自定义监控,其中有一个设置属性为 Metrics,即:

这个 Metrics 属性的值遵守了 PromQL 规则。我们只要学会了 PromQL 表达式,就知道了怎么设置这个属性了。
什么是 PromQL?
PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中,包括对数据查询、可视化、告警处理当中。
简单地说,PromQL 广泛存在于以 Prometheus 为核心的监控体系中。所以需要用到数据筛选的地方,就会用到 PromQL。例如:监控指标的设置、报警指标的设置等等。
PromQL 基础用法
当 Prometheus 通过 Exporter 采集到相应的监控指标样本数据后,我们就可以通过 PromQL 对监控样本数据进行查询。
当我们直接使用监控指标名称查询时,可以查询该指标下的所有时间序列。我们这里启动 Prometheus 服务器,并打开 http://localhost:9090/graph 地址。在查询框中,我们输入:prometheus_http_requests_total
并点击执行。

可以看到我们查询出了所有指标名称为 prometheus_http_requests_total
的数据。
PromQL 支持户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配。
完全匹配
PromQL 支持使用 = 和!= 两种完全匹配模式。
等于。通过使用
label=value
可以选择那些标签满足表达式定义的时间序列。不等于。通过使用
label!=value
则可以根据标签匹配排除时间序列。
例如我们上面查询出了所有指标名称为 prometheus_http_requests_total
的数据。这时候我们希望只查看错误的请求,即过滤掉所有 code 标签不是 200 的数据。那么我们的 PromQL 表达式可以修改为:prometheus_http_requests_total{code!="200"}
。

从上图可以看到,查询出的结果已经过滤掉了所有 code 不为 200 的数据。
正则匹配
PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。
正向匹配。使用
label=~regx
表示选择那些标签符合正则表达式定义的时间序列。反向匹配。使用
label!~regx
进行排除。
例如我想查询指标 prometheus_http_requests_total 中,所有 handler 标签以 /api/v1
开头的记录,那么我的表达式为:prometheus_http_requests_total{handler=~"/api/v1/.*"}
。

从上面的查询结果可以看出,查询的结果已经只保留了 handler 标签以 /api/v1
开头的数据。
范围查询
我们上面直接通过类似 prometheus_http_requests_total 表达式查询时间序列时,同一个指标同一标签只会返回一条数据。这样的表达式我们称之为瞬间向量表达式,而返回的结果称之为瞬间向量。
而如果我们想查询一段时间范围内的样本数据,那么我们就需要用到区间向量表达式,其查询出来的结果称之为区间向量。时间范围通过时间范围选择器 []
进行定义。例如,通过以下表达式可以选择最近 5 分钟内的所有样本数据:
prometheus_http_requests_total{}[5m]

通过查询结果可以看到,此时我们查询出了所有的样本数据,而不再是一个样本数据的统计值。
除了使用 m 表示分钟以外,PromQL 的时间范围选择器支持其它时间单位:
s - 秒
m - 分钟
h - 小时
d - 天
w - 周
y - 年
时间位移操作
在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准:
# 瞬时向量表达式,选择当前最新的数据
prometheus_http_requests_total{}
# 区间向量表达式,选择以当前时间为基准,5分钟内的数据
prometheus_http_requests_total{}[5m]
如果我们想查询 5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢?这个时候我们就可以使用位移操作,位移操作的关键字为 offset。
# 查询 5 分钟前的最新数据
http_request_total{} offset 5m
# 往前移动