java metrics_Metrics-Java版的指标度量工具之一

Metrics是一个用于JAVA服务指标度量的工具,可方便地监控业务代码各项指标,并能与Ganlia、Graphite集成,提供图形化界面。它包括Gauges、Counters、Meters、Histograms和Timers五种metric类型。例如,Gauges用于实时统计瞬时状态,如系统中pending状态的job数量;Counter是可增减的计数器;Meters则用于度量每秒处理的请求数量。
摘要由CSDN通过智能技术生成

Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia、Graphite结合,方便的提供图形化接口。基本使用方式直接将core包(目前稳定版本3.0.1)导入pom文件即可,配置如下:

com.codahale.metrics

metrics-core

3.0.1

core包主要提供如下核心功能:

Metrics Registries类似一个metrics容器,维护一个Map,可以是一个服务一个实例。

支持五种metric类型:Gauges、Counters、Meters、Histograms和Timers。

可以将metrics值通过JMX、Console,CSV文件和SLF4J loggers发布出来。

五种Metrics类型:

1.       Gauges

Gauges是一个最简单的计量,一般用来统计瞬时状态的数据信息,比如系统中处于pending状态的job。测试代码

packagecom.netease.test.metrics;importcom.codahale.metrics.ConsoleReporter;importcom.codahale.metrics.Gauge;importcom.codahale.metrics.JmxReporter;importcom.codahale.metrics.MetricRegistry;importjava.util.Queue;importjava.util.concurrent.LinkedBlockingDeque;importjava.util.concurrent.TimeUnit;/*** User: hzwangxx

* Date: 14-2-17

* Time: 14:47

* 测试Gauges,实时统计pending状态的job个数*/

public classTestGauges {/*** 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map*/

private static final MetricRegistry metrics = newMetricRegistry();private static Queue queue = new LinkedBlockingDeque();/*** 在控制台上打印输出*/

private static ConsoleReporter reporter =ConsoleReporter.forRegistry(metrics).build();public static void main(String[] args) throwsInterruptedException {

reporter.start(3, TimeUnit.SECONDS);//实例化一个Gauge

Gauge gauge = new Gauge() {

@OverridepublicInteger getValue() {returnqueue.size();

}

};//注册到容器中

metrics.register(MetricRegistry.name(TestGauges.class, "pending-job", "size"), gauge);//测试JMX

JmxReporter jmxReporter =JmxReporter.forRegistry(metrics).build();

jmxReporter.start();//模拟数据

for (int i=0; i<20; i++){

queue.add("a");

Thread.sleep(1000);

}

}

}/*console output:

14-2-17 15:29:35 ===============================================================

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

com.netease.test.metrics.TestGauges.pending-job.size

value = 4

14-2-17 15:29:38 ===============================================================

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

com.netease.test.metrics.TestGauges.pending-job.size

value = 6

14-2-17 15:29:41 ===============================================================

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

com.netease.test.metrics.TestGauges.pending-job.size

value = 9*/

通过以上步骤将会向MetricsRegistry容器中注册一个名字为com.netease.test.metrics .TestGauges.pending-job.size的metrics,实时获取队列长度的指标。另外,Core包种还扩展了几种特定的Gauge:

JMX Gauges—提供给第三方库只通过JMX将指标暴露出来。

Ratio Gauges—简单地通过创建一个gauge计算两个数的比值。

Cached Gauges—对某些计量指标提供缓存

Derivative Gauges—提供Gauge的值是基于其他Gauge值的接口。

2.       Counter

Counter是Gauge的一个特例,维护一个计数器,可以通过inc()和dec()方法对计数器做修改。使用步骤与Gauge基本类似,在MetricRegistry中提供了静态方法可以直接实例化一个Counter。

packagecom.netease.test.metrics;importcom.codahale.metrics.ConsoleReporter;importcom.codahale.metrics.Counter;importcom.codahale.metrics.MetricRegistry;importjava.util.LinkedList;importjava.util.Queue;importjava.util.concurrent.TimeUnit;import static com.codahale.metrics.MetricRegistry.*;/*** User: hzwangxx

* Date: 14-2-14

* Time: 14:02

* 测试Counter*/

public classTestCounter {/*** 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map*/

private static final MetricRegistry metrics = newMetricRegistry();/*** 在控制台上打印输出*/

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 voidadd(String str) {

pendingJobs.inc();

queue.offer(str);

}publicString take() {

pendingJobs.dec();returnqueue.poll();

}public static void main(String[]args) throwsInterruptedException {

reporter.start(3, TimeUnit.SECONDS);while(true){

add("1");

Thread.sleep(1000);

}

}

}/*console output:

14-2-17 17:52:34 ===============================================================

-- Counters --------------------------------------------------------------------

com.netease.test.metrics.TestCounter.pedding-jobs

count = 4

14-2-17 17:52:37 ===============================================================

-- Counters --------------------------------------------------------------------

com.netease.test.metrics.TestCounter.pedding-jobs

count = 6

14-2-17 17:52:40 ===============================================================

-- Counters --------------------------------------------------------------------

com.netease.test.metrics.TestCounter.pedding-jobs

count = 9*/

3.       Meters

Meters用来度量某个时间段的平均处理次数(request per second),每1、5、15分钟的TPS。比如一个service的请求数,通过metrics.meter()实例化一个Meter之后,然后通过meter.mark()方法就能将本次请求记录下来。统计结果有总的请求数,平均每秒的请求数,以及最近的1、5、15分钟的平均TPS。

packagecom.netease.test.metrics;importcom.codahale.metrics.ConsoleReporter;importcom.codahale.metrics.Meter;importcom.codahale.metrics.MetricRegistry;importjava.util.concurrent.TimeUnit;import static com.codahale.metrics.MetricRegistry.*;/*** User: hzwangxx

* Date: 14-2-17

* Time: 18:34

* 测试Meters*/

public classTestMeters {/*** 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map*/

private static final MetricRegistry metrics = newMetricRegistry();/*** 在控制台上打印输出*/

private static ConsoleReporter reporter =ConsoleReporter.forRegistry(metrics).build();/*** 实例化一个Meter*/

private static final Meter requests = metrics.meter(name(TestMeters.class, "request"));public static voidhandleRequest() {

requests.mark();

}public static void main(String[] args) throwsInterruptedException {

reporter.start(3, TimeUnit.SECONDS);while(true){

handleRequest();

Thread.sleep(100);

}

}

}/*14-2-17 18:43:08 ===============================================================

-- Meters ----------------------------------------------------------------------

com.netease.test.metrics.TestMeters.request

count = 30

mean rate = 9.95 events/second

1-minute rate = 0.00 events/second

5-minute rate = 0.00 events/second

15-minute rate = 0.00 events/second

14-2-17 18:43:11 ===============================================================

-- Meters ----------------------------------------------------------------------

com.netease.test.metrics.TestMeters.request

count = 60

mean rate = 9.99 events/second

1-minute rate = 10.00 events/second

5-minute rate = 10.00 events/second

15-minute rate = 10.00 events/second

14-2-17 18:43:14 ===============================================================

-- Meters ----------------------------------------------------------------------

com.netease.test.metrics.TestMeters.request

count = 90

mean rate = 9.99 events/second

1-minute rate = 10.00 events/second

5-minute rate = 10.00 events/second

15-minute rate = 10.00 events/second*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值