Metrics的Histogram配置参数

这篇是之前监控工具——Metrics 快速入门的补充

代码地址

因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出了部分代码。全部的代码在这里: https://gitee.com/daifyutils/springboot-samples。

此篇文章所属模块为:base-metrics

Histogram

在使用Histogram进行指标统计的时候,可以看到其支持一个Reservoir类型的参数

    public Histogram(Reservoir reservoir) {this.reservoir = reservoir;this.count = LongAdderProxy.create();}

通过查看可以看到此参数支持的实现类有5种

ExponentiallyDecayingReservoir

基于指数级别的抽样算法,根据更新时间与开始时间的差值转化为权重值,权重越大数据被保留的几率越大。 内部使用ConcurrentSkipListMap并发跳表来存储数据。它的大小没有限制,因此使用它对高频过程进行采样可能需要大量内存。因为它记录了每次测量。

使用方式

Histogram histogram = new Histogram(new ExponentiallyDecayingReservoir());

使用这种方法可能会有内存问题,官方文档专门提醒过这个问题

While SlidingTimeWindowReservoir is easier to understand than ExponentiallyDecayingReservoir, it is not bounded in size, so using it to sample a high-frequency process can require a significant amount of memory. Because it records every measurement, it’s also the slowest reservoir type.

UniformReservoir

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

使用方式

Histogram histogram = new Histogram(new UniformReservoir());
或者Histogram histogram = new Histogram(new UniformReservoir(1028));

SlidingWindowReservoir

只存最近N条数据的一种采样的指标分析模式

使用方式

    public static void main(String[] args) throws InterruptedException {initMetric();// SlidingWindowReservoir(只存最近N条数据)// 注册一个HistogramHistogram histogram = new Histogram(new SlidingWindowReservoir(10));registry.register(MetricRegistry.name(HistogramsTest.class, "request", "histogram"), histogram);int i = 0;while(true){Thread.sleep(1000);i++;System.out.println(((i/10) + 1) * 100000);histogram.update(((i/10) + 1) * 100000);}}

最开始输出内容

-- Histograms ------------------------------------------------------------------
dai.samples.metrics.HistogramsTest.request.histogramcount = 9min = 100000max = 100000mean = 100000.00stddev = 0.00median = 100000.0075% <= 100000.0095% <= 100000.0098% <= 100000.0099% <= 100000.0099.9% <= 100000.00

最后输出内容

dai.samples.metrics.HistogramsTest.request.histogramcount = 19min = 200000max = 200000mean = 200000.00stddev = 0.00median = 200000.0075% <= 200000.0095% <= 200000.0098% <= 200000.0099% <= 200000.0099.9% <= 200000.00

SlidingTimeWindowReservoir

只记录最近的指定时间范围的指标分析模式

使用方式

    public static void main(String[] args) throws InterruptedException {initMetric();// SlidingTimeWindowReservoir(指定时间窗口重置数据)// 注册一个HistogramHistogram histogram = new Histogram(new SlidingTimeWindowReservoir(10,TimeUnit.SECONDS));registry.register(MetricRegistry.name(HistogramsTest.class, "request", "histogram"), histogram);int i = 0;while(true){Thread.sleep(1000);i++;System.out.println(((i/10) + 1) * 100000);histogram.update(((i/10) + 1) * 100000);}}

最开始输出内容

-- Histograms ------------------------------------------------------------------
dai.samples.metrics.HistogramsTest.request.histogramcount = 9min = 100000max = 100000mean = 100000.00stddev = 0.00median = 100000.0075% <= 100000.0095% <= 100000.0098% <= 100000.0099% <= 100000.0099.9% <= 100000.00

最后输出内容

dai.samples.metrics.HistogramsTest.request.histogramcount = 19min = 200000max = 200000mean = 200000.00stddev = 0.00median = 200000.0075% <= 200000.0095% <= 200000.0098% <= 200000.0099% <= 200000.0099.9% <= 200000.00

SlidingTimeWindowArrayReservoir

SlidingTimeWindowArrayReservoir是对SlidingTimeWindowReservoir的优化。根据官方描述SlidingTimeWindowArrayReservoir提供了更低的内存开销。其GC开销比SlidingTimeWindow低60-80倍

使用方式

Histogram histogram = new Histogram(new SlidingTimeWindowArrayReservoir(1,TimeUnit.MINUTES));

对于其使用所需内存官方提供了相关的例子

Example: 10K measurements / sec with reservoir storing time of 1 minute will take 10000 * 60 * 128 / 8 = 9600000 bytes ~ 9 megabytes

Timer

Timer提供了直方图的相关数据分析,其内部也初始化了一个Histogram

Timer timer = registry.timer(MetricRegistry.name(TimersTest.class,"get-latency"));

默认情况下其初始化的Timer使用ExponentiallyDecayingReservoir

MetricBuilder<Timer> TIMERS = new MetricBuilder<Timer>() {@Overridepublic Timer newMetric() {return new Timer();}@Overridepublic boolean isInstance(Metric metric) {return Timer.class.isInstance(metric);}};public Timer() {this(new ExponentiallyDecayingReservoir());}       

明白上面不同的参数类型我们可以在使用Timer的时候使用需要的Reservoir

public class ReservoirTimersTest extends MetricBase {public static Random random = new Random();public static void main(String[] args) throws InterruptedException {initMetric();MetricRegistry.MetricSupplier metricSupplier = () -> new Timer(new SlidingTimeWindowReservoir(1,TimeUnit.MINUTES));Timer timer = registry.timer(MetricRegistry.name(TimersTest.class,"get-latency"),metricSupplier);Timer.Context ctx;while(true){ctx = timer.time();Thread.sleep(random.nextInt(1000));ctx.stop();}}}

监控工具——Metrics的Histogram可配置项相关推荐

  1. 监控工具——Metrics 快速入门

    Metrics 快速入门 关于Metrics更多的内容可以查看 metrics-getting-started 代码地址 因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出 ...

  2. java度量页面_JAVA Metrics 度量工具使用介绍1

    Metrics是一个给JAVA提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同一时候,Metrics可以非常好的跟Ganlia.Graphite结合 ...

  3. Yammer Metrics实现服务指标收集与监控

    1.用途 可以对应用程序的运行状态以及各种指标进行收集. 2.官网地址 https://metrics.dropwizard.io/2.2.0/manual/core/ 3.yammer metric ...

  4. JAVA Metrics 度量工具使用介绍1

    Java Metric使用介绍1 Metrics是一个给JAVA提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同一时候,Metrics可以非常好的跟 ...

  5. Yammer Metrics的使用

    Yammer Metrics简介 最近用到的某个框架,其官网提到利用Yammer Metrics来测量系统运行状态,需要对其统计的具体参数有个基本的了解,OK,那就需要弄清几个简单的问题: Yamme ...

  6. 利用AppMetrics对Web进行监控教程

    一.基础准备 1. 安装依赖 这里可以通过nuget或使用命令行进行安装,具体需要安装的类库如下(注意版本): Install-Package App.Metrics.AspNetCore.Mvc - ...

  7. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)

    本文为 TiKV 源码解析系列的第四篇,接上篇继续为大家介绍 rust-prometheus.上篇主要介绍了基础知识以及最基本的几个指标的内部工作机制,本篇会进一步介绍更多高级功能的实现原理. 与上篇 ...

  8. 使用python读取kafka实时topic数据demo,包括安装kafka module

    1. 安装kafka module kafka-python安装,转载:https://blog.csdn.net/see_you_see_me/article/details/78468421 1. ...

  9. 学习ebpf_exporter项目搞懂prometheus client端的全调度

    bpf碰上prometheus 简介 bpf_exporter的完整调度流程: 组成模块 导入和配置 采集数值 数据落盘 http调度 代码分析--重点模块 exporter结构解析 定位数据采集区 ...

最新文章

  1. 派生类参数初始化列表和基类构造函数顺序
  2. monty python喜剧-经典喜剧电影推荐:巨蟒与圣杯
  3. UNL/EVE关联putty和wireshark
  4. Java培训教程之使用Lock取代synchronized
  5. HibernateNONSTRICT_READ_WRITE CacheConcurrencyStrategy如何工作
  6. MVC中使用代码创建数据库(code first +mysql+EF)
  7. C++新特性探究(九):functor仿函数
  8. c# 执行js的方法
  9. Android之提交数据到服务端方法简单封装
  10. java公司自己封装的框架_SpringBoot封装自己的Starter的实现方法
  11. IDEA(2018)导入项目报错解决方案
  12. RPG Maker MV常用的一些插件
  13. GfK十大洞见揭示物联网时代正全面开启
  14. matlab catia程序,利用VBA进行CATIA二次开发的基本流程 | 坐倚北风
  15. 分享学JavaScript的第七天
  16. Kafka源码研究--Comsumer获取partition下标
  17. stc单片机如何用C程序将IO口设为强推挽输出
  18. nofollow标签使用方法
  19. 使用Github+Markdown搭键自己的笔记本
  20. Python——循环嵌套

热门文章

  1. ac自动机 匹配最长前缀_AC自动机算法
  2. 永洪科技邵文龙:唯有不断打磨产品才能提供更好的服务
  3. i2c协议解读(附读写过程c代码)
  4. NumberUtils简单介绍和具体实例
  5. Emlog程序小刀娱乐网同款顶踩插件
  6. 科目一科目四驾驶理论考试哈语版
  7. Qt开源作品27-鼠标定位十字线
  8. 棋盘覆盖(分治典例)
  9. 保护个人隐私视频文件加密方法两小招
  10. ANTLR4(十) 内嵌代码之计算器