prometheus Histogram 统计原理

prometheus,histogram,统计,原理 · 浏览次数 : 268

小编点评

**结论:** rate函数会影响histogram_quantile的计算方法,因为它会改变桶的大小。尽管rate函数将桶的统计数变小,但由于计算时仅求一个比例值,所以分位数的结果依然与使用count值进行计算的方式相同。

正文

大家好,我是蓝胖子,书接上文,我在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 统计原理相似的内容:

prometheus Histogram 统计原理

大家好,我是蓝胖子,书接上文,我在[prometheus描点原理](https://mp.weixin.qq.com/s/5Y_pCPIJcRpIlqhdtb3XBw)那一篇文章里,留了一个思考题: 我们通常会用到histogram_quantile去计算服务接口时间的耗时情况。 ```shell

深入理解Prometheus: Kubernetes环境中的监控实践

在这篇文章中,我们深入探讨了Prometheus在Kubernetes环境中的应用,涵盖了从基础概念到实战应用的全面介绍。内容包括Prometheus的架构、数据模型、PromQL查询语言,以及在Kubernetes中的集成方式、监控策略、告警配置和数据可视化技巧。此外,还包括针对不同监控场景的实战

深入解读Prometheus Adapter:云原生监控的核心组件

本文详述了Prometheus Adapter的部署与配置,通过三个实践案例展示其在Kubernetes环境中的应用,帮助用户实现基于自定义指标的自动扩展和跨集群统一监控。 关注作者,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验

一分钟部署prometheus&grafana全方面监控SpringBoot项目

0x01 创建目录 找一个你喜欢的地方,创建项目根目录 example: [root@demo-78 ~]# mkdir /data/prometheus 0x02 创建配置文件 进入到项目根目录: [root@demo-78 ~]# cd /data/prometheus 需要新建三个文件,分别是

Prometheus及Grafana监控服务的安装使用

说明 Prometheus 是一个开放性的监控解决方案,通过 Node Exporter 采集当前主机的系统资源使用情况,并通过 Grafana 创建一个简单的可视化仪表盘。 docker 安装 prometheus(未持久化数据) docker run -d \ -p 9090:9090 \ -v

[转帖]Prometheus + Spring Boot 应用监控

https://blog.51cto.com/u_15127622/2757942 1. Prometheus是什么Prometheus是一个具有活跃生态系统的开源系统监控和告警工具包。一言以蔽之,它是一套开源监控解决方案。Prometheus主要特性:多维数据模型,其中包含由指标名称和键/值对标识

[转帖]Prometheus+Grafana+rabbitmq_prometheus 监控 RabbitMQ

https://www.zhangbj.com/p/1065.html 关于 rabbitmq_prometheus rabbitmq_prometheus是RabbitMQ 3.8.0默认集成的监控插件。 相关文档 https://www.rabbitmq.com/monitoring.html

[转帖]【Windows 10】Prometheus监控平台安装以及配置windows Exporter探针

Prometheus 简介 Prometheus是一个开放性的监控解决方案,用户可以非常方便的安装和使用Prometheus并且能够非常方便的对其进行扩展。 在Prometheus的架构设计中,Prometheus Server并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数

[转帖]Prometheus的Exporter详解

https://www.cnblogs.com/lizexiong/p/15578427.html 导航:这里主要是列出一个prometheus一些系统的学习过程,最后按照章节顺序查看,由于写作该文档经历了不同时期,所以在文中有时出现 的云环境不统一,但是学习具体使用方法即可,在最后的篇章,有一个完

[转帖]prometheus部暑redis_exporter(sentinel, cluster实战)

redis_exporter #创建工作目录 mkdir /date/redis -p cat > /data/redis/start.sh << 'EOF' docker run -d \ --name redis \ -p 6379:6379 \ redis redis-server \ --a