写点什么

深入理解 Metrics(三):Histograms

作者:冰心的小屋
  • 2022-11-10
    上海
  • 本文字数:1146 字

    阅读完需:约 4 分钟

深入理解Metrics(三):Histograms

上期的文章中介绍了 Counters 的使用,本章会继续讲解 Metrics 的第三个工具:Histograms。

1. Histograms 的使用

Histograms 常用来统计数据的分布,除基本的最小值、最大值、平均值和中值,还可以进行百分比的分布统计例如:TP75、TP90 和 TP99 等。 

account 使用 Histograms 统计一段时间内鉴权接口处理时间的百分比分布,代码如下:

通过输出的结果可观测权接口响应时间分布。

2. Histograms 的层次结构

Histogram 实现了接口 Sampling 获取快照的功能,快照其实就是一个 Snapshot 类的实例,可以获取到当前时刻的最大值、最小值、平均值和标准差等。 Histogram 进行构造时必须传入 Reservoir 接口的实例, Reservoir 是数据抽样的方式,Metrics 提供了数据抽样的多种实现方式,开发者可以根据实际情况选择。

3. 数据抽样方式

Metrics 提供了数据抽样的多种实现方式,让我们来一起了解下。

3.1 ExponentiallyDecayingReservoir

基于指数级别的抽样算法,根据更新时间与开始时间的差值转化为权重值,权重越大数据被保留的几率越大。 内部使用 ConcurrentSkipListMap 并发跳表来存储数据,ConcurrentSkipListMap 是基于键 priority 排序的,下面是 priority 的计算方式:

为了便于理解,使用 R 语言输出的散点图来模拟基于时间的 priority 的分布,x 轴为时间序列单位秒,y 轴为 priority。

这里面 alpha 设置成 0.75,输出的散点图:

当 alpha 为 0.015 时:

总结:从以上散点图的输出情况可以看出,ExponentiallyDecayingReservoir 更加倾向于最新的数据。

3.2 UniformReservoir

随机抽样,随着更新次数的增加,数据被抽样的几率减少。

以下散点图用于验证数据抽样的概率,x 轴为更新次数,y 轴为随机产生的索引下标。

3.3 SlidingWindowReservoir

内部使用 long 数组存储数据,数据是否被抽样取决于当前更新总次数与 long 数据组长度的余数,即总是保留最后统计的数据。

3.4 SlidingTimeWindowReservoir 

只抽样最近时间段的数据。 

内部使用 ConcurrentSkipListMap 跳表存储,对于统计数据永远都会添加到跳表中,当更新总次数是 256 的倍数时会根据最近时间段执行 trim 操作。

3.5 SlidingTimeWindowArrayReservoir 

尽可能的保留统计数据,在输出快照时才会根据最近时间段进行 trim 操作。 

最终对于数据的存储使用的是 LinkedList,LinkedList 内元素的类型是 Chunk,Chunk 是用来存储数据的最小单位,内部维护着一个数组和数组已填充的游标。

4. 结束语

你可以自定义实现数据的抽样方式,不仅仅局限于 Metric 提供的几种。本章已经完成了 Histograms 的讲解,童鞋们还不赶紧来试试。


深入理解 Metrics 系列文章:

深入理解 Metrics(一):Gauges

深入理解 Metrics(二):Counters

深入理解 Metrics(三):Histograms

深入理解 Metrics(四):Meters

深入理解 Metrics(五):Timers


发布于: 2022-11-10阅读数: 50
用户头像

分享技术上的点点滴滴! 2013-08-06 加入

一杯咖啡,一首老歌,一段代码,欢迎做客冰屋。

评论

发布
暂无评论
深入理解Metrics(三):Histograms_Java_冰心的小屋_InfoQ写作社区