首页 > 其他分享 >prometheus描点原理

prometheus描点原理

时间:2023-07-05 10:44:20浏览次数:39  
标签:查询 指标 prometheus 时间段 描点 query 原理

大家好,我是蓝胖子,关于prometheus的入门教程有很多,拿我之前学prometheus的经历来讲,看了很多教程,还是会对prometheus的描点以及背后的统计原理感到迷惑,所以今天我们就来分析下这部分,来揭开其神秘的面纱。

我们先来看看prometheus里的数据模型是怎么样的,只有知道了数据结构,才能理解对后续这些数据如何描点,如何计算出相应指标值。

数据模型

prometheus中存的是时序数据,时序数据有个特点是每条数据都有一个时间戳,并且时序数据都有一个metric_name(指标名),和一系列的label,以及当前指标的值value。当用prometheus web控制台查询出来的就是一条条时序数据,如下图所示:

image.png

时序数据描述一个指标的表达式可以归纳为:

metric_name{label_name1=label_val1,label_name2=label_val2,....}  

表达式开头是指标名,{}里的就是指标的标签。

在prometheus中,如果指标名和标签完全相同,那么将会认为他们是同一个指标,将一个指标不同时间戳的时序数据称为指标的样本。

这里要特别明确一点,用过prometheus 客户端的同学都知道prometheus有四大指标类型Counter,Guage,Histogram,Summary,但无论是哪种指标类型在prometheus服务端这边都是按照上述的指标格式进行存储的,prometheus server在存储时并不会去存特定某个指标是什么指标类型。

理解了prometheus server存储数据的类型,我们再来看看对prometheus server 进行查询时的数据返回类型。

prometheus server提供了两个api对外提供查询,分别是queryquery_range ,在prometheus中 用vector 类型表示单个时间点的指标数据,用matrix 表示一组时间点的指标数据。所以query_range api只能返回matrix 类型的数据。我们用prometheus web控制台演示下。

首先来看下在table列进行查询时涉及的查询,在table列进行查询会调用到query 的api,其返回结果既可以是matrix 类型,也可以是vector 类型。

image.png

如上图所示,查询返回的是vector类型的数据 , 我们在table这一栏输入PromQl查询语句,默认是查出当前时间最新的指标,可以看到返回的result是一个数组,因为匹配查询语句的不止一个指标,接着返回了指标的时间戳以及对应的值val。

在table这一列除了查询某个指标的瞬时值,还可以查某段时间内的值,对应的prometheus server api的返回类型就将是matrix类型了 ,如下图所示,我们可以修改PromQl语句让其查1m内的数据:

image.png

如上图所示,将查询语句改为go_memstats_other_sys_bytes{}[1m] 后返回的就是matrix类型的数据了,它表示一组时间点的数据。

其实看到这里,你应该能想到,prometheus绘图就是根据matrix类型的数据进行描点绘图的

描点原理

紧接着,我们就来看下prometheus的描点绘图原理。

首先要明确一点,绘图的原理本质上就是在一个个时间片段里进行描点,然后再将各个点连起来就形成了随时间变化的监控图Graph。所以在描点绘图时,用到的数据查询结果仅仅只能是matrix类型,因为只有它才能表示一个指标一组时间点的样本值。

我们再回顾下matrix数据格式是怎样的,

image.png
matrix数据格式的返回,每个指标都会携带一组时间点的样本,到时候描点时就是根据这些样本点的时间点为横坐标,样本的值为纵坐标进行绘图的。

接着,我们来看下绘图用到的查询数据api, 和在table栏进行查询不同,在绘图界面查询数据用到的api是query_range ,query_range返回的数据格式是matrix 类型的数据

image.png

注意下query_range的参数,已经和query不同了,因为query毕竟只查基于某个时间点的数据,而query_range是查某段时间的数据,所以query_range有个开始时间start和结束时间end,除此以外,它还有个参数step,这个参数是表示将start和end之间的时间段按step步长分割为更小的时间段,然后在每个小的时间段内将会产生一个描点 。最后就是将指标的描点全部连接起来就是一个曲线了。

描点是如何计算出来的

知道了在每个小的时间段内,prometheus会产生一个描点,我们还需要知道描点究竟是如何计算出来的。

拿截图的表达式rate(go_memstats_other_sys_bytes[1m]) 举例,假设时间区间[start,end]被step分成了3小段。

image.png

如上图,其中每段的开始时间戳分别是A1,A2,A3,按step进行累加,这3个小的时间段将会产生3个描点,每个描点计算规则如下:

val=rate函数(当前时间段与当前时间段减去1m这段时间内的所有样本)

每个描点,都会执行一次rate函数得到描点的value值,描点的时间戳则是每个小的时间段开始的时间,而计算的样本则是 每个小的时间段开始时间到 之前的1m的时间范围内筛选出来的。

histogram_quantile 表达式如何描点的?

上面的描点例子比较简单,我们来看一个复杂点的,这个也是Histogram 指标类型统计的原理。

如下,我们通常会用到histogram_quantile去计算服务接口时间的耗时情况。

histogram_quantile(0.99,rate(server_handle_seconds_bucket{}[1m]))

它描点的逻辑依然逃不开 将一个大的时间段分为小的时间段,并且每个小的时间段产生描点。也就是说,每个小的时间段也都会执行一次histogram_quantile 函数得到描点值,但histogram_quantile的样本值从哪里得来呢?

是在小的时间段内通过rate函数计算得到的,rate函数的样本来源也和刚才讲的一样,是当前时间段与当前时间段减去1m这段时间内的所有样本。

思考题

这样的确得到了3个描点,能绘制出曲线来,但最开始我在看到这个表达式还是很疑惑的,因为它将之前的每个直方图的指标都进行了rate计算,这样在用histogram_quantile计算最终分位数的时候不会导致结果变化吗?这就涉及到了histogram_quantile计算分为数的逻辑,有空我会在下篇文章继续分析。

标签:查询,指标,prometheus,时间段,描点,query,原理
From: https://www.cnblogs.com/hobbybear/p/17527886.html

相关文章

  • vue渲染原理简单实现
    实现功能:1.渲染系统:·功能一:h函数,用于创建并返回一个VNode(虚拟对象);·功能二:mount函数,用于将VNode挂载到节点上;·功能三:patch函数,用于对比两个VNode,决定该如何处理新的VNode;1.新建一个index.html的页面其中有一个id为app的div元素,之后我们写的所有DOM都会挂载到此元素......
  • mybatis的原理
    MyBatis是一个持久层框架,它的工作原理是:1.首先,MyBatis从XML映射文件中读取SQL语句,将其解析成SQL语句对象,并将SQL语句对象存储在内存中。2.然后,MyBatis将SQL语句对象与用户提供的参数绑定,生成完整的SQL语句。3.接着,MyBatis将SQL语句发送给数据库,并将查询结果映射到Jav......
  • KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?
     Kd-Tree,即K-dimensionaltree,是一棵二叉树,树中存储的是一些K维数据。在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域(Hyperrectangle)。在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(BinaryS......
  • ASL单芯片CS5366TypeC转HDMI4K60HZ加HUB多口方案|CS5366带PD拓展方案原理图
    CS5366芯片是ASL集睿致远最新推出的2Len带PD的扩展坞方案芯片,CS5366支持4K60HZ。在分辨率4K下,刷新率60HZ对于30HZ看似提升不多,但是对于应用在游戏主座的客户来说至关重要,现在年轻一代消费力强,也注重享受和体验,博主自己也打游戏,相信大家都知道流畅度的重要性。市面上TypeC扩展坞......
  • prometheus Rmote Write loss data 丢失数据
    问题现象背景介绍目前prometheus(本地存储一小时数据)收集指标victroriametrics负责存储项目地址grafana村victoria中读取指标并绘制图表remoteread现象描述指标丢失prometheus本地数据完好。判断远程写入存在问题......
  • 56.malloc与free的实现原理?
    56.malloc与free的实现原理?1.在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk、mmap、,munmap这些系统调用实现的;2.brk是将数据段(.data)的最高地址指针_edata往高地址推,mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存......
  • 54.new和delete的实现原理, delete是如何知道释放内存的大小的?
    54.new和delete的实现原理,delete是如何知道释放内存的大小的?1、new简单类型直接调用operatornew分配内存;而对于复杂结构,先调用operatornew分配内存,然后在分配的内存上调用构造函数;对于简单类型,new[]计算好大小后调用operatornew;对于复杂数据结构,new[]先调用operatornew[]......
  • 【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考
    论  坛:http://bbs.100ask.net/(学术答疑)公 众 号:百问科技版本日期作者说明V12020韦东山技术文档公布完好消息,接下来重点谈谈开源烧写工具100ask_imx6ull_Flashingtool。100ask_imx6ull_Flashingtool由深圳百问网科技有限公司(下称:百问网)独立开发,版权归百问网所有,并保留对......
  • 第016课 Nand Flash操作原理及裸机程序分析
    第001节_NAND_FLASH操作原理NANDFLASH原理图NANDFLASH是一个存储芯片那么:这样的操作很合理”读地址A的数据,把数据B写到地址A”问1.原理图上NANDFLASH和S3C2440之间只有数据线,怎么传输地址?答1.在DATA0~DATA7上既传输数据,又传输地址当ALE为高电平时传输的是地址,那么在数据......
  • 第017课 LCD原理详解及裸机程序分析
    第001节_LCD硬件原理先简单介绍下LCD的操作原理。如下图的LCD示意图,里面的每个点就是一个像素点。想象有一个电子枪,一边移动,一边发出各种颜色的光。这里有很多细节问题,我们一个一个的梳理。电子枪是如何移动的?答:有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动......