杨行网站建设,好网站你知道,Wordpress主题更改导航栏颜色,wordpress最好cmsMetrics是一个给JAVA服务的各项指标提供度量工具的包#xff0c;在JAVA代码中嵌入Metrics代码#xff0c;可以方便的对业务代码的各个指标进行监控#xff0c;同时#xff0c;Metrics能够很好的跟Ganlia、Graphite结合#xff0c;方便的提供图形化接口。基本使用方式直接将…Metrics是一个给JAVA服务的各项指标提供度量工具的包在JAVA代码中嵌入Metrics代码可以方便的对业务代码的各个指标进行监控同时Metrics能够很好的跟Ganlia、Graphite结合方便的提供图形化接口。基本使用方式直接将core包(目前稳定版本3.0.1)导入pom文件即可配置如下com.codahale.metricsgroupId metrics-coreartifactId 3.0.1version dependencycore包主要提供如下核心功能Metrics Registries类似一个metrics容器维护一个Map可以是一个服务一个实例。支持五种metric类型Gauges、Counters、Meters、Histograms和Timers。可以将metrics值通过JMX、ConsoleCSV文件和SLF4J loggers发布出来。五种Metrics类型1. GaugesGauges是一个最简单的计量一般用来统计瞬时状态的数据信息比如系统中处于pending状态的job。测试代码点击(此处)折叠或打开package com.netease.test.metrics;import com.codahale.metrics.ConsoleReporter;import com.codahale.metrics.Gauge;import com.codahale.metrics.JmxReporter;import com.codahale.metrics.MetricRegistry;import java.util.Queue;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.TimeUnit;/*** User: hzwangxx* Date: 14-2-17* Time: 14:47* 测试Gauges实时统计pending状态的job个数*/public class TestGauges {/*** 实例化一个registry最核心的一个模块相当于一个应用程序的metrics系统的容器维护一个Map*/private static final MetricRegistry metrics new MetricRegistry();private static Queue queue new LinkedBlockingDeque();/*** 在控制台上打印输出*/private static ConsoleReporter reporter ConsoleReporter.forRegistry(metrics).build();public static void main(String[] args) throws InterruptedException {reporter.start(3, TimeUnit.SECONDS);//实例化一个GaugeGauge gauge new Gauge() {Overridepublic Integer getValue() {return queue.size();}};//注册到容器中metrics.register(MetricRegistry.name(TestGauges.class, pending-job, size), gauge);//测试JMXJmxReporter jmxReporter JmxReporter.forRegistry(metrics).build();jmxReporter.start();//模拟数据for (int i0; i20; i){queue.add(a);Thread.sleep(1000);}}}/*console output:14-2-17 15:29:35 -- Gauges ----------------------------------------------------------------------com.netease.test.metrics.TestGauges.pending-job.sizevalue 414-2-17 15:29:38 -- Gauges ----------------------------------------------------------------------com.netease.test.metrics.TestGauges.pending-job.sizevalue 614-2-17 15:29:41 -- Gauges ----------------------------------------------------------------------com.netease.test.metrics.TestGauges.pending-job.sizevalue 9*/通过以上步骤将会向MetricsRegistry容器中注册一个名字为com.netease.test.metrics .TestGauges.pending-job.size的metrics实时获取队列长度的指标。另外Core包种还扩展了几种特定的GaugeJMX Gauges—提供给第三方库只通过JMX将指标暴露出来。Ratio Gauges—简单地通过创建一个gauge计算两个数的比值。Cached Gauges—对某些计量指标提供缓存Derivative Gauges—提供Gauge的值是基于其他Gauge值的接口。2. CounterCounter是Gauge的一个特例维护一个计数器可以通过inc()和dec()方法对计数器做修改。使用步骤与Gauge基本类似在MetricRegistry中提供了静态方法可以直接实例化一个Counter。点击(此处)折叠或打开package com.netease.test.metrics;import com.codahale.metrics.ConsoleReporter;import com.codahale.metrics.Counter;import com.codahale.metrics.MetricRegistry;import java.util.LinkedList;import java.util.Queue;import java.util.concurrent.TimeUnit;import static com.codahale.metrics.MetricRegistry.*;/*** User: hzwangxx* Date: 14-2-14* Time: 14:02* 测试Counter*/public class TestCounter {/*** 实例化一个registry最核心的一个模块相当于一个应用程序的metrics系统的容器维护一个Map*/private static final MetricRegistry metrics new MetricRegistry();/*** 在控制台上打印输出*/private static ConsoleReporter reporter ConsoleReporter.forRegistry(metrics).build();/*** 实例化一个counter,同样可以通过如下方式进行实例化再注册进去* pendingJobs new Counter();* metrics.register(MetricRegistry.name(TestCounter.class, pending-jobs), pendingJobs);*/private static Counter pendingJobs metrics.counter(name(TestCounter.class, pedding-jobs));// private static Counter pendingJobs metrics.counter(MetricRegistry.name(TestCounter.class, pedding-jobs));private static Queue queue new LinkedList();public static void add(String str) {pendingJobs.inc();queue.offer(str);}public String take() {pendingJobs.dec();return queue.poll();}public static void main(String[]args) throws InterruptedException {reporter.start(3, TimeUnit.SECONDS);while(true){add(1);Thread.sleep(1000);}}}/*console output14-2-17 17:52:34 -- Counters --------------------------------------------------------------------com.netease.test.metrics.TestCounter.pedding-jobscount 414-2-17 17:52:37 -- Counters --------------------------------------------------------------------com.netease.test.metrics.TestCounter.pedding-jobscount 614-2-17 17:52:40 -- Counters --------------------------------------------------------------------com.netease.test.metrics.TestCounter.pedding-jobscount 9*/3. MetersMeters用来度量某个时间段的平均处理次数(request per second)每1、5、15分钟的TPS。比如一个service的请求数通过metrics.meter()实例化一个Meter之后然后通过meter.mark()方法就能将本次请求记录下来。统计结果有总的请求数平均每秒的请求数以及最近的1、5、15分钟的平均TPS。点击(此处)折叠或打开package com.netease.test.metrics;import com.codahale.metrics.ConsoleReporter;import com.codahale.metrics.Meter;import com.codahale.metrics.MetricRegistry;import java.util.concurrent.TimeUnit;import static com.codahale.metrics.MetricRegistry.*;/*** User: hzwangxx* Date: 14-2-17* Time: 18:34* 测试Meters*/public class TestMeters {/*** 实例化一个registry最核心的一个模块相当于一个应用程序的metrics系统的容器维护一个Map*/private static final MetricRegistry metrics new MetricRegistry();/*** 在控制台上打印输出*/private static ConsoleReporter reporter ConsoleReporter.forRegistry(metrics).build();/*** 实例化一个Meter*/private static final Meter requests metrics.meter(name(TestMeters.class, request));public static void handleRequest() {requests.mark();}public static void main(String[] args) throws InterruptedException {reporter.start(3, TimeUnit.SECONDS);while(true){handleRequest();Thread.sleep(100);}}}/*14-2-17 18:43:08 -- Meters ----------------------------------------------------------------------com.netease.test.metrics.TestMeters.requestcount 30mean rate 9.95 events/second1-minute rate 0.00 events/second5-minute rate 0.00 events/second15-minute rate 0.00 events/second14-2-17 18:43:11 -- Meters ----------------------------------------------------------------------com.netease.test.metrics.TestMeters.requestcount 60mean rate 9.99 events/second1-minute rate 10.00 events/second5-minute rate 10.00 events/second15-minute rate 10.00 events/second14-2-17 18:43:14 -- Meters ----------------------------------------------------------------------com.netease.test.metrics.TestMeters.requestcount 90mean rate 9.99 events/second1-minute rate 10.00 events/second5-minute rate 10.00 events/second15-minute rate 10.00 events/second*/4. HistogramsHistograms主要使用来统计数据的分布情况最大值、最小值、平均值、中位数百分比(75%、90%、95%、98%、99%和99.9%)。例如需要统计某个页面的请求响应时间分布情况可以使用该种类型的Metrics进行统计。具体的样例代码如下点击(此处)折叠或打开package com.netease.test.metrics;import com.codahale.metrics.ConsoleReporter;import com.codahale.metrics.Histogram;import com.codahale.metrics.MetricRegistry;import java.util.Random;import java.util.concurrent.TimeUnit;import static com.codahale.metrics.MetricRegistry.name;/*** User: hzwangxx* Date: 14-2-17* Time: 18:34* 测试Histograms*/public class TestHistograms {/*** 实例化一个registry最核心的一个模块相当于一个应用程序的metrics系统的容器维护一个Map*/private static final MetricRegistry metrics new MetricRegistry();/*** 在控制台上打印输出*/private static ConsoleReporter reporter ConsoleReporter.forRegistry(metrics).build();/*** 实例化一个Histograms*/private static final Histogram randomNums metrics.histogram(name(TestHistograms.class, random));public static void handleRequest(double random) {randomNums.update((int) (random*100));}public static void main(String[] args) throws InterruptedException {reporter.start(3, TimeUnit.SECONDS);Random rand new Random();while(true){handleRequest(rand.nextDouble());Thread.sleep(100);}}}/*14-2-17 19:39:11 -- Histograms ------------------------------------------------------------------com.netease.test.metrics.TestHistograms.randomcount 30min 1max 97mean 45.93stddev 29.12median 39.5075% 71.0095% 95.9098% 97.0099% 97.0099.9% 97.0014-2-17 19:39:14 -- Histograms ------------------------------------------------------------------com.netease.test.metrics.TestHistograms.randomcount 60min 0max 97mean 41.17stddev 28.60median 34.5075% 69.7595% 92.9098% 96.5699% 97.0099.9% 97.0014-2-17 19:39:17 -- Histograms ------------------------------------------------------------------com.netease.test.metrics.TestHistograms.randomcount 90min 0max 97mean 44.67stddev 28.47median 43.0075% 71.0095% 91.9098% 96.1899% 97.0099.9% 97.00*/5. TimersTimers主要是用来统计某一块代码段的执行时间以及其分布情况具体是基于Histograms和Meters来实现的。样例代码如下点击(此处)折叠或打开package com.netease.test.metrics;import com.codahale.metrics.ConsoleReporter;import com.codahale.metrics.MetricRegistry;import com.codahale.metrics.Timer;import java.util.Random;import java.util.concurrent.TimeUnit;import static com.codahale.metrics.MetricRegistry.name;/*** User: hzwangxx* Date: 14-2-17* Time: 18:34* 测试Timers*/public class TestTimers {/*** 实例化一个registry最核心的一个模块相当于一个应用程序的metrics系统的容器维护一个Map*/private static final MetricRegistry metrics new MetricRegistry();/*** 在控制台上打印输出*/private static ConsoleReporter reporter ConsoleReporter.forRegistry(metrics).build();/*** 实例化一个Meter*/// private static final Timer requests metrics.timer(name(TestTimers.class, request));private static final Timer requests metrics.timer(name(TestTimers.class, request));public static void handleRequest(int sleep) {Timer.Context context requests.time();try {//some operatorThread.sleep(sleep);} catch (InterruptedException e) {e.printStackTrace();} finally {context.stop();}}public static void main(String[] args) throws InterruptedException {reporter.start(3, TimeUnit.SECONDS);Random random new Random();while(true){handleRequest(random.nextInt(1000));}}}/*14-2-18 9:31:54 -- Timers ----------------------------------------------------------------------com.netease.test.metrics.TestTimers.requestcount 4mean rate 1.33 calls/second1-minute rate 0.00 calls/second5-minute rate 0.00 calls/second15-minute rate 0.00 calls/secondmin 483.07 millisecondsmax 901.92 millisecondsmean 612.64 millisecondsstddev 196.32 millisecondsmedian 532.79 milliseconds75% 818.31 milliseconds95% 901.92 milliseconds98% 901.92 milliseconds99% 901.92 milliseconds99.9% 901.92 milliseconds14-2-18 9:31:57 -- Timers ----------------------------------------------------------------------com.netease.test.metrics.TestTimers.requestcount 8mean rate 1.33 calls/second1-minute rate 1.40 calls/second5-minute rate 1.40 calls/second15-minute rate 1.40 calls/secondmin 41.07 millisecondsmax 968.19 millisecondsmean 639.50 millisecondsstddev 306.12 millisecondsmedian 692.77 milliseconds75% 885.96 milliseconds95% 968.19 milliseconds98% 968.19 milliseconds99% 968.19 milliseconds99.9% 968.19 milliseconds14-2-18 9:32:00 -- Timers ----------------------------------------------------------------------com.netease.test.metrics.TestTimers.requestcount 15mean rate 1.67 calls/second1-minute rate 1.40 calls/second5-minute rate 1.40 calls/second15-minute rate 1.40 calls/secondmin 41.07 millisecondsmax 968.19 millisecondsmean 591.35 millisecondsstddev 302.96 millisecondsmedian 650.56 milliseconds75% 838.07 milliseconds95% 968.19 milliseconds98% 968.19 milliseconds99% 968.19 milliseconds99.9% 968.19 milliseconds*/6 Health ChecksMetrics提供了一个独立的模块Health Checks用于对Application、其子模块或者关联模块的运行是否正常做检测。该模块是独立metrics-core模块的使用时则导入metrics-healthchecks包。com.codahale.metricsgroupId metrics-healthchecksartifactId 3.0.1version dependency使用起来和与上述几种类型的Metrics有点类似但是需要重新实例化一个Metrics容器HealthCheckRegistry待检测模块继承抽象类HealthCheck并实现check()方法即可然后将该模块注册到HealthCheckRegistry中判断的时候通过isHealthy()接口即可。如下示例代码点击(此处)折叠或打开package com.netease.test.metrics;import com.codahale.metrics.health.HealthCheck;import com.codahale.metrics.health.HealthCheckRegistry;import java.util.Map;import java.util.Random;/*** User: hzwangxx* Date: 14-2-18* Time: 9:57*/public class DatabaseHealthCheck extends HealthCheck{private final Database database;public DatabaseHealthCheck(Database database) {this.database database;}Overrideprotected Result check() throws Exception {if (database.ping()) {return Result.healthy();}return Result.unhealthy(Cant ping database.);}/*** 模拟Database对象*/static class Database {/*** 模拟database的ping方法* return 随机返回boolean值*/public boolean ping() {Random random new Random();return random.nextBoolean();}}public static void main(String[] args) {// MetricRegistry metrics new MetricRegistry();// ConsoleReporter reporter ConsoleReporter.forRegistry(metrics).build();HealthCheckRegistry registry new HealthCheckRegistry();registry.register(database1, new DatabaseHealthCheck(new Database()));registry.register(database2, new DatabaseHealthCheck(new Database()));while (true) {for (Map.Entry entry : registry.runHealthChecks().entrySet()) {if (entry.getValue().isHealthy()) {System.out.println(entry.getKey() : OK);} else {System.err.println(entry.getKey() : FAIL, error message: entry.getValue().getMessage());final Throwable e entry.getValue().getError();if (e ! null) {e.printStackTrace();}}}try {Thread.sleep(1000);} catch (InterruptedException e) {}}}}/*console output:database1: OKdatabase2: FAIL, error message: Cant ping database.database1: FAIL, error message: Cant ping database.database2: OKdatabase1: OKdatabase2: FAIL, error message: Cant ping database.database1: FAIL, error message: Cant ping database.database2: OKdatabase1: FAIL, error message: Cant ping database.database2: FAIL, error message: Cant ping database.database1: FAIL, error message: Cant ping database.database2: FAIL, error message: Cant ping database.database1: OKdatabase2: OKdatabase1: OKdatabase2: FAIL, error message: Cant ping database.database1: FAIL, error message: Cant ping database.database2: OKdatabase1: OKdatabase2: OKdatabase1: FAIL, error message: Cant ping database.database2: OKdatabase1: OKdatabase2: OKdatabase1: OKdatabase2: OKdatabase1: OKdatabase2: FAIL, error message: Cant ping database.database1: FAIL, error message: Cant ping database.database2: FAIL, error message: Cant ping database.*/其他支持metrics提供了对Ehcache、Apache HttpClient、JDBI、Jersey、Jetty、Log4J、Logback、JVM等的集成可以方便地将Metrics输出到Ganglia、Graphite中供用户图形化展示。