Metrics提供了一组通用的模块库用于支持比如Guice,Jetty,Log4j,Apache HttpClient,EhCache,Logback,Spring等,也提供对比如Ganglia和Graphite等后端的报告。
项目官网:http://metrics.dropwizard.io/
Metrics 主要有五大基本组件
1:Counter
记录执行次数
2:Gauge
获取某个值
3:Meter
用来计算事件的速率
4:Histogram
可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median),百分比比如XX%这样的Quantile数据
5:Timer
用来测量一段代码被调用的速率和用时。等于Meter+Hitogram,既算TPS,也算执行时间。
下面是代码例子
首先加入依赖
<dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-core</artifactId> <version>3.1.2</version> </dependency>
package com.lala.core; import com.codahale.metrics.MetricRegistry; public class MetricConstant { public static MetricRegistry REGISTER = new MetricRegistry(); }
package com.lala.core; import java.util.concurrent.TimeUnit; import com.codahale.metrics.ConsoleReporter; /** * 控制台打印输出 */ public class MyConsoleReport { public static void startReport() { final ConsoleReporter reporter = ConsoleReporter.forRegistry(MetricConstant.REGISTER) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.SECONDS) .build(); //一秒钟执行一次 reporter.start(1, TimeUnit.SECONDS); } }
package com.lala.core; import java.util.concurrent.TimeUnit; import com.codahale.metrics.MetricRegistry; public class Base { protected static MetricRegistry metric = MetricConstant.REGISTER; protected static void secondSleep(long value) { try { TimeUnit.SECONDS.sleep(value); } catch (InterruptedException e) { e.printStackTrace(); } } protected static void milliSecondSleep(long value) { try { TimeUnit.MILLISECONDS.sleep(value); } catch (InterruptedException e) { e.printStackTrace(); } } }
一:Counter
package com.lala.demo; import java.util.Random; import com.codahale.metrics.Counter; import com.lala.core.Base; import com.lala.core.MyConsoleReport; /** * 记录执行次数 */ public class CounterTest extends Base { final static Counter exec = metric.counter("com.pp.counter.invoke"); public static void main(String[] args) { MyConsoleReport.startReport(); new Thread(()->{ for(int i=1;i<=3;i++) { exec.inc(); milliSecondSleep(new Random().nextInt(500)*2); } }).start(); secondSleep(3); } }
15-11-22 20:38:29 ==============================================================
-- Counters --------------------------------------------------------------------
com.pp.counter.invoke
count = 3
二:Gauge
package com.lala.demo; import com.codahale.metrics.Gauge; import com.lala.core.Base; import com.lala.core.MyConsoleReport; /** * 获取某个值 */ public class GaugeTest extends Base { public static void main(String[] args) { MyConsoleReport.startReport(); metric.register("com.pp.gauge.freeMemory", new Gauge<Long>(){ public Long getValue() { //这里是获取当前JVM可用内存 return Runtime.getRuntime().freeMemory(); } }); secondSleep(2); } }
15-11-22 20:39:44 ==============================================================
-- Gauges ----------------------------------------------------------------------
com.pp.gauge.freeMemory
value = 118203344
三:Meter
package com.lala.demo; import java.util.Random; import com.codahale.metrics.Meter; import com.lala.core.Base; import com.lala.core.MyConsoleReport; /** * Meter用来计算事件的速率 */ public class MeterTest extends Base { static final Meter requests = metric.meter("com.pp.meter.invoke"); public static void main(String[] args) { MyConsoleReport.startReport(); new Thread(()->{ for(int i=1;i<=2;i++) { requests.mark(); milliSecondSleep(new Random().nextInt(500)*2); } }).start(); secondSleep(2); } }
15-11-22 20:40:57 ==============================================================
-- Meters ----------------------------------------------------------------------
com.pp.meter.invoke
count = 2
mean rate = 0.97 events/second
1-minute rate = 0.00 events/second
5-minute rate = 0.00 events/second
15-minute rate = 0.00 events/second
四:Histogram
package com.lala.demo; import java.util.Arrays; import java.util.List; import java.util.Random; import com.codahale.metrics.Histogram; import com.lala.core.Base; import com.lala.core.MyConsoleReport; /** * Histogram可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median), * 百分比比如XX%这样的Quantile数据 */ public class HistogramTest extends Base { static final Histogram his = metric.histogram("com.pp.histogram.score"); static List<Integer> scores = Arrays.asList(60, 75, 80, 62, 90, 42, 33, 95, 61, 73); public static void main(String[] args) { MyConsoleReport.startReport(); new Thread(()->{ scores.forEach( (score) -> { his.update(score); milliSecondSleep(new Random().nextInt(500)*2); }); }).start(); secondSleep(10); } }
15-11-22 20:42:14 ==============================================================
-- Histograms ------------------------------------------------------------------
com.pp.histogram.score
count = 10
min = 33
max = 95
mean = 67.11
stddev = 18.70
median = 73.00
75% <= 80.00
95% <= 95.00
98% <= 95.00
99% <= 95.00
99.9% <= 95.00
五:Timer
package com.lala.demo; import com.codahale.metrics.Timer; import com.lala.core.Base; import com.lala.core.MyConsoleReport; /** * Timer用来测量一段代码被调用的速率和用时。 * 等于Meter+Hitogram,既算TPS,也算执行时间。 */ public class TimerTest extends Base { static final Timer timer = metric.timer("com.pp.timer.invoke"); static void inovke(long time) { final Timer.Context context = timer.time(); try { secondSleep(time); }finally { context.stop(); } } public static void main(String[] args) { MyConsoleReport.startReport(); inovke(1); inovke(2); inovke(2); inovke(8); secondSleep(1); } }输出如下:
15-11-22 20:43:34 ==============================================================
-- Timers ----------------------------------------------------------------------
com.pp.timer.invoke
count = 4
mean rate = 0.28 calls/second
1-minute rate = 0.38 calls/second
5-minute rate = 0.40 calls/second
15-minute rate = 0.40 calls/second
min = 1.01 seconds
max = 8.00 seconds
mean = 3.44 seconds
stddev = 2.86 seconds
median = 2.00 seconds
75% <= 8.00 seconds
95% <= 8.00 seconds
98% <= 8.00 seconds
99% <= 8.00 seconds
99.9% <= 8.00 seconds
注意:这里的输出,和上一个组件输出有些类似,但是不一样的
这里统计的是执行时间,什么最大执行时间,最小执行时间,平均执行时间等。上一个统计的是数字,什么最大数字,最小数字,平均数字等
当然了,Metrics还可以用来做心跳检测,这里就不演示了。