接上《Metrics-Java版的指标度量工具之一

4.       Histograms

Histograms主要使用来统计数据的分布情况,最大值、最小值、平均值、中位数,百分比(75%、90%、95%、98%、99%和99.9%)。例如,需要统计某个页面的请求响应时间分布情况,可以使用该种类型的Metrics进行统计。具体的样例代码如下:

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Histogram;
  5. import com.codahale.metrics.MetricRegistry;
  6.  
  7. import java.util.Random;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. import static com.codahale.metrics.MetricRegistry.name;
  11.  
  12. /**
  13. * User: hzwangxx
  14. * Date: 14-2-17
  15. * Time: 18:34
  16. * 测试Histograms
  17. */
  18. public class TestHistograms {
  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. * 实例化一个Histograms
  31. */
  32. private static final Histogram randomNums = metrics.histogram(name(TestHistograms.class, "random"));
  33.  
  34. public static void handleRequest(double random) {
  35. randomNums.update((int) (random*100));
  36. }
  37.  
  38. public static void main(String[] args) throws InterruptedException {
  39. reporter.start(3, TimeUnit.SECONDS);
  40. Random rand = new Random();
  41. while(true){
  42. handleRequest(rand.nextDouble());
  43. Thread.sleep(100);
  44. }
  45. }
  46.  
  47. }
  48.  
  49. /*
  50. 14-2-17 19:39:11 ===============================================================
  51.  
  52. -- Histograms ------------------------------------------------------------------
  53. com.netease.test.metrics.TestHistograms.random
  54. count = 30
  55. min = 1
  56. max = 97
  57. mean = 45.93
  58. stddev = 29.12
  59. median = 39.50
  60. 75% <= 71.00
  61. 95% <= 95.90
  62. 98% <= 97.00
  63. 99% <= 97.00
  64. 99.9% <= 97.00
  65.  
  66. 14-2-17 19:39:14 ===============================================================
  67.  
  68. -- Histograms ------------------------------------------------------------------
  69. com.netease.test.metrics.TestHistograms.random
  70. count = 60
  71. min = 0
  72. max = 97
  73. mean = 41.17
  74. stddev = 28.60
  75. median = 34.50
  76. 75% <= 69.75
  77. 95% <= 92.90
  78. 98% <= 96.56
  79. 99% <= 97.00
  80. 99.9% <= 97.00
  81.  
  82. 14-2-17 19:39:17 ===============================================================
  83.  
  84. -- Histograms ------------------------------------------------------------------
  85. com.netease.test.metrics.TestHistograms.random
  86. count = 90
  87. min = 0
  88. max = 97
  89. mean = 44.67
  90. stddev = 28.47
  91. median = 43.00
  92. 75% <= 71.00
  93. 95% <= 91.90
  94. 98% <= 96.18
  95. 99% <= 97.00
  96. 99.9% <= 97.00
  97. */

5.       Timers

Timers主要是用来统计某一块代码段的执行时间以及其分布情况,具体是基于Histograms和Meters来实现的。样例代码如下:

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.MetricRegistry;
  5. import com.codahale.metrics.Timer;
  6.  
  7. import java.util.Random;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. import static com.codahale.metrics.MetricRegistry.name;
  11.  
  12. /**
  13. * User: hzwangxx
  14. * Date: 14-2-17
  15. * Time: 18:34
  16. * 测试Timers
  17. */
  18. public class TestTimers {
  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. * 实例化一个Meter
  31. */
  32. // private static final Timer requests = metrics.timer(name(TestTimers.class, "request"));
  33. private static final Timer requests = metrics.timer(name(TestTimers.class, "request"));
  34.  
  35. public static void handleRequest(int sleep) {
  36. Timer.Context context = requests.time();
  37. try {
  38. //some operator
  39. Thread.sleep(sleep);
  40. } catch (InterruptedException e) {
  41. e.printStackTrace();
  42. } finally {
  43. context.stop();
  44. }
  45.  
  46. }
  47.  
  48. public static void main(String[] args) throws InterruptedException {
  49. reporter.start(3, TimeUnit.SECONDS);
  50. Random random = new Random();
  51. while(true){
  52. handleRequest(random.nextInt(1000));
  53. }
  54. }
  55.  
  56. }
  57.  
  58. /*
  59. 14-2-18 9:31:54 ================================================================
  60.  
  61. -- Timers ----------------------------------------------------------------------
  62. com.netease.test.metrics.TestTimers.request
  63. count = 4
  64. mean rate = 1.33 calls/second
  65. 1-minute rate = 0.00 calls/second
  66. 5-minute rate = 0.00 calls/second
  67. 15-minute rate = 0.00 calls/second
  68. min = 483.07 milliseconds
  69. max = 901.92 milliseconds
  70. mean = 612.64 milliseconds
  71. stddev = 196.32 milliseconds
  72. median = 532.79 milliseconds
  73. 75% <= 818.31 milliseconds
  74. 95% <= 901.92 milliseconds
  75. 98% <= 901.92 milliseconds
  76. 99% <= 901.92 milliseconds
  77. 99.9% <= 901.92 milliseconds
  78.  
  79. 14-2-18 9:31:57 ================================================================
  80.  
  81. -- Timers ----------------------------------------------------------------------
  82. com.netease.test.metrics.TestTimers.request
  83. count = 8
  84. mean rate = 1.33 calls/second
  85. 1-minute rate = 1.40 calls/second
  86. 5-minute rate = 1.40 calls/second
  87. 15-minute rate = 1.40 calls/second
  88. min = 41.07 milliseconds
  89. max = 968.19 milliseconds
  90. mean = 639.50 milliseconds
  91. stddev = 306.12 milliseconds
  92. median = 692.77 milliseconds
  93. 75% <= 885.96 milliseconds
  94. 95% <= 968.19 milliseconds
  95. 98% <= 968.19 milliseconds
  96. 99% <= 968.19 milliseconds
  97. 99.9% <= 968.19 milliseconds
  98.  
  99. 14-2-18 9:32:00 ================================================================
  100.  
  101. -- Timers ----------------------------------------------------------------------
  102. com.netease.test.metrics.TestTimers.request
  103. count = 15
  104. mean rate = 1.67 calls/second
  105. 1-minute rate = 1.40 calls/second
  106. 5-minute rate = 1.40 calls/second
  107. 15-minute rate = 1.40 calls/second
  108. min = 41.07 milliseconds
  109. max = 968.19 milliseconds
  110. mean = 591.35 milliseconds
  111. stddev = 302.96 milliseconds
  112. median = 650.56 milliseconds
  113. 75% <= 838.07 milliseconds
  114. 95% <= 968.19 milliseconds
  115. 98% <= 968.19 milliseconds
  116. 99% <= 968.19 milliseconds
  117. 99.9% <= 968.19 milliseconds
  118.  
  119. */

Health Checks

Metrics提供了一个独立的模块:Health Checks,用于对Application、其子模块或者关联模块的运行是否正常做检测。该模块是独立metrics-core模块的,使用时则导入metrics-healthchecks包。

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

使用起来和与上述几种类型的Metrics有点类似,但是需要重新实例化一个Metrics容器HealthCheckRegistry,待检测模块继承抽象类HealthCheck并实现check()方法即可,然后将该模块注册到HealthCheckRegistry中,判断的时候通过isHealthy()接口即可。如下示例代码:

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.health.HealthCheck;
  4. import com.codahale.metrics.health.HealthCheckRegistry;
  5.  
  6. import java.util.Map;
  7. import java.util.Random;
  8.  
  9. /**
  10. * User: hzwangxx
  11. * Date: 14-2-18
  12. * Time: 9:57
  13. */
  14. public class DatabaseHealthCheck extends HealthCheck{
  15. private final Database database;
  16.  
  17. public DatabaseHealthCheck(Database database) {
  18. this.database = database;
  19. }
  20.  
  21. @Override
  22. protected Result check() throws Exception {
  23. if (database.ping()) {
  24. return Result.healthy();
  25. }
  26. return Result.unhealthy("Can't ping database.");
  27. }
  28.  
  29. /**
  30. * 模拟Database对象
  31. */
  32. static class Database {
  33. /**
  34. * 模拟database的ping方法
  35. * @return 随机返回boolean值
  36. */
  37. public boolean ping() {
  38. Random random = new Random();
  39. return random.nextBoolean();
  40. }
  41. }
  42.  
  43. public static void main(String[] args) {
  44. // MetricRegistry metrics = new MetricRegistry();
  45. // ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  46. HealthCheckRegistry registry = new HealthCheckRegistry();
  47. registry.register("database1", new DatabaseHealthCheck(new Database()));
  48. registry.register("database2", new DatabaseHealthCheck(new Database()));
  49. while (true) {
  50. for (Map.Entry<String, Result> entry : registry.runHealthChecks().entrySet()) {
  51. if (entry.getValue().isHealthy()) {
  52. System.out.println(entry.getKey() + ": OK");
  53. } else {
  54. System.err.println(entry.getKey() + ": FAIL, error message: " + entry.getValue().getMessage());
  55. final Throwable e = entry.getValue().getError();
  56. if (e != null) {
  57. e.printStackTrace();
  58. }
  59. }
  60. }
  61. try {
  62. Thread.sleep(1000);
  63. } catch (InterruptedException e) {
  64.  
  65. }
  66. }
  67. }
  68. }
  69.  
  70. /*
  71. console output:
  72. database1: OK
  73. database2: FAIL, error message: Can't ping database.
  74. database1: FAIL, error message: Can't ping database.
  75. database2: OK
  76. database1: OK
  77. database2: FAIL, error message: Can't ping database.
  78. database1: FAIL, error message: Can't ping database.
  79. database2: OK
  80. database1: FAIL, error message: Can't ping database.
  81. database2: FAIL, error message: Can't ping database.
  82. database1: FAIL, error message: Can't ping database.
  83. database2: FAIL, error message: Can't ping database.
  84. database1: OK
  85. database2: OK
  86. database1: OK
  87. database2: FAIL, error message: Can't ping database.
  88. database1: FAIL, error message: Can't ping database.
  89. database2: OK
  90. database1: OK
  91. database2: OK
  92. database1: FAIL, error message: Can't ping database.
  93. database2: OK
  94. database1: OK
  95. database2: OK
  96. database1: OK
  97. database2: OK
  98. database1: OK
  99. database2: FAIL, error message: Can't ping database.
  100. database1: FAIL, error message: Can't ping database.
  101. database2: FAIL, error message: Can't ping database.
  102.  
  103. */

其他支持

metrics提供了对Ehcache、Apache HttpClient、JDBI、Jersey、Jetty、Log4J、Logback、JVM等的集成,可以方便地将Metrics输出到Ganglia、Graphite中,供用户图形化展示。

参考资料

http://metrics.codahale.com/

https://github.com/dropwizard/metrics

http://blog.csdn.net/scutshuxue/article/details/8350135

http://blog.synyx.de/2013/09/yammer-metrics-made-easy-part-i/

http://blog.synyx.de/2013/09/yammer-metrics-made-easy-part-ii/

http://wiki.apache.org/hadoop/HADOOP-6728-MetricsV2

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

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

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

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

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

  3. as3+java+mysql(mybatis) 数据自动工具(二)

    AutoScript 项目结构如下图 ---AutoScript.java 为程序入口 ---com.autoscript.object 同步 as3 和 java 的数据类 ---com.autos ...

  4. 数据结构Java版之深度优先-图(十二)

    这里用深度优先遍历存在矩阵里面的图. 深度优先利用的是栈的FIFO特性.为此遍历到底后,可以找到最相邻的节点继续遍历.实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了. 源码 ...

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

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

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

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

  7. java版MD5签名工具类

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

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

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

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

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

随机推荐

  1. io流(详询请加qq:2085920154)

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ioTest ...

  2. WINDOWS下绑定ARP绑定网关

    一.WINDOWS下绑定ARP绑定网关步骤一:在能正常上网时,进入MS-DOS窗口,输入命令:arp -a,查看网关的IP对应的正确MAC地址, 并将其记录下来.注意:如果已经不能上网,则先运行一次命 ...

  3. Android框架之AndroidAnnotations基础

    一:开源网址 https://github.com/excilys/androidannotations/wiki 二:AndroidAnnotation特点 (1)依赖注入 可以注入 views, ...

  4. WPF Image控件的Source属性是一个ImageSource对象

    1.固定的图片路径是可以的,如下: <Image Source="../test.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的 ...

  5. webform的页面缓存

    给页面添加<%@ OutputCache Duration="10" VaryByParam="*"%>标签就可以启用页面缓存. Duration表 ...

  6. cv_prj2

    Computer Vision Project 2 – Harris Corner Detector 姓名: 王兴路 学号: 3140102282 指导老师: 宋明黎 2016-12-16 19:30 ...

  7. ibatis 批量插入oracle总结

    1. 使用批量插入最先想到如下的插入语句 insert into a (id,name) values('','') ,('','') 但是 oracle 并不支持这种写法 然后查询得知可以使用如下写 ...

  8. vSphere6提示已弃用VMFS卷的解决方法

    Deprecated VMFS volume(s) found on the host. Please consider upgrading volume(s) to the latest versi ...

  9. [转载]centos7 快速安装 mariadb(mysql)

    http://blog.csdn.net/default7/article/details/41973887 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! yum ins ...

  10. ie8 iframe去掉边框的属性

    <iframe src="" id="Iframe" height="200" frameborder="0" s ...