开发者学堂课程【3天吃透 Prometheus:PromQL 使用基础】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1244/detail/18447
PromQL 使用基础
三、PromQL 的数据类型及匹配器
1. PromQL 的数据类型
其实此前讲过,即时向量,范围向量标量和字串,字串要使用单引号,双引号和反引号的引用,都是同一个意义。但是反引号不会对转义字符进行转义,比如你写个反\n、反\ t ,他就不会解释。因而我们使用单双引号,这是最规范的做法,除非我们不打算让他转义的时候才使用反引号,反引号是你波浪线挨着的点也知道的,学过脚本应该知道什么是反应号。
接着这里边通过这个图给大家表示,这就是所谓即时向量,叫 instant vector selector,叫即时向量选择。其选择一个即时向量,这个表示叫 range vector selector,叫范围向量选择器。所以它选出来的就是一个范围向量,范围向量就是一个矩阵。
2.时间序列选择器(the series selectors)
Prom QL的查询操作需要针对有限个时间序列,一定是有限个上面的样本进行,你存的也是有限的,这毋庸置疑。挑选出的目标时间序列是构建表达式最关键的一步。要先挑选出时间序列来,而后才判定我们要挑哪些值就哪个范围内的值。用户可使用向量选择器。对于概念叫向量选择器的表达式来挑选给定指标名称下的所有时间序列或部分时间序列,所有只给定名称就行,部分就使用匹配器。这有几个匹配器,我们要使用标签选择器来过滤标签,这是第一个概念。我们先挑出时间序列,怎么挑,只给定指标名,就表示该名称的所有时间序列,也可以在指标名后面跟一个匹配器,也叫标签选择器来过滤该指标名称下符合匹配器的时间序列,这是第一步挑选出时间序列。对时间序列,接下来我们要挑哪些值?对这部分时间序列,我们可以挑当前样本值,表示叫即时向量,结果就是即时向量。也可以挑从当前时间至过去某个时间范围内的样本值,范围向量,明白了吗?所以,如果你没指定时间范围,都是及时向量?没给定时间范围内的都叫即时向量选择器,给定时间范围的就叫范围向量选择器。
第一步我们要构建出时间序列,什么样的称为即时向量选择器,什么样的叫范围向量选择器?所谓范围向量选择器,就是在即时向量选择器后面表达上面加一个中括号,里指个时长,比如 5 分钟就可。所以我们只要理解即时向量选择器,理解范围向量选择器就没什么难度。但是要注意,我们的表达式浏览器在绘图的时候只能绘制及时向量选择器的结果,范围向量级是个矩阵,它无法绘制一个矩,但如果是一个即时向量选择器,它有好处就自己指定Zoom ,我给大家解释可能在这里我们给定个及时向量选择器,比如 node disk lo now ,这就对应的每一次只返回一个值的就叫即时性量选择器。我们这是可以绘图,他绘图其指的意思是这里大家可以发现有个时间轴,我们讲过这叫镜头远近,所以他这里已经指定时间。你自己指的是及时的。它给你加上一个 1H, 表示这绘的图是过去一个小时内的是线。你有没有想过,我们在这再止5 分钟就麻烦,怎么绘图?意思是我要挑选出 过去5分钟的值,人家这里要显示过一个小时的值,到底以谁为准?听明白这意思了吗?所以他的绘图要求你必须得是及时向量,因为他自己是把它视作为一个它自己会在后面附加时间范围的。但如果我们只是挑选出一个值来,你使用时间范围都行。
比如这里加 5 分钟,你看点执行它就会报错的。
error executing query invalid expression type.range vector, 对于范围向量,它这是没法绘图的这意思。
但是可以显示值,因为每一个指标,每一个时间序列会显示这么一组值。它分别显示了不同时间窗的不同值。第一个时序一组值,第二个时间序列一组值。所以它就没办法绘图。你只 5 分钟范围,但是这个图上又要求是一个小时范围,你给两个时间范围,它无法理解。
这已经直接用了时间序列选择器。
3.向量表达式的使用要点
刚才应该解释过表达式的返回值类型。你写个表达式后,返回的结果可以是一个即时向量,可以返回向量,可以是个标量或者是字串四种值。如果是一个标量,一般意味着它可能只是选择单个时间序列的单个样本,所以标量不能叫常量。标量就是一个正常值,一个直接值。如果是字串,通常可能是你选择返回了一个指标的名称之类。因为它本身内部是没有字符串值的。它反应的值只能是其中四种之一。但是有些使用场景要求表达式必须它的反馈值必须满足特定条件。刚才也解释过比如要绘图,只能使用即时向量的结果。但是对于 rate 一类的速率函数来讲,它又要求必须是范围向量型的数据,而它返回的结果却是即时向量。比如我需要返回 5 分钟之内的平均值。比如我找一个叫做 prometheus_ http_ requests_ total,我看到执行一下,这叫我们prometheus 自己的 web 服务器接口所接受的 web 服务器的请求。它是一个 total 计数器。
对计数器而言,你说它是一个单调递增值。我们通常应该获取它的叫变化速率,一会增高,一会提升。所以我们需要对它做rate,要这里加一个rate,这叫函数,一般来讲叫速率计算。我们要算速率的。速率其实指的是平均值,对什么进行平均,你这样平均他就会蒙掉。因为我们不知道对指标上的什么值进行平均,所以你必须给他指定个什么时间范围,即对 5 分钟之内的结果进行做平均计算。对 5 分钟之内的值做平均计算,所以我计算出来,看每一种请求大概 5 分钟之内的平均值是多少?指的是过去 5 分钟的平均值。
如果是绘图,又意味着什么?图是不是更直观了?带它的变化速率。这个绘图又指的是什么?以 5 分钟长度为单位,来一次取得过去一个小时内的每 5 分钟的平均值,所以对它进行绘图。可能我们继续第一个样本往前逆 5 分钟,第二个样本往前逆 5 分钟,第三个样本往前逆 5 分钟,不是 5 分钟分割的,不是把 1个小时分成多少段? 分成 12 段,每段做平均不是这样的,可以这么看出来,这个图的样子大概应该也是刚才我们所描述的,就好像一个样本,往下推 5 分钟。
所以我们说对于 rate 这种函数来讲,它一定要指定个时间范围才能求速率,其实就是平均值的,但这个速率结果生成的结果却又是一个及时向量。你要指定时间范围的后,由于范围向量选择器返回的范围向量型的数据不能使用表达式浏览器中的绘图功能已经解释过,否则就会发生为错误的。
事实上,范围向量几乎总是结合速率的 rate 函数一同使用的,你只要加范围向量就应该使用rate,或者使用 irate 或者其他函数。各位记住,我们讲rate有个问题,为大家讲过的,你要在一个团队取平均值会导致什么?可能会掉坑,所以有时候我们会使用精度更高的叫irate。irate它一般使用你指定时间范围内的最后两个值做平均,这样会更精准,灵敏度更高。但是时间它的数据偏差量可能会更大。后面我就找时间专门介绍函数,来看一下其他说明。我继续我们的课话题。
4. 即时向量选择器
即时向量选择器有两部分组成,第一指标名,第二匹配器。其实我已经解释过,指标名可选,匹配器也可选,但不能两个都可选,我们要给一个。匹配器是定义在标签,定在夸括号之中的选叫做项,也叫标签选择器。刚才给大家解释过的。很显然,在定义即时项链选择器的时候,以上两部分应该至少给一个,这是我总结的。于是这将存在以下三种组合。
第一,仅给定指标名或在标签名称上使用了空值的匹配器,它的意义是一样的返回给定指标下的所有时间序列,各自的即时样本。因为我没有指时间范围,所以它俩的意义是一样的,花括号带不带都行。
第二,仅给定匹配器表示返回符合给定匹配器的所有序列上的是即时样本。比如 {job=”.*”, method =”get”},表示返回所有 job 拥有有 job 标签,能理解为有 job 标签。而且 method 标签值又是 get 的所有的时间序列,所有的指标下的标记的时间序列的值。其实此前我们已经给大家演示过。比如第一个叫 Prometheus- htt p_request,我们不加任何不加花括号,不加选择器,这选择的是多个标签,或者叫多个时间序列,因为它们拥有不同的标签。这里花括号,加不加的意义是一样的,效果是一样的。
接着我们也可以只给划括号里边指定标签。其实此前给大家演示过,比如我就指明 code =200,表示任何一个指标序列,只要它有 code = 200 这么一个 code 标签,且它的值是200。不管它的指标名是什么,都得调出来,如图所示。
Prometheus_ http_request这是一个。下面 Prometheus_metric handler _request_ total 也是一个。因为它里边都有 code=200。所以这样对指标名就没有限制。第三种,我们可以同时二者使用,指标名和匹配器的组合。很显然,第三种匹配的范围最严格它会匹配或者返回给定时间序列且符合给定标签过滤器的所有时间序列的记证本。给返回给定的指标名称下,因为这叫指标,这里写错,不是指定,而是指标,且符合给定标签过滤器的所有时间序列样本。在他的基础上又做了一个限制。Prometheus_ http_request_ total。前面给大家演示过,比如使用 code =400。这就是code =400的值。所以时间序列就只有一个。
也可以code =200,还可以再过滤。