PromQL是Prometheus提供的一个函数式的表达式语言,可以使用户实时地查找和聚合时间序列数据。表达式计算结果可以在图表中展示,也可以在 Prometheus表达式浏览器中以表格形式展示,或者作为数据源以HTTP API的方式提供给外部系统使用。PromQL虽然以QL结尾,但是它不是类似SQL的语言,因为在时间序列上执行计算类型时,SQL语言相对缺乏表达能力。而PromQL语言表达能力非常丰富,可以使用标签进行任意聚合,还可以使用标签将不同的标签连接到一起进行算术运算操作。内置了时间和数学等很多函数可以使用。
一、PromQL表达式
1.1、语言数据类型
PromQL表达式语言中,一个表达式或者子表达式可以表示以下4种类型之一:
-
Instant vector:瞬时向量,一组time series(时间序列),每个time series包括了一个时间戳的数据点,所有time series数据点拥有相同的时间戳。
-
Range vector:范围向量,一组time series包含一个时间范围内的一组数据点。
-
Scalar:标量,为一个浮点数值。
-
String:字符串,为一个字符串数值。当前未使用。
1.2、Literals数据格式
1.2.1 String literals
字符串可以用单引号(‘’)、双引号(“”)或反引号(``)指定为文字。
1.2.2 Float literals
浮点类型数值的格式为:-[.(digits)]
如:-2.43
1.3、Time series(时间序列)选择器
1.3.1 Instant vector selectors(即时矢量选择器)
瞬时向量选择器用于选择一组time series和每个time series对应的某一个时间戳数据点,唯一的要求是必须指定metric指标名。
例:查询指标名http_requests_total对应的所有time series表达式:
http_requests_total
可以通过在花括号 ( {}) 中附加一个逗号分隔的标签匹配器列表来进一步过滤这些时间序列。
例:仅选择具有http_requests_total 度量名称且job标签设置为prometheus且其 group标签设置为的时间序列canary:
http_requests_total{job="prometheus",group="canary"}
通过负匹配或正则表达式匹配tag选择时间序列,支持如下匹配运算符:
-
= 等于
-
!= 不等于
-
=~ 选择与提供的字符串进行正则表达式匹配的标签
-
!~ 选择与提供的字符串不匹配的标签
1.3.2 Range vector selectors(范围矢量选择器)
范围向量字面量的工作方式类似于即时向量字面量,唯一区别是选择的时间序列是一个时间范围内的时序数据。从语法上讲,持续时间附加在[]向量选择器末尾的方括号 ( ) 中,以指定应该为每个结果范围向量元素获取多远的时间值
例:为所有时间序列选择了过去 5 分钟内记录的所有值,这些时间序列的指标名称http_requests_total和job标签设置为prometheus:
http_requests_total{job="prometheus"}[5m]
1.3.3 Offset modifier(偏移修改器)
Offset修改器允许修改查询中瞬时向量和范围向量的时间偏移。