大家好,我是蓝胖子,书接上文,我在prometheus描点原理那一篇文章里,留了一个思考题:

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

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

但是rate函数会将原指标按时间求斜率,这样会影响原本分位数的计算吗?

先说下结论,不影响分位数结果的计算。要解释这个问题,还是要看看分位数统计Histogram的原理。

Histogram指标内容

在解释统计原理之前,我们先看看Histogram指标指标究竟是如何存储的,当我们用prometheus 客户端创建一个Histogram监控数据类型时,其本质上会创建一组指标,如下所示:

注意概念,在prometheus中,如果指标名和标签完全相同,那么将会认为他们是同一个指标,将携带有时间戳的指标 称为指标的样本。prometheus server web控制台查询出来的就是样本。

# TYPE server_handle_seconds histogram
server_handle_seconds_bucket{type="http",le="0.005"} 0
server_handle_seconds_bucket{type="http",le="0.01"} 0
server_handle_seconds_bucket{type="http",le="0.025"} 0
server_handle_seconds_bucket{type="http",le="0.05"} 0
server_handle_seconds_bucket{type="http",le="0.1"} 0
server_handle_seconds_bucket{type="http",le="0.25"} 0
server_handle_seconds_bucket{type="http",le="0.5"} 0
server_handle_seconds_bucket{type="http",le="1"} 0
server_handle_seconds_bucket{type="http",le="2.5"} 0
server_handle_seconds_bucket{type="http",le="5"} 0
server_handle_seconds_bucket{type="http",le="10"} 37092
server_handle_seconds_bucket{type="http",le="+Inf"} 37092
server_handle_seconds_sum{type="http"} 370920
server_handle_seconds_count{type="http"} 37092

le标签可以认为是Histogram监控数据类型特有的标签,含义是桶的上边界, 拿上述指标server_handle_seconds_bucket{type="http",le="10"} 举例,这个指标的值是37092,表示小于等于10s的请求有37092次。直方图Histogram每个桶中统计的次数包含了前面的桶的次数。

histogram_quantile在计算分位数时,就是判断指标样本中是否携带le标签,是的话才会纳入分位数的计算中。并且histogram_quantile函数是拿一组瞬时向量进行计算的,计算后得到一个分位数。

注意下概念,在prometheus中,向量vector是指 单个时间点的指标样本,矩阵matrix是一组时间点的样本。无论是vector还是matrix,他们都可以是多个指标,不过区别在于指标的样本是单个时间点的,还是一组时间节点的。

拿上述指标举例,histogram_quantile 计算时就是拿指标名为server_handle_seconds_bucket的指标集合 某个时间节点的指标值进行计算的。指标集合包含下面几个指标

##  指标名和标签                                      指标值
server_handle_seconds_bucket{type="http",le="0.005"} 0
server_handle_seconds_bucket{type="http",le="0.01"} 0
server_handle_seconds_bucket{type="http",le="0.025"} 0
server_handle_seconds_bucket{type="http",le="0.05"} 0
server_handle_seconds_bucket{type="http",le="0.1"} 0
server_handle_seconds_bucket{type="http",le="0.25"} 0
server_handle_seconds_bucket{type="http",le="0.5"} 0
server_handle_seconds_bucket{type="http",le="1"} 0
server_handle_seconds_bucket{type="http",le="2.5"} 0
server_handle_seconds_bucket{type="http",le="5"} 0
server_handle_seconds_bucket{type="http",le="10"} 37092
server_handle_seconds_bucket{type="http",le="+Inf"} 37092

所以我们在计算时为什么要将server_handle_seconds_bucket{}[1m] 用rate函数进行计算,因为单独的server_handle_seconds_bucket{}[1m] 返回的数据类型是matrix类型,是一组时间节点的样本,即某个 桶类型的指标有多个样本值,而 histogram_quantile 只要求一个桶类型的指标(携带le的指标)只有一个样本值。所以通过rate函数将一个矩阵类型的数据变成了向量类型

histogram_quantile 统计分位数原理

搞懂了为什么要用rate函数,再来看看为什么rate函数改变了桶的大小后不会对分位数计算逻辑产生影响。

拿文章开头的计算分位数的表达式举例

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

我们需要计算指标名为server_handle_seconds_bucket 在过去1分钟内的数据的百分之99分位数。

histogram_quantile计算步骤如下:

1, 首先会拿最后一个桶中(因为最后一个桶包含了所有样本的个数)的统计的次数去乘以分位数,看下第99分位是所有样本数据中的第几个,假设用rank变量存储这个结果。

2,拿上一步的计算结果rank值挨个桶比较统计次数,找到第一个桶的次数大于等于rank值的桶。这一步就计算出了99分位的样本是在哪个桶里。

3,最后通过下面的计算估算99分位数是多少

bucketStart + (bucketEnd-bucketStart)*(rank/count)

bucketEnd 和bucketStart是桶的上下边界值,估算分位数是多少时,是默认在这个桶内,数据是线性均匀分布的,所以拿(bucketEnd-bucketStart)*(rank/count) 估算出99分为的数在这个桶内的偏移量。

所以,你可以看到分位数的计算虽然用到了count值,但是是拿count值和rank值相除得到一个比例,rate函数虽然将桶指标的count值变小了,但由于计算时,我仅仅是求一个比例值,所以对分位数的结果运算并不影响。

prometheus Histogram 统计原理的更多相关文章

  1. Monitor Minio server with Prometheus

    转自:https://blog.minio.io/monitor-minio-server-with-prometheus-4ed537abcb74 Prometheus is an open sou ...

  2. openresty(完整版)Lua拦截请求与响应信息日志收集及基于cjson和redis动态路径以及Prometheus监控(转)

    直接上文件 nginx.conf #运行用户和组,缺省为nobody,若改为别的用户和组,则需要先创建用户和组 #user wls81 wls; #开启进程数,一般与CPU核数等同 worker_pr ...

  3. 用prometheus监控Nginx

    GitHub上官方地址:https://github.com/knyar/nginx-lua-prometheus 告警规则地址:https://awesome-prometheus-alerts.g ...

  4. 如何区分prometheus中Histogram和Summary类型的metrics?

    要理解它们的区别,关键还是告业务应用. 但如何在学习时,如何区分呢? 有以下几个维度: histogram有bucket,summary在quatile. summary分位数是客户端计算上报,his ...

  5. Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!

    Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...

  6. Prometheus 系统监控方案 一

    最近一直在折腾时序类型的数据库,经过一段时间项目应用,觉得十分不错.而Prometheus又是刚刚推出不久的开源方案,中文资料较少,所以打算写一系列应用的实践过程分享一下. Prometheus 是什 ...

  7. prometheus client_golang使用

    序言 Prometheus是一个开源的监控系统,拥有许多Advanced Feature,他会定期用HTTP协议来pull所监控系统状态进行数据收集,在加上timestamp等数据组织成time se ...

  8. Prometheus(转载)

    Prometheus 系统监控方案 一 https://www.cnblogs.com/vovlie/p/Prometheus_CONCEPTS.html 最近一直在折腾时序类型的数据库,经过一段时间 ...

  9. Prometheus监控数据格式学习

    本文大纲: • prometheus metrics的概念• k/v的数据形式• prometheus exporter的使⽤(pull形式采集数据)• prometheus pushgateway的 ...

  10. prometheus监控示例

    prometheus架构图 prometheus 各组件介绍 Prometheus Server: 使用pull方式采集监控数据,在该组件上配置监控数据的采集和告警规则. Client Library ...

随机推荐

  1. dfs实现

    1.思路:从图中的未访问的一个顶点开始,沿着一条路一直走到底,然后这条路尽头的节点,在从另外一条路走到底,不断递归此过程,直到所有遍历完成特点:不撞南墙不回头2.具体实现:当从一个未知的顶点出发,将这 ...

  2. Windows 下无法使用 C++11 标准 thread 类

    问题描述 最近需要在 windows 平台使用 C++ 多线程编程,编译时提示错误 thread is not a member of std, or you maybe forget '#inclu ...

  3. day120:MoFang:修复宠物喂食饱食度不增加的BUG&修复宠物死亡导致数据错乱的BUG

    目录 BUG1:修复宠物喂食饱食度未增加的BUG BUG2:修复当用户拥有2个宠物时,如果第1个宠物挂了,会出现第二个宠物变成第1个宠物的情况,会导致数据发生混乱出现bug BUG1:修复宠物喂食饱食 ...

  4. Matlab蚁群算法求解旅行商问题

    目录 问题展现 解决代码 代码1 输出结果 代码2 输出结果 代码3 输出结果 问题展现 假设有一个旅行商人要拜访全国 31 个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且 ...

  5. axios文件下载!!!!

    前端 download(){ debugger; this.loading = true; axios.post('http://localhost:8081/brand_case/dao.do?me ...

  6. 轻量化3D文件格式转换HOOPS Exchange新特性

    BIM与AEC市场发展现状 近年来BIM(建筑信息模型)和AEC(建筑.工程和施工)市场一直保持着持续增长.2014 年全球 BIM 软件市场价值 27.6 亿美元,而到 2022年,预期到达115. ...

  7. 记一次nginx配置不当引发的499与failover 机制失效

    背景 nginx 499在服务端推送流量高峰期长期以来都是存在的,间或还能达到告警阈值触发一小波告警,但主观上一直认为499是客户端主动断开,可能和推送高峰期的用户打开推送后很快杀死app有关,没有进 ...

  8. Vue3 +element-plus+ wangEditor 富文本编辑器+前端七牛云上传

    我用的vue3,element-plus ,没用ts 搭建wangEditor 参考 地址 https://www.cnblogs.com/xbxxf/p/16791084.html 七牛云安装参考地 ...

  9. Vue使用:style动态给css中某样式赋值

    template中 <span class="successOrError" :style="{'--fontColor':"green"}&q ...

  10. 2021-04-25:给定一个数组arr,和一个正数M,返回在arr的子数组在长度不超过M的情况下,求最大的累加和。

    福大大 答案2021-04-25: 前缀和+左大右小的双端队列.时间太晚了,所以写得简单. 代码用golang编写.代码如下: package main import ( "containe ...