Metrics-Java版的指标度量工具之一 – 残雪余香 – 博客园

Metrics-Java版的指标度量工具之一 – 残雪余香 – 博客园

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

dependency  groupIdcom.codahale.metrics</groupId  artifactIdmetrics-core</artifactId  version3.0.1</version</dependency

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

  • Metrics Registries类似一个metrics容器,维护一个Map,可以是一个服务一个实例。
  • 支持五种metric类型:Gauges、Counters、Meters、Histograms和Timers。
  • 可以将metrics值通过JMX、Console,CSV文件和SLF4J loggers发布出来。

五种Metrics类型:

1. Gauges

Gauges是一个最简单的计量,一般用来统计瞬时状态的数据信息,比如系统中处于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 =  MetricRegistry();    private static Queue<String> queue =  LinkedBlockingDeque<String>     * 在控制台上打印输出         private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();    public static  main(String[] args) throws InterruptedException {        reporter.start(3, TimeUnit.SECONDS);        实例化一个Gauge        Gauge<Integer> gauge =  Gauge<Integer>() {            @Override            public Integer getValue() {                return queue.size();            }        };        注册到容器中        metrics.register(MetricRegistry.name(TestGauges.class, "pending-job", "size"), gauge);        测试JMX        JmxReporter jmxReporter = JmxReporter.forRegistry(metrics).build();        jmxReporter.start();                 ( 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 = 414-2-17 15:29:38 ===============================================================– Gauges ———————————————————————-com.netease.test.metrics.TestGauges.pending-job.size             value = 614-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。

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 =  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<String> queue =  LinkedList<String>public static  add(String str) {        pendingJobs.inc();        queue.offer(str);    }    public String take() {        pendingJobs.dec();        return queue.poll();    }    public static  main(String[]args) throws InterruptedException {        reporter.start(3, TimeUnit.SECONDS);        while(){            add("1");            Thread.sleep(1000);        }    }}console output:14-2-17 17:52:34 ===============================================================– Counters ——————————————————————–com.netease.test.metrics.TestCounter.pedding-jobs             count = 414-2-17 17:52:37 ===============================================================– Counters ——————————————————————–com.netease.test.metrics.TestCounter.pedding-jobs             count = 614-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。

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 =  MetricRegistry();         * 在控制台上打印输出         private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();         * 实例化一个Meter         private static final Meter requests = metrics.meter(name(TestMeters.class, "request"public static  handleRequest() {        requests.mark();    }    public static  main(String[] args) throws InterruptedException {        reporter.start(3, TimeUnit.SECONDS);        while(){            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/second14-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/second14-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

未完待续:Metrics-Java版的指标度量工具二

此条目发表在Uncategorized分类目录,贴了标签。将固定链接加入收藏夹。