直方图度量流式数据中值的分布情况,引用《Java library documentation》
直方图度量不仅允许您测量简单数值,如最小值,平均值,最大值和标准差的值,而且可以测量如中位数或第95个百分点这样的分位数。
传统上,计算中位数(或任何其他分位数)的方式是将整个数据集进行排序,从中间(或从最后的1%,第99个百分点)中取值。 这适用于小数据集或批处理系统,但不适用于高吞吐量,低延迟服务。
解决方案是在数据采集时对数据进行采样。 通过维护一个统计上代表整个流式数据的小型,可管理的容器,我们可以快速简便地计算分位数,这些分位数是实际分位数的有效近似值。 这种技术被称为蓄水池抽样。
直方图样例代码
private readonly Histogram histogram = Metric.Histogram("Search Results", Unit.Items);
public void Search(string keyword)
{
var results = ActualSearch(keyword);
histogram.Update(results.Length);
}
提供开箱即用的三种采样类型:
- 指数衰减抽样 - 产生分位数,表示最后五分钟(大约)的数据
- 平均抽样 - 产生的分位数在整个直方图的生命周期内都是有效的
- 滑动窗口抽样 - 产生代表过去N次测量的分位数
有关抽样类型的更多信息可以在Java库的文档中找到
跟踪用户的值
直方图能够跟踪记录用户值中的最小值,最大值或最后一个值。 用户值可以是任何字符串值(documentId,operationId等)。
下例直方图将记录哪个被操作的documentId返回了最多的条目:
public class UserValueHistogramSample
{
private readonly Histogram histogram =
Metric.Histogram("Results", Unit.Items);
public void Process(string documentId)
{
var results = GetResultsForDocument(documentId);
this.histogram.Update(results.Length, documentId);
}
}
运行一些请求后,文本格式的直方图输出如下所示:
Results
Count = 90 Items
Last = 46.00 Items
Last User Value = document-3
Min = 2.00 Items
Min User Value = document-7
Max = 98.00 Items
Max User Value = document-4
Mean = 51.52 Items
StdDev = 30.55 Items
Median = 50.00 Items
75% <= 80.00 Items
95% <= 97.00 Items
98% <= 98.00 Items
99% <= 98.00 Items
99.9% <= 98.00 Items
正如您可以看到直方图记录了最小值(2项)属于文档-7,最大值(98项)属于文档-4,最后一个值(46项)属于文档-3。