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

  1. <dependency>
  2. <groupId>com.codahale.metrics</groupId>
  3. <artifactId>metrics-core</artifactId>
  4. <version>3.0.1</version>
  5. </dependency>

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

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

五种Metrics类型:

1.       Gauges

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

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Gauge;
  5. import com.codahale.metrics.JmxReporter;
  6. import com.codahale.metrics.MetricRegistry;
  7.  
  8. import java.util.Queue;
  9. import java.util.concurrent.LinkedBlockingDeque;
  10. import java.util.concurrent.TimeUnit;
  11.  
  12. /**
  13. * User: hzwangxx
  14. * Date: 14-2-17
  15. * Time: 14:47
  16. * 测试Gauges,实时统计pending状态的job个数
  17. */
  18. public class TestGauges {
  19. /**
  20. * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  21. */
  22. private static final MetricRegistry metrics = new MetricRegistry();
  23.  
  24. private static Queue<String> queue = new LinkedBlockingDeque<String>();
  25.  
  26. /**
  27. * 在控制台上打印输出
  28. */
  29. private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  30.  
  31. public static void main(String[] args) throws InterruptedException {
  32. reporter.start(3, TimeUnit.SECONDS);
  33.  
  34. //实例化一个Gauge
  35. Gauge<Integer> gauge = new Gauge<Integer>() {
  36. @Override
  37. public Integer getValue() {
  38. return queue.size();
  39. }
  40. };
  41.  
  42. //注册到容器中
  43. metrics.register(MetricRegistry.name(TestGauges.class, "pending-job", "size"), gauge);
  44.  
  45. //测试JMX
  46. JmxReporter jmxReporter = JmxReporter.forRegistry(metrics).build();
  47. jmxReporter.start();
  48.  
  49. //模拟数据
  50. for (int i=0; i<20; i++){
  51. queue.add("a");
  52. Thread.sleep(1000);
  53. }
  54.  
  55. }
  56. }
  57.  
  58. /*
  59. console output:
  60. 14-2-17 15:29:35 ===============================================================
  61.  
  62. -- Gauges ----------------------------------------------------------------------
  63. com.netease.test.metrics.TestGauges.pending-job.size
  64. value = 4
  65.  
  66. 14-2-17 15:29:38 ===============================================================
  67.  
  68. -- Gauges ----------------------------------------------------------------------
  69. com.netease.test.metrics.TestGauges.pending-job.size
  70. value = 6
  71.  
  72. 14-2-17 15:29:41 ===============================================================
  73.  
  74. -- Gauges ----------------------------------------------------------------------
  75. com.netease.test.metrics.TestGauges.pending-job.size
  76. value = 9
  77. */

通过以上步骤将会向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。

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Counter;
  5. import com.codahale.metrics.MetricRegistry;
  6.  
  7. import java.util.LinkedList;
  8. import java.util.Queue;
  9. import java.util.concurrent.TimeUnit;
  10. import static com.codahale.metrics.MetricRegistry.*;
  11. /**
  12. * User: hzwangxx
  13. * Date: 14-2-14
  14. * Time: 14:02
  15. * 测试Counter
  16. */
  17. public class TestCounter {
  18.  
  19. /**
  20. * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  21. */
  22. private static final MetricRegistry metrics = new MetricRegistry();
  23.  
  24. /**
  25. * 在控制台上打印输出
  26. */
  27. private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  28.  
  29. /**
  30. * 实例化一个counter,同样可以通过如下方式进行实例化再注册进去
  31. * pendingJobs = new Counter();
  32. * metrics.register(MetricRegistry.name(TestCounter.class, "pending-jobs"), pendingJobs);
  33. */
  34. private static Counter pendingJobs = metrics.counter(name(TestCounter.class, "pedding-jobs"));
  35. // private static Counter pendingJobs = metrics.counter(MetricRegistry.name(TestCounter.class, "pedding-jobs"));
  36.  
  37. private static Queue<String> queue = new LinkedList<String>();
  38.  
  39. public static void add(String str) {
  40. pendingJobs.inc();
  41. queue.offer(str);
  42. }
  43.  
  44. public String take() {
  45. pendingJobs.dec();
  46. return queue.poll();
  47. }
  48.  
  49. public static void main(String[]args) throws InterruptedException {
  50. reporter.start(3, TimeUnit.SECONDS);
  51. while(true){
  52. add("1");
  53. Thread.sleep(1000);
  54. }
  55.  
  56. }
  57. }
  58.  
  59. /*
  60. console output:
  61. 14-2-17 17:52:34 ===============================================================
  62.  
  63. -- Counters --------------------------------------------------------------------
  64. com.netease.test.metrics.TestCounter.pedding-jobs
  65. count = 4
  66.  
  67. 14-2-17 17:52:37 ===============================================================
  68.  
  69. -- Counters --------------------------------------------------------------------
  70. com.netease.test.metrics.TestCounter.pedding-jobs
  71. count = 6
  72.  
  73. 14-2-17 17:52:40 ===============================================================
  74.  
  75. -- Counters --------------------------------------------------------------------
  76. com.netease.test.metrics.TestCounter.pedding-jobs
  77. count = 9
  78.  
  79. */

3.       Meters

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

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Meter;
  5. import com.codahale.metrics.MetricRegistry;
  6.  
  7. import java.util.concurrent.TimeUnit;
  8.  
  9. import static com.codahale.metrics.MetricRegistry.*;
  10.  
  11. /**
  12. * User: hzwangxx
  13. * Date: 14-2-17
  14. * Time: 18:34
  15. * 测试Meters
  16. */
  17. public class TestMeters {
  18. /**
  19. * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  20. */
  21. private static final MetricRegistry metrics = new MetricRegistry();
  22.  
  23. /**
  24. * 在控制台上打印输出
  25. */
  26. private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  27.  
  28. /**
  29. * 实例化一个Meter
  30. */
  31. private static final Meter requests = metrics.meter(name(TestMeters.class, "request"));
  32.  
  33. public static void handleRequest() {
  34. requests.mark();
  35. }
  36.  
  37. public static void main(String[] args) throws InterruptedException {
  38. reporter.start(3, TimeUnit.SECONDS);
  39. while(true){
  40. handleRequest();
  41. Thread.sleep(100);
  42. }
  43. }
  44.  
  45. }
  46.  
  47. /*
  48. 14-2-17 18:43:08 ===============================================================
  49.  
  50. -- Meters ----------------------------------------------------------------------
  51. com.netease.test.metrics.TestMeters.request
  52. count = 30
  53. mean rate = 9.95 events/second
  54. 1-minute rate = 0.00 events/second
  55. 5-minute rate = 0.00 events/second
  56. 15-minute rate = 0.00 events/second
  57.  
  58. 14-2-17 18:43:11 ===============================================================
  59.  
  60. -- Meters ----------------------------------------------------------------------
  61. com.netease.test.metrics.TestMeters.request
  62. count = 60
  63. mean rate = 9.99 events/second
  64. 1-minute rate = 10.00 events/second
  65. 5-minute rate = 10.00 events/second
  66. 15-minute rate = 10.00 events/second
  67.  
  68. 14-2-17 18:43:14 ===============================================================
  69.  
  70. -- Meters ----------------------------------------------------------------------
  71. com.netease.test.metrics.TestMeters.request
  72. count = 90
  73. mean rate = 9.99 events/second
  74. 1-minute rate = 10.00 events/second
  75. 5-minute rate = 10.00 events/second
  76. 15-minute rate = 10.00 events/second
  77. */

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

Metrics-Java版的指标度量工具之一的更多相关文章

  1. Metrics-Java版的指标度量工具之二

    接上<Metrics-Java版的指标度量工具之一> 4.       Histograms Histograms主要使用来统计数据的分布情况,最大值.最小值.平均值.中位数,百分比(75 ...

  2. Metrics-Java版的指标度量工具

    介绍 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia.Gra ...

  3. JAVA Metrics 度量工具使用介绍1

    Java Metric使用介绍1 Metrics是一个给JAVA提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同一时候,Metrics可以非常好的跟 ...

  4. Java代码质量度量工具大阅兵

    FindBugs FindBugs, a program which uses static analysis to look for bugs in Java code. It is free so ...

  5. java版MD5签名工具类

    package com.net.util; import java.security.MessageDigest; /** * MD5签名工具类 * @author zhangdi * */ publ ...

  6. 代码度量工具——SourceMonitor的学习和使用

    http://www.cnblogs.com/bangerlee/archive/2011/09/18/2178172.html 引言 我们提倡编写功能单一.结构清晰.接口简单的函数,因为过于复杂的函 ...

  7. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

    前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...

  8. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  9. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

随机推荐

  1. command line

    command line terminal vim 编辑工具 vim 编辑命令 j 光标上移 k 光标下移 l 光标左移 h 光标右移 x / dd 删除一行 v 多行模式 :w 保存 :q 不保存退 ...

  2. 初学 react | redux

    react | redux 一.安装 React Redux 依赖 React 0.14或更新版本 npm install --sava react-redux 你需要使用 npm 作为包管理工具,配 ...

  3. 深入理解Java虚拟机(一)、Java内存区域与内存溢出异常

    Java虚拟机所管理的内存包括以下几个运行时数据区: 程序计数器(PCR): 1.是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 2.为线程私有 3.执行Java方法有PCR,执行 ...

  4. NSBundle控件和UIImageView和UIButton区别

    1.NSBundle 1> 一个NSBundle代表一个文件夹,利用NSBundle能访问对应的文件夹 2> 利用mainBundle就可以访问软件资源包中的任何资源 3> 模拟器应 ...

  5. 利用(Tcmalloc) google-perftools优化Nginx和MySQL性能

    一.安装libunwind wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz 本地下载:htt ...

  6. Hadoop2.6.0的事件分类与实现

    前言 说实在的,在阅读Hadoop YARN的源码之前,我对于java枚举的使用相形见绌.YARN中实现的事件在可读性.可维护性.可扩展性方面的工作都值得借鉴. 概念 在具体分析源码之前,我们先看看Y ...

  7. java连接Oracle数据库

    Oracle数据库先创建一个表和添加一些数据 1.先在Oracle数据库中创建一个student表: create table student ( id ) not null primary key, ...

  8. Spring 学习笔记 3. 尚硅谷_佟刚_Spring_配置 Bean

    1,bean 的配置 <bean id="helloWorld" class="com.yfy.HelloWorld"> <property ...

  9. First Missing Positive && missing number

    https://leetcode.com/problems/first-missing-positive/ 我原以为数组中不会有重复的数字,所以利用min.max分别记录给定数组中出现的最小正整数和最 ...

  10. 微信小程序免费SSL证书https、TLS版本问题的解决方案

    微信小程序与第三方服务器通讯的域名5个必要条件1.一个已备案的域名,不是localhost.也不是127.0.0.1,域名不能加端口2.加ssl证书,也就是https://~~~4.HTTPS 服务器 ...