Prometheus学习系列(六)之Prometheus查询说明
前⾔
本⽂来⾃和
Prothetheus查询
Prometheus提供⼀个函数式的表达式语⾔PromQL (Prometheus Query Language),可以使⽤户实时地查和聚合时间序列数据。表达式计算结果可以在图表中展⽰,也可以在表达式浏览器中以表格形式展⽰,或者作为数据源, 以的⽅式提供给外部系统使⽤。
⼀、例⼦
本⽂档仅供参考,对于学习,从⼏个开始可能更容易。
⼆、表达式语⾔数据类型
在Prometheus的表达式语⾔中,任何表达式或者⼦表达式都可以归为四种类型:
instant vector 瞬时向量:它是指在同⼀时刻,抓取的所有度量指标数据。这些度量指标数据的key都是相同的,也即相同的
时间戳
range vector 范围向量:它是指在任何⼀个时间范围内,抓取的所有度量指标数据
scalar 标量:⼀个简单的浮点值
string 字符串:⼀个当前没有被使⽤的简单字符串
根据⽤例(例如在绘制图形或显⽰表达式的输出时),由于⽤户指定的表达式的结果,其中只有某些类型是合法的。例如,返回瞬时向量的表达式是唯⼀可以直接绘制图形的类型。
三、字⾯量
3.1 字符串字⾯量
字符串可以⽤单引号,双引号或反引号指定为⽂字。PromQL遵循与Go相同的。在单引号,双引号中,反斜杠成为了转义字符,后⾯可以跟着a,b, f, n, r, t, v或者\。可以使⽤⼋进制(\nnn)或者⼗六进制(\xnn, \unnnn和\Unnnnnnnn)提供特定字符。在反引号内不处理转义字符。与Go不同,Prometheus 不会丢弃反引号中的换⾏符。例如:
"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t"'`
3.2 浮点数字⾯量
标量浮点值可以直接写成形式[-](digits)[.(digits)]。
-2.43
四、时间序列选择器
4.1 瞬时向量选择器
瞬时向量选择器允许在给定时间戳(即时)为每个选择⼀组时间序列和单个样本值:在最简单的形式中,仅指定度量名称。这会⽣成包含具有此度量标准名称的所有时间序列的元素的即时向量。
下⾯这个例⼦选择所有时间序列度量名称为http_requests_total的样本数据:
http_requests_total
通过在度量指标后⾯增加{}⼀组标签可以进⼀步地过滤这些时间序列数据。
此⽰例仅选择具有http_requests_total度量标准名称的时间系列,该名称也将job标签设置为prometheus,并将其group标签设置为canary:
http_requests_total{job="prometheus",group="canary"}
可以采⽤不匹配的标签值也是可以的,或者⽤正则表达式不匹配标签。标签匹配操作如下所⽰:
=  : 精确地匹配标签给定的值
!= : 不等于给定的标签值
=~ : 正则表达匹配给定的标签值
!~ : 给定的标签值不符合正则表达式
例如:度量指标名称为http_requests_total,正则表达式匹配标签environment为staging, testing, development的值,且http请求⽅法不等于GET。
http_requests_total{environment=~"staging|testing|development",method!="GET"}
匹配空标签值的标签匹配器也可以选择没有设置任何标签的所有时间序列数据。正则表达式完全匹配。可以为同⼀标签
名称提供多个匹配器。
向量选择器必须指定⼀个名称或⾄少⼀个与空字符串不匹配的标签匹配器。以下表达式是⾮法的:
{job=~".*"} # Bad!
相反,这些表达式是有效的,因为它们都有⼀个与空标签值不匹配的选择器。
{job=~".+"}              # Good!
{job=~".*",method="get"} # Good!
标签匹配器能够被应⽤到度量指标名称,使⽤__name__标签筛选度量指标名称。例如:表达式http_requests_total等价
于{__name__="http_requests_total"}。其他的匹配器,如:= ( !=, =~, !~)都可以使⽤。下⾯的表达式选择了度量指标名称以job:开头的时间序列数据:
{__name__=~"job:.*"}
Prometheus中的所有正则表达式都使⽤。
4.2 范围向量选择器
范围向量的⼯作⽅式与即时向量相同,不同之处在于它们从当前即时选择回采样范围。在语法上,范围持续时间附加在向量选择器末尾的⽅括号([])中,指定为每个结果范围向量元素提取多长时间值。持续时间指定为数字,单位为:
s - seconds
m - minutes
h - hours
d - days
w - weeks
y - years
在此⽰例中,我们选择在过去5分钟内为度量标准名称为http_requests_total且job标签设置为prometheus的所有时间序列记录的所有值:
http_requests_total{job="prometheus"}[5m]
4.3 偏移修饰符
这个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分钟速率:
rate(http_requests_total[5m] offset 1w)
五、⼦查询
⼦查询允许针对给定范围和分辨率运⾏即时查询。⼦查询的结果是范围向量。
语法:<instant_query>'['<range>':'[<resolution>]']'[offset <duration>]
<resolution>是可选的。默认值是全局评估间隔。
六、操作符
Prometheus⽀持⼆元和聚合操作符。详见
七、函数
Prometheus提供了⼀些函数列表操作时间序列数据。详见
⼋、注释
PromQL⽀持以#开头的⾏注释。如:
#这是⼀条评论
九、陷阱
9.1 旧数据
运⾏查询时,独⽴于当前时间序列的数据选择采样数据的时间戳。这主要是为了⽀持聚合(总和,平均等)这样的情况,其中多个聚合时间序列在时间上不完全对齐。由于它们的独⽴性,Prometheus需要在每个相关时间序列的时间戳上分配值。它只需在此时间戳之前采⽤最新的样本即可。
如果⽬标抓取或规则评估不再返回先前存在的时间序列的样本,则该时间序列将被标记为旧数据。如果⽬标被移除,之前很快就会将其先前返回的时间序列标记为旧数据。
如果在时间序列标记为过时后,在采样时间戳处评估查询,则不会为该时间系列返回任何值。如果随后在该时间序列中摄取新样本,它们将照常返回。
如果在采样时间戳前5分钟未到任何样本(默认情况下),则此时间点不返回该时间序列的值。这实际上意味着时间序列在其最新收集的样本超过5分钟或标记为旧数据之后从图表“消失”。对于在其抓取中包含时间戳的时间序列,不会标记旧数据。在这种情况下,仅应⽤5分钟的阈值。
9.2 避免慢查询和过载
如果查询需要对⼤量数据进⾏操作,则绘制图表可能会超时或使服务器或浏览器过载。因此,在构建对未知数据的查询时,始终在Prometheus表达式浏览器的表格视图中开始构建查询,直到结果集看起来合理(最多数百个,⽽不是数千个时间序列)。只有在充分过滤或汇总数据后,才能切换到图表模式。如果表达式仍然需要很长时间来绘制ad-hoc图形,请通过录制规则预先录制它。
正则匹配空字符
这与Prometheus的查询语⾔尤其相关,其中像api_http_requests_total这样的简单度量标准名称选择器可以扩展到具有不同标签的数千个时间序列。还要记住,即使输出只是少量的时间序列,聚合在许多时间序列上的表达式也会在服务器上产⽣负载。这类似于在关系数据库中对列的所有值求和的速度很慢,即使输出值只是⼀个数字。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。