Metrics是一個java庫,能夠為你提供無與倫比的代碼運行洞察功能。
它是由yammer開發的,用於檢測jvm上後端服務的健全狀態。Metrics提供了一個強大的工具集,用於度量你的生產環境上關鍵組件的行為。
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>
com.codahale.metrics.MetricRegistry 是 Metrics的核心,這裡先用一個常量儲存
package com.lala.core; import com.codahale.metrics.MetricRegistry; public class MetricConstant { public static MetricRegistry REGISTER = new MetricRegistry(); } 上面也是說到了 Metrics支援很多輸出,jmx, log4j , jetty, httpclient等等。我這裡就直接輸出到控制台
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
[java] view plain copy 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
[java] view plain copy package com.lala.demo;