prometheus Histogram 统计原理
大家好,我是蓝胖子,书接上文,我在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 统计原理的更多相关文章
- Monitor Minio server with Prometheus
转自:https://blog.minio.io/monitor-minio-server-with-prometheus-4ed537abcb74 Prometheus is an open sou ...
- openresty(完整版)Lua拦截请求与响应信息日志收集及基于cjson和redis动态路径以及Prometheus监控(转)
直接上文件 nginx.conf #运行用户和组,缺省为nobody,若改为别的用户和组,则需要先创建用户和组 #user wls81 wls; #开启进程数,一般与CPU核数等同 worker_pr ...
- 用prometheus监控Nginx
GitHub上官方地址:https://github.com/knyar/nginx-lua-prometheus 告警规则地址:https://awesome-prometheus-alerts.g ...
- 如何区分prometheus中Histogram和Summary类型的metrics?
要理解它们的区别,关键还是告业务应用. 但如何在学习时,如何区分呢? 有以下几个维度: histogram有bucket,summary在quatile. summary分位数是客户端计算上报,his ...
- Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!
Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...
- Prometheus 系统监控方案 一
最近一直在折腾时序类型的数据库,经过一段时间项目应用,觉得十分不错.而Prometheus又是刚刚推出不久的开源方案,中文资料较少,所以打算写一系列应用的实践过程分享一下. Prometheus 是什 ...
- prometheus client_golang使用
序言 Prometheus是一个开源的监控系统,拥有许多Advanced Feature,他会定期用HTTP协议来pull所监控系统状态进行数据收集,在加上timestamp等数据组织成time se ...
- Prometheus(转载)
Prometheus 系统监控方案 一 https://www.cnblogs.com/vovlie/p/Prometheus_CONCEPTS.html 最近一直在折腾时序类型的数据库,经过一段时间 ...
- Prometheus监控数据格式学习
本文大纲: • prometheus metrics的概念• k/v的数据形式• prometheus exporter的使⽤(pull形式采集数据)• prometheus pushgateway的 ...
- prometheus监控示例
prometheus架构图 prometheus 各组件介绍 Prometheus Server: 使用pull方式采集监控数据,在该组件上配置监控数据的采集和告警规则. Client Library ...
随机推荐
- Centos7 安装 codeblocks 搭建 C++ 集成开发环境
1 安装GCC和G++ yum install gcc yum install gcc-c++ 2 安装gtk-devel 默认没有安装开发所需要的文档 yum install gtk* 3 安装wx ...
- 部署:mysql搭建多主一从源复制环境
问题描述:搭建过一主多从的环境,由于数据库数据一致性要求高,有些情景会搭建一主多从的架构,搭建多主一从的模式,相对来说适合数据整合,将多个业务的库整合到一起,方便做查询,也可以当做一个监控其他主库数据 ...
- mysql迁移:mysqldump导出表结构及数据
问题描述:有需要mysql某几张表的需求,某个数据库某几张表,导出先检查相应的数据库和表是否存在 数据泵用法:默认导出的是表结构以及表中的数据 mysqldump -uroot -p -S /data ...
- 用CMD或者bat修改host文件
第一行代码标识 取消host的只读属性 第二行写入 attrib -R C:\WINDOWS\system32\drivers\etc\hosts @echo 127.0.0.1 baidu.com ...
- YII2.0框架分页
这篇文章主要介绍了Yii分页用法,以实例形式详细分析了比较常见的几种分页方法及其应用特点,非常具有实用价值,需要的朋友可以参考下: 在这里我主要联查的 book 表和 book_press 两张表进行 ...
- 一文吃透Elasticsearch
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- jmap执行失败了,怎么获取heapdump?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题. 但当我反复模拟OO ...
- vue2中使用composition-api
vue2中使用composition-api https://juejin.cn/post/6874927606820274184 vue3.0 watch 函数 https://www.jiansh ...
- RMQ问题ST表
稀疏表(Sparse Table表) 解决静态RMQ,区间最值查询问题的数据结构,树状数组(BIT)解决动态前缀和问题的数据结构: 例:https://www.luogu.org/problemnew ...
- 2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k
2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false. 1 <= n, q <= 1 ...