打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JAVA Metrics 度量工具使用介绍1

Java Metric使用介绍1

Metrics是一个给JAVA提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia、Graphite结合,方便的提供图形化接口。

         下面简单介绍下Metrics如何使用。

Maven地址:

只需要增加metrics-core即可使用

    <dependency>
        <groupId>com.yammer.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>2.2.0</version>
    </dependency>

 

源文档 <http://metrics.codahale.com/getting-started/>

 

下面通过一些测试代码介绍Metrics每个组件的使用,比较简单,基本看代码就懂了,这里不做过多介绍,请结合http://metrics.codahale.com/getting-started/介绍一起看,这里相当于完善代码。

Gauges

最简单的度量指标,每次相当于重置这个值。

  1. package com.alibaba.cxf.test.metric;  
  2.    
  3. import java.util.LinkedList;  
  4. import java.util.Queue;  
  5. import java.util.concurrent.TimeUnit;  
  6.    
  7. import com.yammer.metrics.Metrics;  
  8. import com.yammer.metrics.core.Counter;  
  9. import com.yammer.metrics.core.Gauge;  
  10. import com.yammer.metrics.reporting.ConsoleReporter;  
  11.    
  12. /** 
  13.  * TODO 
  14.  * @author scutshuxue.chenxf 
  15.  */  
  16. public class TestGauges {  
  17.         public static Queue<String> queue = new LinkedList<String>();  
  18.    
  19.         public static void main(String[] args) throws InterruptedException{  
  20.                ConsoleReporter.enable(5,TimeUnit.SECONDS);  
  21.    
  22.                Gauge<Integer>g = Metrics.newGauge(TestGauges.class"pending-jobs", newGauge<Integer>() {  
  23.                    @Override  
  24.                    public Integer value() {  
  25.                        return queue.size();  
  26.                    }  
  27.                });  
  28.                queue.add("ssss");  
  29.                System.out.println(g.value());  
  30.                while(true){  
  31.                        Thread.sleep(1000);  
  32.                }  
  33.         }  
  34. }  


执行效果如下:

  1. 12-12-20 14:48:53==============================================================  
  2. com.alibaba.cxf.test.metric.TestGauges:  
  3.   pending-jobs:  
  4.     value = 1  


 

 

代码中都增加了ConsoleReporter.enable(1, TimeUnit.SECONDS);语句,通过这个命令,可以每秒钟将度量指标打印在屏幕上,理解起来会有更清楚的理解。

 

Counter,计数器

  1. package com.alibaba.cxf.test.metric;  
  2.    
  3. import java.util.LinkedList;  
  4. import java.util.Queue;  
  5. import java.util.concurrent.TimeUnit;  
  6.    
  7. import com.yammer.metrics.Metrics;  
  8. import com.yammer.metrics.core.Counter;  
  9. import com.yammer.metrics.reporting.ConsoleReporter;  
  10.    
  11. /** 
  12.  * TODO 
  13.  * @author scutshuxue.chenxf 
  14.  */  
  15. public class TestCounter {  
  16.    
  17.         private final Counter pendingJobs = Metrics.newCounter(TestCounter.class"pending-jobs");  
  18.         private final Queue<String> queue = new LinkedList<String>();  
  19.    
  20.         public void add(Stringstr) {  
  21.             pendingJobs.inc();  
  22.             queue.offer(str);  
  23.         }  
  24.    
  25.         public String take() {  
  26.             pendingJobs.dec();  
  27.             return queue.poll();  
  28.         }  
  29.         /** 
  30.          * TODO 
  31.          * @author scutshuxue.chenxf 
  32.          * @param args 
  33.          * void 
  34.          * @throws InterruptedException 
  35.          */  
  36.         public static void main(String[]args) throws InterruptedException {  
  37.                // TODOAuto-generated method stub  
  38.                TestCounter tc =new TestCounter();  
  39.                ConsoleReporter.enable(1,TimeUnit.SECONDS);  
  40.                while(true){  
  41.                        tc.add("1");  
  42.                        Thread.sleep(1000);  
  43.                }  
  44.         }  
  45.    
  46. }  


 

效果如下:

  1. 12-12-20 14:48:53==============================================================  
  2. com.alibaba.cxf.test.metric.TestGauges:  
  3.   pending-jobs:  
  4.     value = 1  


 

Meters

Meters会将最近1分钟,5分钟,15分钟的TPS(每秒处理的request数)给打印出来,还有所有时间的TPS。

 

  1. package com.alibaba.cxf.test.metric;  
  2.    
  3. import java.util.concurrent.TimeUnit;  
  4.    
  5. import com.yammer.metrics.Metrics;  
  6. import com.yammer.metrics.core.Meter;  
  7. import com.yammer.metrics.reporting.ConsoleReporter;  
  8.    
  9. /** 
  10.  * TODO 
  11.  * @author scutshuxue.chenxf 
  12.  */  
  13. public class TestMeters {  
  14.         private static Meter meter = Metrics.newMeter(TestMeters.class"requests","requests", TimeUnit.SECONDS);  
  15.    
  16.         public static void main(String[] args) throws InterruptedException{  
  17.                ConsoleReporter.enable(1,TimeUnit.SECONDS);  
  18.                while(true){  
  19.                        meter.mark();  
  20.                        meter.mark();  
  21.                        Thread.sleep(1000);  
  22.                }  
  23.         }  
  24. }  


效果如下:

  1. 12-12-20 15:02:50==============================================================  
  2. com.alibaba.cxf.test.metric.TestMeters:  
  3.   requests:  
  4.              count = 20  
  5.          mean rate = 2.20requests/s  
  6.      1-minute rate = 2.00requests/s  
  7.      5-minute rate = 2.00requests/s  
  8. 15-minute rate = 2.00requests/s  


Histograms 直方图

最大值,最小值,平均值,方差,中位值,百分比数据,如75%,90%,98%,99%的数据在哪个范围内。

 

  1. package com.alibaba.cxf.test.metric;  
  2.    
  3. import java.util.concurrent.TimeUnit;  
  4.    
  5. import com.yammer.metrics.Metrics;  
  6. import com.yammer.metrics.core.Histogram;  
  7. import com.yammer.metrics.reporting.ConsoleReporter;  
  8.    
  9. /** 
  10.  * TODO 
  11.  * @author scutshuxue.chenxf 
  12.  */  
  13. public class TestHistograms {  
  14.         private static Histogram histo = Metrics.newHistogram(TestHistograms.class,"histo-sizes");  
  15.    
  16.         /** 
  17.          * TODO 
  18.          * @author scutshuxue.chenxf 
  19.          * @param args 
  20.          * void 
  21.          * @throws InterruptedException 
  22.          */  
  23.         public static void main(String[] args) throws InterruptedException {  
  24.                // TODOAuto-generated method stub  
  25.                 
  26.                ConsoleReporter.enable(1,TimeUnit.SECONDS);  
  27.                int i=0;  
  28.                while(true){  
  29.                        histo.update(i++);  
  30.                        Thread.sleep(1000);  
  31.                }  
  32.         }  
  33.    
  34. }  


效果如下:

  1. com.alibaba.cxf.test.metric.TestHistograms:  
  2.   histo-sizes:  
  3.                min = 0.00  
  4.                max = 5.00  
  5.               mean = 2.50  
  6.             stddev = 1.87  
  7.             median = 2.50  
  8.               75% <= 4.25  
  9.               95% <= 5.00  
  10.               98% <= 5.00  
  11.               99% <= 5.00  
  12.             99.9% <= 5.00  



Timers

时间统计

  1. package com.alibaba.cxf.test.metric;  
  2.    
  3. import java.util.Random;  
  4. import java.util.concurrent.TimeUnit;  
  5.    
  6. import com.yammer.metrics.Metrics;  
  7. import com.yammer.metrics.core.Timer;  
  8. import com.yammer.metrics.core.TimerContext;  
  9. import com.yammer.metrics.reporting.ConsoleReporter;  
  10.    
  11. /** 
  12.  * TODO 
  13.  * @author scutshuxue.chenxf 
  14.  */  
  15. public class TestTimers {  
  16.         private static Timer timer = Metrics.newTimer(TestTimers.class"responses", TimeUnit.MILLISECONDS,TimeUnit.SECONDS);  
  17.         /** 
  18.          * TODO 
  19.          * @author scutshuxue.chenxf 
  20.          * @param args 
  21.          * void 
  22.          * @throws InterruptedException 
  23.          */  
  24.         public static voidmain(String[] args) throws InterruptedException {  
  25.                // TODOAuto-generated method stub  
  26.                ConsoleReporter.enable(2,TimeUnit.SECONDS);  
  27.                Random rn = newRandom();  
  28.                timer.time();  
  29.                System.out.println();  
  30.                while(true){  
  31.                        TimerContextcontext = timer.time();  
  32.                         
  33.                        Thread.sleep(rn.nextInt(1000));  
  34.                        context.stop();  
  35.                }  
  36.         }  
  37.    
  38. }  


效果如下:

  1. com.alibaba.cxf.test.metric.TestTimers:  
  2.   responses:  
  3.              count = 26  
  4.          mean rate = 2.15calls/s  
  5.      1-minute rate = 1.70calls/s  
  6.      5-minute rate = 1.62calls/s  
  7.     15-minute rate = 1.61calls/s  
  8.                min = 35.47ms  
  9.                max = 878.76ms  
  10.               mean = 462.50ms  
  11.             stddev = 284.91ms  
  12.             median = 419.90ms  
  13.               75% <=764.13ms  
  14.               95% <=877.76ms  
  15.               98% <=878.76ms  
  16.               99% <=878.76ms  
  17.             99.9% <=878.76ms  


 

Health Checks

健康检查,如心跳:

 

  1. package com.alibaba.cxf.test.metric;  
  2.    
  3. import java.util.Map;  
  4. import java.util.Map.Entry;  
  5. import java.util.Random;  
  6. import java.util.concurrent.TimeUnit;  
  7.    
  8. import com.yammer.metrics.HealthChecks;  
  9. import com.yammer.metrics.core.HealthCheck;  
  10. import com.yammer.metrics.reporting.ConsoleReporter;  
  11.    
  12. public class DatabaseHealthCheck extends HealthCheck {  
  13.     private static Databasedatabase;  
  14.         private static final Map<String, Result> results = HealthChecks.runHealthChecks();  
  15.    
  16.     public DatabaseHealthCheck(Databasedatabase) {  
  17.        super("database");  
  18.         this.database =database;  
  19.     }  
  20.    
  21.     @Override  
  22.     public Result check()throws Exception {  
  23.          
  24.         if(database.isConnected()) {  
  25.             returnResult.healthy();  
  26.         } else {  
  27.             return Result.unhealthy("Cannotconnect to database" );  
  28.         }  
  29.     }  
  30.      
  31.     public static void main(String[] args) throws Exception{  
  32.         Database db = new Database();  
  33.         DatabaseHealthCheck checkHealth = new DatabaseHealthCheck(db);  
  34.                HealthChecks.register(checkHealth);  
  35.                 
  36.                while(true){  
  37.                        Map<String,Result> results = HealthChecks.runHealthChecks();  
  38.                        for(Entry<String, Result> entry : results.entrySet()) {  
  39.                            if (entry.getValue().isHealthy()) {  
  40.                                System.out.println(entry.getKey() +" is healthy");  
  41.                            } else {  
  42.                                System.err.println(entry.getKey() +" is UNHEALTHY: " + entry.getValue().getMessage());  
  43.                            }  
  44.                        }               
  45.                        Thread.sleep(1000);  
  46.                }  
  47.     }     
  48. }  
  49. class Database{  
  50.         static Random rn = newRandom();  
  51.          
  52.         public booleanisConnected() {  
  53.                // TODOAuto-generated method stub  
  54.                returnrn.nextBoolean();  
  55.         }  
  56.          
  57. }  


效果如下:

  1. com.alibaba.cxf.test.metric.TestTimers:  
  2.   responses:  
  3.              count = 26  
  4.          mean rate = 2.15calls/s  
  5.      1-minute rate = 1.70calls/s  
  6.      5-minute rate = 1.62calls/s  
  7.     15-minute rate = 1.61calls/s  
  8.                min = 35.47ms  
  9.                max = 878.76ms  
  10.               mean = 462.50ms  
  11.             stddev = 284.91ms  
  12.             median = 419.90ms  
  13.               75% <=764.13ms  
  14.               95% <=877.76ms  
  15.               98% <=878.76ms  
  16.               99% <=878.76ms  
  17.             99.9% <=878.76ms  


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java多线程
大数据IMF传奇行动绝密课程第75
如何实现漏桶算法与令牌桶算法
ScheduledExecutorService执行定时任务
Couchbase之环境搭建与基于Java的测试
叫号系统排队系统挂号系统实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服