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 ...
随机推荐
- elasticsearch 官方优化建议
1.一般建议 a.不要返回过大的结果集.这个建议对一般数据库都是适用的,如果要获取大量结果,可以使用search_after api,或者scroll (新版本中已经不推荐). b.避免大的文 ...
- 【Note】倍增
真的不会.QAQ 目录 简介 大家都见过的应用:倍增求 \(\text{LCA}\) 倍增求 \(\text{LCA}\) ,但是动态加点,但是不会 \(lct\) 例题:[ZJOI2012]灾难(D ...
- Golang一日一库之logrus
前言 之前一篇文章介绍了 日志库zap https://www.cnblogs.com/zichliang/p/17311480.html 毋庸置疑,zap库无论是Golang在项目中 还是生产中都极 ...
- 最新版本 Stable Diffusion 开源 AI 绘画工具之中文自动提词篇
目录 标签生成器 提示词自动补全 标签生成器 由于输入正向提示词 prompt 和反向提示词 negative prompt 都是使用英文,所以对学习母语的我们非常不友好 使用网址:https://t ...
- 零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程。
零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程. 1.通用文本分类技术UTC介绍 本项目提供基于通用文本分类 UTC(Universal Text C ...
- ArrayList实现原理和自动扩容
ArrayList在Java集合中的位置, ArrayList原理: transient Object[] elementData; ArrayList通过数组来实现. 默认构造方法会构造一个容量为1 ...
- Ansible 常用基础模块
Ansible 常用基础模块 目录 Ansible 常用基础模块 Ansible的执行 Ansible ad-hoc ad-hoc模式的使用场景 ad-hoc模式的命令使用 ad-hoc结果返回颜色 ...
- 2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}。 packag
2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}. packag ...
- 2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上
2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种.arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左:arr[i] == 2,代表汉诺塔问题中,从上 ...
- Django 14天从小白到进阶- Day1 Django 初识
来自作者:金角大王 本节内容 Http原理介绍 自行开发一个Web框架 WSGI介绍 Django介绍 MVC/MTV Django安装 创建项目与APP 开发第一个页面 为什么学Django? Go ...