##直方图和百分位##
Timer 和 Distribution summaries 支持收集数据用于展示它们的百分位分布, 有两种主要的方法用于浏览百分位
Percentitle histogram - Micrometer 会累积直方图的基础值,并且将准备好的一系列bucket运送往监控系统, 监控系统的查询语句可以从该柱状图中计算出百分位.现在, 只有Promethues和Atlas支持基于Histogram的百分位近似值计算, 分别是histogram_quantitle 和 :percentile, 如果是针对prometheus或者是Atlas, 更加建议使用这种下面这种方式, 因为你可以通过跨维度聚合直方图(简单的将一组维度中bucket的值简单的相加) 然后从直方图中推导聚合出百分位
Client-side percentiles - Micrometer计算出每个meterID(以name和tags确定唯一性)的百分位近似值,然后把百分位的值运送到监控系统, 这一点没有percentile histogram来的灵活,因为它没有办法根据tags聚合出百分位近似值, 不过, 它提供了一些更深入的直方图分布的方式,这是在服务端进行基于直方图的百分位计算所不具备的.
下面是使用timer的方式创建直方图的案例:
1 | Timer.builder("my.timer") |
publishPercentiles - 用于发布你应用中计算出来的百分位, 不支持多维度的聚合
publishPercentileHistogram - 用于发布直方图, 适用于计算聚合(多维度)百分位近似值,在prometheus中用histogram_quantile,在Atlas中用:percentile. 直方图结果中的buckets,由micrometer预先生成,基于生成器,根据Netflix的经验来确定的,以产生大多数合理的误差界限,在大多数现实世界的timers和distribution summaries. 生成器默认会产生276个buckets,但是micrometer只会将那些范围在minimumExpectedValue 和maximumExpectedValue之内的发送给监控系统, 同时, micrometer所产生的时间范围会在1毫秒到1分钟之间, 每个时间维度产生73个柱状图的bucket, publishPercentileHistogram对于那些不支持聚合百分位近似值计算的系统来说,是不会生效的.
sla - 使用SLA定义的存储桶发布累积直方图, 用于和参数publishPercentileHistogram在监控系统中做协调, 以支持聚合百分位, 这个设置会增加额外的buckets以发布histogram, 用于那些不支持聚合百分位的系统,这个设置可以发布仅拥有这些buckets的直方图.
minimumExpectedValue/maximumExpectedValue 控制由publishPercentileHistogram产生的buckets的数,也可以用来控制精度和潜在Hdr直方图结构的memory footprint.
每次发送百分位数据到监控系统中时会产生额外的时间序列, 通常建议是不是把他们配置在核心组件中,而是应该作为程序中的依赖项,相反,应用可以通过meter filter来打开这些timers/distribution summaries的开关
举例,假设我们有一些timers在基础包里面,这些timer名字的前缀叫myservice:
1 | registry.timer("myservice.http.requests").record(..); |
我们可以通过meter filter的方式打开客户端方式的百分位统计
1 | We can turn on client-side percentiles for both timers via a meter filter: |