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

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

数据模型

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

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

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 类型。

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

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

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

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

描点原理

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

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

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



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

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

注意下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小段。

如上图,其中每段的开始时间戳分别是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描点原理的更多相关文章

  1. Prometheus TSDB存储原理

    Prometheus 包含一个存储在本地磁盘的时间序列数据库,同时也支持与远程存储系统集成,比如grafana cloud 提供的免费云存储API,只需将remote_write接口信息填写在Prom ...

  2. Spring-扫描注解原理,注解自动扫描原理分析

    注解自动扫描原理分析 在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢? <context:component-scan base-packa ...

  3. RPC通信原理

    什么是 RPCRPC(Remote Procedure Call Protocol)远程过程调用协议.通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算上的某个过程或函数,就像调用本地应 ...

  4. 基于Prometheus搭建SpringCloud全方位立体监控体系

    前提 最近公司在联合运维做一套全方位监控的系统,应用集群的技术栈是SpringCloud体系.虽然本人没有参与具体基础架构的研发,但是从应用引入的包和一些资料的查阅大致推算出具体的实现方案,这里做一次 ...

  5. 如何扩展单个Prometheus实现近万Kubernetes集群监控?

    引言 TKE团队负责公有云,私有云场景下近万个集群,数百万核节点的运维管理工作.为了监控规模如此庞大的集群联邦,TKE团队在原生Prometheus的基础上进行了大量探索与改进,研发出一套可扩展,高可 ...

  6. Prometheus 入门教程(一):Prometheus 快速入门

    文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/ZXlBPHGcWeYh2hjBzacc3A Prometheus 是任何一个高级工程师必须要掌握的技 ...

  7. 基于Centos7.4搭建prometheus+grafana+altertManger监控Spring Boot微服务(docker版)

    目的:给我们项目的微服务应用都加上监控告警.在这之前你需要将 Spring Boot Actuator引入 本章主要介绍 如何集成监控告警系统Prometheus 和图形化界面Grafana 如何自定 ...

  8. kubernetes实现用户自定义扩缩容

    本文章主要参考walkthrough,aggregation和auth.涉及custom metric API的注册认证以及API server aggregation的相关知识.walkthroug ...

  9. Prometheus存储原理及数据备份还原

    prometheus将采集到的样本以时间序列的方式保存在内存(TSDB 时序数据库)中,并定时保存到硬盘中.与zabbix不同,zabbix会保存所有的数据,而prometheus本地存储会保存15天 ...

  10. Python-属性描叙符协议ORM实现原理依据- __set__ __get__ __delete__

    class CheckString: def __init__(self, variable_type): self.variable_type = variable_type def __set__ ...

随机推荐

  1. [GIT]辨析/区别: git add -u | git add -A | git add . [转载]

    参考文献 git add -u与-A .三者的区别 - CSDN

  2. [IDE]IntelliJ IDEA 不能识别 Java 项目 [转]

    本文转载自 IntelliJ IDEA 不能识别 Java 项目 - 博客园/SmartJuneThx 解决方法 非maven项目 在 src 目录上点右键,选择 Mark Directory As ...

  3. 随手记:linux校准时间

    记录一下校准时间操作的执行步骤: 首先使用 date 查看当前时间是否准确 校准时间命令 ntpdate cn.pool.ntp.org 如果没有权限: sudo -i 会出现输入密码,直接输入密码即 ...

  4. STM32下载ELF文件、最小可执行bin文件测试

    1.STM32能下载ELF格式的文件吗? 答:可以.因为所谓的bin文件就是ELF文件的.text代码段. 当然前提是下载工具能识别ELF文件格式,STM32下载ELF文件并不意味着STM32可以把E ...

  5. SQL Server数据库判断最近一次的备份执行结果

    1 麻烦的地方 在SQL Server的官方文档里面可以看到备份和还原的表,但是这些表里面只能找到备份成功的相关信息,无法找到备份失败的记录,比如msdb.dbo.backupset.对于一些监控系统 ...

  6. SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

    本文为千锋教育技术团独家创作,更多技术类知识干货,点个关注持续追更~ 接口幂等性是Web开发中非常重要的一个概念,它可以保证多次调用同一个接口不会对结果产生影响.如果你想了解更多关于接口幂等性的知识, ...

  7. 2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给

    2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给 ...

  8. 2021-08-13:给定一个每一行有序、每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。

    2021-08-13:给定一个每一行有序.每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数. 福大大 答案2021-08-13: 二分法. 代码用golang编 ...

  9. structed streaming 触发器trigger

    structed streaming的执行批次,较spark streaming有所改变.更加灵活.总结下来,可大白话地分为三类: 1尽可能快的执行,不定时间 2按固定间隔时间执行 3仅执行一次 详情 ...

  10. APP中RN页面渲染流程-ReactNative源码分析

    在APP启动后,RN框架开始启动.等RN框架启动后,就开始进行RN页面渲染了. RN页面原生侧页面渲染的主要逻辑实现是在RCTUIManager和RCTShadowView完成的. 通过看UIMana ...