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

时间:2025-01-25 08:37:28
Author:赵志乾
Date:2019-01-26
Declaration:All Right Reserved!!!

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

 

1、引入metrics-core包

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

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

2、MetricRegistry实例化

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

static final MetricRegistry metrics = new MetricRegistry();

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

3、ConsoleReporter实例化

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

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

// 启动报表输出,输出间隔时间为1秒
(1, );

4、演示代码

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

package ;

import ;
import ;

import ;

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 = (metrics)
                .convertRatesTo()
                .convertDurationsTo()
                .build();
        (1, );
    }

    static void wait2Seconds() {
        try {
            (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 = ("requests");
// 事件发生次数加1
();

输出结果如下,可以看出,事件发生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度量类型是单个值的瞬时值测量。即测量时刻,测量值是多少。代码如下:

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

输出结果如下:

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

-- Gauges ----------------------------------------------------------------------

             value = 1548504510822


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

-- Gauges ----------------------------------------------------------------------

             value = 1548504511814

4、Counter度量

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

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

输出结果:

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%等。代码如下:

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

输出结果:

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

-- Histograms ------------------------------------------------------------------

             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

度量

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

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

输出结果如下:

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

-- Timers ----------------------------------------------------------------------

             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官方文档