[Metrics扫盲]---(1)如何在java应用中使用Metrics

Author:赵志乾
Date:2019-01-26
Declaration:All Right Reserved!!!

该部分内容主要介绍如何在一个java应用中引入Metrics,以及Metrics所提供各种度量工具的使用方式。

 

1、引入metrics-core包

java应用开发过程中,通常都会使用构建工具。以Maven构建工具为例,需要在项目的POM文件中引入metrics-core依赖,如下:

<dependencies>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>3.1.0</version>
    </dependency>
</dependencies>

2、MetricRegistry实例化

MetricRegistry.class作为Metrics的核心,充当度量指标容器,主要负责metric的创建、管理、维护。所以在应用中首先要实例化这样一个容器。如下:

static final MetricRegistry metrics = new MetricRegistry();

注:或许我们希望通过依赖注入框架,将其纳入Bean生命管理周期,但最佳实践是将其实例化为一个静态字段。

3、ConsoleReporter实例化

ConsoleReporter.class是Metrics中最简单的一种报表输出方式。其功能就像类名一样,通过控制台打印报表信息。该类的实例需要关联到一个具体的度量指标容器,从而完成容器已注册度量指标的报表输出。如下:

//构建控制台报表输出器,其关联容器metrics
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
       .convertRatesTo(TimeUnit.SECONDS)
       .convertDurationsTo(TimeUnit.MILLISECONDS)
       .build();

// 启动报表输出,输出间隔时间为1秒
reporter.start(1, TimeUnit.SECONDS);

4、演示代码

注:后续各度量类型演示中将只给出下面代码中由*号包围的部分。

package com.metrics;

import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.MetricRegistry;

import java.util.concurrent.TimeUnit;

public class Main {
    // 实例化MetricRegistry,充当metric的容器
    static final MetricRegistry metrics = new MetricRegistry();

    public static void main(String[] args){
        // 启动报表输出
        startReport();
        //********************* 
        //    TODO 测量的metric
        //*********************
        // 应用睡眠2秒
        wait2Seconds();
    }

    static void startReport() {
        ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .build();
        reporter.start(1, TimeUnit.SECONDS);
    }

    static void wait2Seconds() {
        try {
            Thread.sleep(2*1000);
        }
        catch(InterruptedException e) {}
    }

}

*************************************************************************************************************************************

演示实例:

1、MetricRegistry容器中没有度量指标时,输出结果如下。可以看出,容器中无度量指标时,报表输出只有时间信息。

2019/1/26 下午7:39:22 ============================================================


2019/1/26 下午7:39:23 =================================================

2、Meter度量

Meter度量类型用于度量时间发生率,如每秒多少次。除了平均发生率之外,其还会同时测量1分钟、5分钟和15分钟的移动平均发生率。代码如下:

// 在容器中注册一个名称为requests的meter
Meter requests = metrics.meter("requests");
// 事件发生次数加1
requests.mark();

输出结果如下,可以看出,事件发生1次,从测量开始,第一秒平均发生率为1/1=1,第2秒发生率为1/2=0.5(注:存在计算误差)

2019/1/26 下午7:47:29 ============================================================

-- Meters ----------------------------------------------------------------------
requests
             count = 1
         mean rate = 1.00 events/second
     1-minute rate = 0.00 events/second
     5-minute rate = 0.00 events/second
    15-minute rate = 0.00 events/second


2019/1/26 下午7:47:30 ============================================================

-- Meters ----------------------------------------------------------------------
requests
             count = 1
         mean rate = 0.51 events/second
     1-minute rate = 0.00 events/second
     5-minute rate = 0.00 events/second
    15-minute rate = 0.00 events/second

3、Guage度量

Guage度量类型是单个值的瞬时值测量。即测量时刻,测量值是多少。代码如下:

 // 在容器中注册一个名叫com.metrics.Main.time的gauge度量指标
 metrics.register(MetricRegistry.name(Main.class, "time"),
     new Gauge<Long>() {
         // 该度量指标的值为系统当前时间
         public Long getValue() {
             return System.currentTimeMillis();
         }
     });

输出结果如下:

2019/1/26 下午8:08:30 ============================================================

-- Gauges ----------------------------------------------------------------------
com.metrics.Main.time
             value = 1548504510822


2019/1/26 下午8:08:31 ============================================================

-- Gauges ----------------------------------------------------------------------
com.metrics.Main.time
             value = 1548504511814

4、Counter度量

Counter度量类型是一种特殊的Gauge度量,因为其持有的值就是一个AtomicLong。代码如下:

// 在容器中注册一个名叫counter的counter度量指标
Counter counter = metrics.counter("counter");
// counter值加1
counter.inc();
// 睡2秒
try {
    Thread.sleep(2000);
} catch (InterruptedException e) {}
// counter值减1
counter.dec();

输出结果:

2019/1/26 下午8:21:00 ============================================================

-- Counters --------------------------------------------------------------------
counter
             count = 1


2019/1/26 下午8:21:01 ============================================================

-- Counters --------------------------------------------------------------------
counter
             count = 1


2019/1/26 下午8:21:02 ============================================================

-- Counters --------------------------------------------------------------------
counter
             count = 0


2019/1/26 下午8:21:03 ============================================================

-- Counters --------------------------------------------------------------------
counter
             count = 0

5、Histogram度量

Histogram度量类型用于测量一个数据流各值的统计分布。其除了能够测量最大值、最小值、平均值外,还可以测量中位数、75、90、95、98、99和99.9%等。代码如下:

// 在容器中注册一个名叫com.metrics.Main.number的Histogram度量指标
Histogram number = metrics.histogram(name(Main.class, "number"));
// 数据流依此为1,5,9
number.update(1);
number.update(5);
number.update(9);

输出结果:

2019/1/26 下午8:32:53 ============================================================

-- Histograms ------------------------------------------------------------------
com.metrics.Main.number
             count = 3
               min = 1
               max = 9
              mean = 5.00
            stddev = 3.27
            median = 5.00
              75% <= 9.00
              95% <= 9.00
              98% <= 9.00
              99% <= 9.00
            99.9% <= 9.00

6.Timer度量

Timer度量类型包含了Meter和Histogram的统计,即比率和统计信息的综合。代码如下:

// 在容器中注册一个名叫com.metrics.Main.timer的Timer度量
Timer responses = metrics.timer(name(Main.class, "timer"));
try {
    // 新建一个context用于统计
    Timer.Context context=responses.time();
    // 模拟处理时间消耗
    Thread.sleep(10);
    // 记录本次处理信息
    context.stop();
    // 新建一个context用于统计
    context=responses.time();
    Thread.sleep(50);
    context.stop();
    // 新建一个context用于统计
    context=responses.time();
    Thread.sleep(90);
    context.stop();
} catch (InterruptedException e) { }

输出结果如下:

2019/1/26 下午8:41:53 ============================================================

-- Timers ----------------------------------------------------------------------
com.metrics.Main.responses
             count = 3
         mean rate = 2.99 calls/second
     1-minute rate = 0.00 calls/second
     5-minute rate = 0.00 calls/second
    15-minute rate = 0.00 calls/second
               min = 10.91 milliseconds
               max = 90.20 milliseconds
              mean = 50.50 milliseconds
            stddev = 32.37 milliseconds
            median = 50.37 milliseconds
              75% <= 90.20 milliseconds
              95% <= 90.20 milliseconds
              98% <= 90.20 milliseconds
              99% <= 90.20 milliseconds
            99.9% <= 90.20 milliseconds

 

 

参考资料:《Metrics官方文档

  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论

打赏作者

我叫白小猿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值