Prometheus 监控查询语言PromQL使用入门

2019-08-25 0 By admin

Prometheus提供了一种称为PromQL(Prometheus查询语言)的功能查询语言,允许用户实时选择和汇总时间序列数据。
表达式的结果可以显示为图形,在Prometheus的表达式浏览器中显示为表格数据,或者由外部系统通过HTTP API使用。

一、表达式语言类型

Prometheus表达式或子表达式可以评估为以下四种类型之一:

  1. 即时向量(Instant vector) – 包含每个时间序列单个样品的一组时间序列,共享相同的时间戳
  2. 范围向量(Range vector) – 包含一个范围内数据点的一组时间序列
  3. 标量(Scalar) – 一个简单的数字浮点值
  4. 字符串(String) – 一个简单的字符串值;当前未使用

根据使用情况(例如画图或者显示表达式的输出),只有某些类型是合法的,例如,即时向量表达式是可以画图的唯一类型。

二、时间序列选择器

2.1、即时向量选择(标签选择)

即时向量选择器允许在给定时间戳(即时)为每个选择一组时间序列和单个样本值。
在最简单的形式中,仅指定度量名称,这会生成包含具有此度量标准名称的所有时间序列的元素的即时向量。
下面这个例子选择了具有 http_requests_total 的时间序列:
http_requests_total
你可以通过附加一组标签,并用 {} 括起来,来进一步筛选这些时间序列。下面这个例子只选择有 http_requests_total 名称的、有prometheus 工作标签的、有 canary 组标签的时间序列:
http_requests_total{job="prometheus",group="canary"}
另外,也可以也可以将标签值反向匹配,或者对正则表达式匹配标签值。
下面列举匹配操作符:

  1. =:选择正好相等的字符串标签
  2. !=:选择不相等的字符串标签
  3. =~:选择匹配正则表达式的标签(或子标签)
  4. !=:选择不匹配正则表达式的标签(或子标签)

http_requests_total{environment=~"staging|testing|development",method!="GET"}
说明:选择staging、testing、development环境下的,GET之外的HTTP方法的http_requests_total的时间序列。

2.2、范围向量选择(时间范围)

范围向量表达式正如即时向量表达式一样运行,但是前者返回从当前时刻开始的一定时间范围的时间序列集合回来。
语法是,在一个向量表达式之后添加[]来表示时间范围,持续时间用数字表示,后接下面单元之一:

  1. s:seconds
  2. m:minutes
  3. h:hours
  4. d:days
  5. w:weeks
  6. y:years

http_requests_total{job="prometheus"}[5m]
说明:选择最后5分钟的记录,metric名称为http_requests_total、作业标签为prometheus的时间序列的所有值。

2.3、时间位移操作 offset

在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准:

http_request_total{} # 瞬时向量表达式,选择当前最新的数据
http_request_total{}[5m] # 区间向量表达式,选择以当前时间为基准,5分钟内的数据

而如果我们想查询,5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢? 这个时候我们就可以使用位移操作,位移操作的关键字为 offset。

示例

以下表达式返回相对于当前查询时间过去 5 分钟的 http_requests_total 值:
http_requests_total offset 5m
注意:offset 关键字需要紧跟在选择器({})后面

sum(http_requests_total{method="GET"} offset 5m) // GOOD 正确
sum(http_requests_total{method="GET"}) offset 5m // INVALID 不合法

该操作同样适用于区间向量。以下表达式返回指标 http_requests_total 一周前的 5 分钟之内的 HTTP 请求量的增长率:
rate(http_requests_total[5m] offset 1w)

三、子查询 subquery

子查询允许您针对给定的范围和分辨率(resolution)运行即时查询。子查询的结果是一个范围向量。

<instant_query> '[' <range> ':' [<resolution>] ']' [ offset <duration> ]

resolution是可选的。默认值是全局求值间隔。

四、操作符

使用PromQL除了能够方便的按照查询和过滤时间序列以外,PromQL还支持丰富的操作符,用户可以使用这些操作符对进一步的对事件序列进行二次加工。这些操作符包括:数学运算符,逻辑运算符,布尔运算符等等。详细描述请参考 PromQL 操作符。

五、内置函数

Prometheus 提供了大量的内置函数来处理时序数据,详细描述请参考 PromQL 内置函数。