PromQL-基础
一【简介】
Prometheus提供了一种称为PromQL(Prometheus查询语言)的函数查询语言,允许用户查询和聚合时间序列类型的数据。表达式的结果即可以显示为图形,也可在Prometheus的表达式浏览器中显示为表格数据,除此之外,也可以由外部系统通过HTTP API使用。
二 数据类型
1、即时向量(Instant vector):一组时间序列,每个时间序列包含一个样本,所有样本共享相同的时间戳
2、范围向量(Range vector ):一组时间序列,包含每个时间序列随时间变化的数据点范围
3、标量(Scalar ):一个简单的数字浮点值
4、String:一个简单的字符串值;当前未使用
根据不同的用例(例如,在绘制和显示表达式的输出时),只有其中一些类型是合法的,因为它们来自用户指定的表达式。例如,返回即时向量的表达式是唯一可以直接绘制图形的类型。
三 时间序列选择器
1、即时向量选择器(Instant vector selectors)
即时向量选择器允许在给定的时间戳(即时)为每个选择一组时间序列和一个样本值:在最简单的形式中,只指定一个名称。这将生成一个包含具有此名称的所有时间序列的元素的即时向量。
如: http_requests_total
,此示例选择具有http_requests_total 指标名称的所有时间序列
你可以通过在大括号{}中附加以逗号分隔的标签匹配器列表来进一步筛选这些时间序列:
此示例仅选择具有http_requests_total metric name且作业标签设置为prometheus且其组标签设置为canary的时间序列:http_requests_total{job="prometheus",group="canary"}
也可以与标签值负匹配,或与正则表达式匹配标签值:
=:选择与提供的字符串完全相等的标签。
!=:选择不等于提供的字符串的标签。
=~:选择正则表达式与提供的字符串匹配的标签。
!~:选择与提供的字符串不匹配的正则表达式标签
2、范围向量选择器(Range Vector Selectors)
范围向量文本的工作方式与即时向量文本类似,只是它们从当前瞬间选择一个样本范围。从语法上讲,范围持续时间附加在向量选择器末尾的方括号([])中,以指定应为每个结果范围向量元素获取时间值的时间间隔。
持续时间指定为一个数字,紧接着是下列单位之一:
s - seconds
m - minutes
h - hours
d - days
w - weeks
y - years
例子1:查询过去5分钟内记录的所有值,这些时间序列的度量名称为http_requests_total,作业标签设置为prometheus:
http_requests_total{job="prometheus"}[5m]
3、偏移修改器(Offset modifier)
offset修饰符允许更改查询中单个瞬间向量和范围向量的时间偏移。它必须紧跟在选择器后面。
例子:返回过去相对于当前查询计算时间总共5分钟的值:
http_requests_total offset 5m
四 操作符
1、算术运算符
+ (addition)
- (subtraction)
* (multiplication)
/ (division)
% (modulo)
^ (power/exponentiation)
算术运算符定义在标量/标量、矢量/标量和矢量/矢量值对之间。
1)在两个标量之间,行为是显而易见的:它们计算为另一个标量,这是应用于两个标量操作数的运算符的结果。
2)在瞬时向量和标量之间,运算符应用于向量中每个数据样本的值。如果时间序列瞬时向量乘以2,则结果是原始向量的每个样本值乘以2的另一个向量。
3)在两个即时向量之间,对左侧向量中的每个条目及其右侧向量中的匹配元素应用一个算术运算符。结果将传播到结果向量中,分组标签将成为输出标签集。将删除度量名称。在右向量中找不到匹配项的项不是结果的一部分。
2、比较运算符
== (equal)
!= (not-equal)
> (greater-than)
< (less-than)
>= (greater-or-equal)
<= (less-or-equal)
比较运算符在标量/标量、矢量/标量和矢量/矢量值对之间定义。默认情况下,它们会过滤。可以通过在运算符之后提供bool来修改它们的行为,该运算符将为值返回0或1,而不是筛选。
在两个标量之间,必须提供bool修饰符,并且根据比较结果,这些运算符将生成另一个标量,即0(false)或1(true)。
在瞬时向量和标量之间,这些运算符应用于向量中每个数据样本的值,并从结果向量中删除比较结果为假的向量元素。如果提供了bool修饰符,则要删除的向量元素的值为0,而要保留的向量元素的值为1。
在两个即时向量之间,默认情况下,这些运算符充当应用于匹配项的筛选器。表达式不为真或在表达式的另一侧找不到匹配项的向量元素将从结果中删除,而其他元素将传播到结果向量中,分组标签将成为输出标签集。如果提供了bool修饰符,则本应删除的向量元素的值为0,保留的向量元素的值为1,分组标签再次成为输出标签集。
3、逻辑运算符
逻辑运算符仅在瞬时向量之间定义:
and (intersection)
or (union)
unless (complement)
vector1和vector2产生一个由vector1的元素组成的向量,其中vector2中的元素具有完全匹配的标签集。其他元素被删除。度量名称和值是从左侧向量继承过来的。
vector1或vector2生成一个包含vector1的所有原始元素(标签集+值)和vector2的所有元素的向量,这些元素在vector1中没有匹配的标签集。
vector1,除非vector2生成一个由vector1的元素组成的向量,而vector2中没有与之完全匹配的标签集的元素。两个向量中的所有匹配元素都将被删除。
4、聚合运算符
普罗米修斯支持以下内置聚合运算符,可用于聚合单个即时向量的元素,从而生成具有聚合值的更少元素的新向量:
sum(计算维度上的总和)
min(选择最小尺寸)
max(选择最大尺寸)
avg(计算尺寸上的平均值)
stddev(计算尺寸上的总体标准偏差)
stdvar(计算维度上的总体标准方差)
count(计算向量中的元素数)
count_值(计数具有相同值的元素数)
bottomk(按样本值的最小k元素)
topk(样本值最大的k元素)
quantile (根据尺寸计算φ-分位数(0≤φ≤1)