跳到主要内容

查询语言

为了能够使用收集的监控数据,Prometheus 实现了自己的查询语言 PromQL。PromQL 是一种功能性的语言(类似于 SQL 语句),可以对时间序列数据进行灵活高效的计算。和类似 SQL 的语言相比,PromQL 仅用于数据读取,而不是插入、更新或者删除数据(这些操作在查询引擎之外实现的)

Prometheus 查询语言

后续我们会详细讲解 PromQL,这里我们先简单了解一些示例即可。

示例

比如下面的语句表示的是过滤所有状态码位为 500 的 HTTP 请求总数:

http_requests_total{status="500"}

下面的查询语句表示每个序列在 5 分钟的时间窗口内的平均每秒增长率:

rate(http_requests_total{status="500"}[5m])

我们还可以计算 status="500" 错误与按 HTTP 路径分组的请求总数的比率:

sum by(path) (rate(http_requests_total{status="500"}[5m]))
/
sum by(path) (rate(http_requests_total[5m]))

这些查询方式是 PromQL 中一些非常常见的方式,当然除此之外还有很多其他使用方法,我们将在后面专门的 PromQL 章节中进行详细的讲解。

集成报警

Prometheus 将时间序列数据的收集、处理和主动报警系统集成在一起,它的理念是在单个数据模型中尽可能多地收集有关系统的数据,以便你可以对其进行集成查询。此外用于临时查询和仪表盘使用的查询语言也可以用于定义报警规则。

例如,以下警报规则(作为规则配置文件的一部分加载到 Prometheus 中)将在 500 状态码的 HTTP 请求数量超过指定路径总流量的5%时触发报警。

alert: Many500Errors
# expr 是一个 PromQL 表达式,是整个报警规则的核心
expr: |
(
sum by(path) (rate(http_requests_total{status="500"}[5m]))
/
sum by(path) (rate(http_requests_total[5m]))
) * 100 > 5
for: 5m
labels:
severity: 'critical'
annotations:
summary: 'Many 500 errors for path {{$labels.path}} ({{$value}}%)'

上面是一个典型的报警规则定义规范,其中 expr 属性指定的 PromQL 表达式构成报警规则的核心,而其他基于 YAML 的配置选项则允许控制报警元数据、路由标签等。这样就可以根据收集的数据进行精确而准确的警报了。