PromQL语言基础

本文是Prometheus官方文档的翻译,在尽量不改变原意的基础上对内容做了一点修改,原文地址https://prometheus.io/docs/prometheus/latest/querying/basics/

 

查询Prometheus
Prometheus提供一种名叫PromQL(Prometheus Query Language)的功能查询语言,使用户能实时查询和汇聚时序数据。一个表达式的结果可以用图形来显示,在Prometheus表达式浏览器中作为表格数据来展示,或通过HTTP API供外部系统使用。

1. 例子
本文档意图写成一个参考。为了学习,从一些例子开始可能更容易


2. 表达式语言数据类型
在Prometheus表达式语言中,可以把一个表达式或子表达式评估为以下四种类型中的一个:
即刻向量(Instant vector)     一系列的时序,这些时序包含每个时序的一个单独采样,它们共享同一个时间戳
范围向量(Range vector)     一系列的时序,这些时序包含每个时序随时间产生的数据点的一个范围
标量(Scalar)                       一个简单的浮点数字值
字符串(String)                    一个简单的字符串值;当前未使用

取决于使用场景(如,把一个表达式的输出用于图形化或作为数据来显示),对一个用户指定表达式的结果来说在这些类型中只有一部分是合法的。例如,一个返回即刻向量的表达式是可以被直接图形化的唯一类型。


3. 明文
3.1 字符串明文
可以把单引号、双引号、反引号括起来的字符串指定为明文。
PromQL遵循和Go相同的逃逸规则。在单引号或双引号中,一个反斜杠(backslash)开始一个逃逸序列,可能跟随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. 时序选择器
4.1 即刻向量选择器
即刻向量选择器允许对一系列时序和针对每个给定时间戳(即“即刻”)的抽样值的选择:最简单形式,仅指定一个指标名。这导致一个即刻向量包含具有该指标名的所有时序的元素。
下面的例子选择具有http_requests_total指标名的所有时序:
http_requests_total

通过附加一个用花括号括起来,用逗号分隔的标签匹配符的列表,可以对这些时序做进一步过滤。
下面的例子仅选择那些具有http_requests_total指标名,且job标签是prometheus,并且它们的group标签是canary的时序:
http_requests_total{job="prometheus",group="canary"}

反向匹配一个标签值,或基于正则表达式来匹配标签也是可能的。有如下的标签匹配符存在:
=      选择明确等于给定字符串的标签
!=     选择不等于给定字符串的标签
=~     选择满足正则匹配给定字符串的标签
!~     选择不满足正则匹配给定字符串的标签

例如,下面的例子选择包含environments等于staging或testing或development,且HTTP methods不是GET的所有http_requests_total时序。
http_requests_total{environment=~"staging|testing|development",method!="GET"}

匹配空标签值的标签匹配符也选择完全没有具体标签的所有时序。正则匹配是完全锚定化的。同一个标签名存在多个匹配符是可能的。

向量选择器必须指定一个名字或至少一个不匹配空字符串的标签匹配符。以下的表达式是不合法的:
{job=~".*"}              # 不行!

与之对照,下面这些表达式是有效的,因为它们都具有一个不匹配空标签值的选择器。
{job=~".+"}              # 好的!
{job=~".*",method="get"}  # 好的!

通过匹配内部__name__标签,标签匹配符也可以被用到指标值上。例如,表达式http_requests_total和{__name__="http_requests_total"}相等。也能使用等号(=)之外的匹配符(!=, =~, !~)。以下的表达式选择所有名称是以job:开头的指标。 
{__name__=~"job:.*"}

Prometheus中的所有正则表达式使用RE2语法

4.2 范围向量选择器
范围向量明文的工作方法与即刻向量明文类似,区别在于它们选择一个自当前即刻位置往回走的抽样范围。在句法构成上,一个用方括号括起来的持续范围被附加到一个向量选择器的末尾,以指示对于每个范围向量元素,应该往回走多远的时间来取值。

时间持续期是作为一个数字,紧跟一个单位来指定,可用的单位如下:
s   - 秒
m   - 分钟
h   - 小时
d   - 天
w   - 星期
y   - 年

下面这个例子,我们选择在最近5分钟内记录到的,指标名是http_requests_total,并且job标签是prometheus的所有时序的全部值:
http_requests_total{job="prometheus"}[5m]


4.3 偏移量修饰符
偏移量修饰符允许改变查询中个别即刻向量和范围向量的时间偏移量。
例如,以下的表达式返回与当前查询评估时间相关的过去5分钟的http_requests_total值:
http_requests_total offset 5m

注意偏移量修饰符必须总是立即跟随选择器,例如,以下是正确的:
sum(http_requests_total{method="GET"} offset 5m)   // 好

以下是不正确的:
sum(http_requests_total{method="GET"}) offset 5m   // 无效

对范围向量的相同实现。这返回一周前http_requests_total具有的5分钟比率:
rate(http_requests_total[5m] offset 1w)


5. 子查询
子查询允许您针对一个给定的范围和解析度运行一个即刻查询。子查询的结果是一个范围向量。
语法:
<instant_query> '[' <range> ':' [<resolution>] ']' [ offset <duration> ]

注意:<resolution>是可选的。默认是全局评估间隔。

6. 运算符
Prometheus支持很多二元和聚合运算符。这些在表达式语言运算符页中详细描述。


7. 函数
Prometheus提供几个在数据上执行操作的函数。这些在表达式语言运算符页中详细描述。


8. 注释
PromQL支持以井号(#)开头的行注释。例如:
 # This is a comment


9. 难点
9.1 过时性
当查询正在运行时,现存时序数据中取样数据的时间戳是被独立选择的。这主要是为了支持如聚合(sum、avg,等)之类的情况,这里的多个聚合时序在时间上并不是精确排列的。因为它们的独立性,Prometheus需要针对每个相关时序在那些时间戳中指派一个值。通过仅采集该时间戳之前的最新采样,它就能这么做。
如果一个目标刮擦或规则评估不再为先前存在的某个时序返回一个采样,那个时序将被标记为过时的。如果一个目标被移除,在不久之后,它先前返回的时序将被标记为过时的。
如果一个查询在一个时序被标记为过时之后的某个采样时间戳被评估,那个时序将不会有值返回。如果那个时序后来又摄取了新值,它们将被正常返回。
如果在一个采样时间戳之前的5分钟(默认值)没有采样被发现,该时间点的时序就没有值被返回。这实际上意味着从图形看,时序在时间上“消失”了,在那里,它们最新的收集采样比5分钟早,或者是在它们被标记为过时的之后。
将不会为那些把时间戳包含在它们的刮擦中的时序标记过时性。这种情况仅有5分钟阈值适用。

9.2 避免慢查询和过载
如果一个查询需要在巨量的数据上操作,将它图形化可能会超时,或使服务器或浏览器过载。因此,当在未知数据上构建查询时,总是从Prometheus表达式浏览器的表格视图开始构建查询,直到结果集看上去是合理的(时序最多是上百,而不是上千)。仅当您已经充分过滤或聚合了您的数据时,才切换到图形模式。如果表达式依然花费太多时间去显示图形,就通过一个预记录规则去专门的预记录它。
这跟Prometheus查询语言很有关系,一个光秃秃如api_http_requests_total的指标名选择器可能扩展成上千个具有不同标签的时序。还要记住,在大量时序上聚合的表达式将在服务器上产生负载,即使结果仅是少量的时序。这类似于关系数据库中对一个列的所有值求和是怎么变慢的,即使结果值仅是一个数字。
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值