点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复杂和难以理解的,这篇文章就是为了帮助大家加深对这 histogram 类型指标的理解。

>>阿里云8月最新优惠,点击查看<<

1. 什么是 Histogram?

根据上篇文档,Histogram 会在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中。但这句话还是不太好理解,下面通过具体的示例来说明。

假设我们想监控某个应用在一段时间内的响应时间,最后监控到的样本的响应时间范围为 0s~10s。现在我们将样本的值域划分为不同的区间,即不同的 bucket,每个 bucket 的宽度是 0.2s。那么第一个 bucket 表示响应时间小于等于 0.2s 的请求数量,第二个 bucket 表示响应时间大于 0.2s 小于等于 0.4s 的请求数量,以此类推。


Prometheus 的 histogram 是一种累积直方图,与上面的区间划分方式是有差别的,它的划分方式如下:还假设每个 bucket 的宽度是 0.2s,那么第一个 bucket 表示响应时间小于等于 0.2s 的请求数量,第二个 bucket 表示响应时间小于等于 0.4s 的请求数量,以此类推。也就是说,每一个 bucket 的样本包含了之前所有 bucket 的样本,所以叫累积直方图。


2. 为什么是累积直方图?

上节内容告诉我们,Prometheus 中的 histogram 是累积的,这是很奇怪的,因为通常情况下非累积的直方图更容易理解。Prometheus 为什么要这么做呢?

想象一下,如果 histogram 类型的指标中加入了额外的标签,或者划分了更多的 bucket,那么样本数据的分析就会变得越来越复杂。如果 histogram 是累积的,在抓取指标时就可以根据需要丢弃某些 bucket,这样可以在降低 Prometheus 维护成本的同时,还可以粗略计算样本值的分位数。通过这种方法,用户不需要修改应用代码,便可以动态减少抓取到的样本数量。

假设某个 histogram 类型指标的样本数据如下:


现在我们希望 Prometheus 在抓取指标时丢弃响应时间在 100ms 以下的 bucket,就可以通过下面的 relabel 配置来实现:


其中,example_latency_seconds_bucket 用来匹配标签 __name__ 的值,'0.0.*' 用来匹配标签 le 的值,即 le 的值为 0.0x。然后将匹配到的样本丢弃。

通过这种方法,你可以丢弃任意的 bucket,但不能丢弃 le="+Inf" 的 bucket,因为 histogram_quantile 函数需要使用这个标签。

另外 histogram 还提供了 _sum 指标和 _count 指标,即使你丢弃了所有的 bucket,仍然可以通过这两个指标值来计算请求的平均响应时间。

通过累积直方图的方式,还可以很轻松地计算某个 bucket 的样本数占所有样本数的比例。例如,想知道响应时间小于等于 1s 的请求占所有请求的比例,可以通过以下公式来计算:

example_latency_seconds_bucket{le="1.0"} / ignoring (le) example_latency_seconds_bucket{le="+Inf"}

3. 分位数计算

Prometheus 通过 histogram_quantile 函数来计算分位数(quantile),而且是一个预估值,并不完全准确,因为这个函数是假定每个区间内的样本分布是线性分布来计算结果值的。预估的准确度取决于 bucket 区间划分的粒度,粒度越大,准确度越低。以下图为例:


假设有 10000 个样本,第 9501 个样本落入了第 8 个 bucket。第 8 个 bucket 总共有 368 个样本,其中第 9501 个样本在该 bucket 中属于第 93 个样本。

根据 Prometheus 源代码文件 promql/quantile.go 第 108 行的公式:

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

我们可以计算(quantile=0.95)的样本值为:


这个值已经很接近精确的分位数值了。关于 histogram_quantile 函数的详细使用方式,请参考:PromQL 内置函数。

4. 总结

本文主要介绍了 histogram 的工作原理以及分位数的计算方法,相信通过本文的抛砖引玉,大家应该对 Prometheus 的 histogram 有了更深一步的了解,下篇文章将会为大家呈现 Summary 的工作方式。

5. 参考资料

  • Prometheus and Histograms

留言交流不过瘾?添加微信:zyc_enjoy

根据指引加入各种主题讨论群

每日一问

今日问题

这个迷宫很有趣,你只能沿着给定的方向走,请问从开始到结束,一共有多少条不同的路线可走?

(留言说说你的答案吧,明日推文公布答案)

昨日答案:B

解析:每组图形中,第一个图形由第二个图形和第三个图形组合而成,只有 B对符合规律。(估计有小伙伴会选C,注意看第二组第二个图形的底部)

(昨日问题可在昨日推文的文末查看)

推荐阅读

  • Spring Boot + Redis 实现接口幂等性

  • 百万年薪挖了个P8程序员,难道是“水货”?

  • 你必须收藏的Github技巧

  • 开发部署提速8倍!这款IDE插件了解一下?

  • 攻破MySQL性能瓶颈必知的调优技巧

来星球聊聊技术人的斜杠生活

点一点“阅读原文”小惊喜在等你

一文搞懂 Prometheus 的直方图相关推荐

  1. 一文搞懂 Prometheus 多集群监控神器 Thanos

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 1介绍 在本文中,我们将看到Prometheus监控技术栈的局限性,以及为什么移动到基于Thanos的技术栈可以提 ...

  2. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  3. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  4. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  5. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  6. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

  7. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  8. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

    本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...

  9. 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下

    B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...

最新文章

  1. python PyQt5 QPixmap()控件
  2. crc可以检出奇数个错误_计算机网络最新章节_陈虹著_掌阅小说网
  3. 数据库系统优化--业务逻辑设计优化
  4. TF实战:(Mask R-CNN原理介绍与代码实现)-Chapter-8
  5. java初学者适用项目_有哪些适合java初学者的项目?
  6. Linux内核协议栈分析之——tcp/ip通信并不神秘
  7. 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!
  8. 核心JavaScript(一):数据类型与变量之Number再探
  9. Eprime的txt数据转换为excel
  10. 校准 Linux 服务器的时间
  11. 宾馆管理系统java外文文献_javaEE酒店管理系统论文+任务书+设计源码+答辩PPT
  12. 软件安装管家matlab教程,timesat软件怎么安装 timesat安装使用图文教程 - 驱动管家...
  13. 赠人玫瑰,手有余香,今日份黑科技软件五款奉上
  14. 动态规划——1296:开餐馆
  15. 美国FICO评分系统简介
  16. 阿里飞冰的介绍以及使用
  17. R语言logistic回归的细节解读
  18. xgboost在LTR(学习排序)中的应用
  19. 1054:分数加减法
  20. [转] 人生“三重境界”和“四种大智慧”

热门文章

  1. 代码审查工具 sonarqube 简介
  2. linux yum配置文件 yum.conf 简介
  3. python3 list 列表 倒序
  4. python flask 设置 header 响应体、响应头、状态码
  5. mysql update多个字段 逗号 and 的错误例子
  6. Linux下的权限掩码umask
  7. Medusa(美杜莎)和Hydra(九头蛇)快速入门手册:01
  8. windbg-.process切换进程
  9. Linux Shell脚本攻略学习总结:二
  10. linux进程管理之进程创建