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