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
最简单的度量指标,每次相当于重置这个值。
- package com.alibaba.cxf.test.metric;
-
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.concurrent.TimeUnit;
-
- import com.yammer.metrics.Metrics;
- import com.yammer.metrics.core.Counter;
- import com.yammer.metrics.core.Gauge;
- import com.yammer.metrics.reporting.ConsoleReporter;
-
- /**
- * TODO
- * @author scutshuxue.chenxf
- */
- public class TestGauges {
- public static Queue<String> queue = new LinkedList<String>();
-
- public static void main(String[] args) throws InterruptedException{
- ConsoleReporter.enable(5,TimeUnit.SECONDS);
-
- Gauge<Integer>g = Metrics.newGauge(TestGauges.class, "pending-jobs", newGauge<Integer>() {
- @Override
- public Integer value() {
- return queue.size();
- }
- });
- queue.add("ssss");
- System.out.println(g.value());
- while(true){
- Thread.sleep(1000);
- }
- }
- }
执行效果如下:
- 12-12-20 14:48:53==============================================================
- com.alibaba.cxf.test.metric.TestGauges:
- pending-jobs:
- value = 1
代码中都增加了ConsoleReporter.enable(1, TimeUnit.SECONDS);语句,通过这个命令,可以每秒钟将度量指标打印在屏幕上,理解起来会有更清楚的理解。
Counter,计数器
- package com.alibaba.cxf.test.metric;
-
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.concurrent.TimeUnit;
-
- import com.yammer.metrics.Metrics;
- import com.yammer.metrics.core.Counter;
- import com.yammer.metrics.reporting.ConsoleReporter;
-
- /**
- * TODO
- * @author scutshuxue.chenxf
- */
- public class TestCounter {
-
- private final Counter pendingJobs = Metrics.newCounter(TestCounter.class, "pending-jobs");
- private final Queue<String> queue = new LinkedList<String>();
-
- public void add(Stringstr) {
- pendingJobs.inc();
- queue.offer(str);
- }
-
- public String take() {
- pendingJobs.dec();
- return queue.poll();
- }
- /**
- * TODO
- * @author scutshuxue.chenxf
- * @param args
- * void
- * @throws InterruptedException
- */
- public static void main(String[]args) throws InterruptedException {
- // TODOAuto-generated method stub
- TestCounter tc =new TestCounter();
- ConsoleReporter.enable(1,TimeUnit.SECONDS);
- while(true){
- tc.add("1");
- Thread.sleep(1000);
- }
- }
-
- }
效果如下:
- 12-12-20 14:48:53==============================================================
- com.alibaba.cxf.test.metric.TestGauges:
- pending-jobs:
- value = 1
Meters
Meters会将最近1分钟,5分钟,15分钟的TPS(每秒处理的request数)给打印出来,还有所有时间的TPS。
- package com.alibaba.cxf.test.metric;
-
- import java.util.concurrent.TimeUnit;
-
- import com.yammer.metrics.Metrics;
- import com.yammer.metrics.core.Meter;
- import com.yammer.metrics.reporting.ConsoleReporter;
-
- /**
- * TODO
- * @author scutshuxue.chenxf
- */
- public class TestMeters {
- private static Meter meter = Metrics.newMeter(TestMeters.class, "requests","requests", TimeUnit.SECONDS);
-
- public static void main(String[] args) throws InterruptedException{
- ConsoleReporter.enable(1,TimeUnit.SECONDS);
- while(true){
- meter.mark();
- meter.mark();
- Thread.sleep(1000);
- }
- }
- }
效果如下:
- 12-12-20 15:02:50==============================================================
- com.alibaba.cxf.test.metric.TestMeters:
- requests:
- count = 20
- mean rate = 2.20requests/s
- 1-minute rate = 2.00requests/s
- 5-minute rate = 2.00requests/s
- 15-minute rate = 2.00requests/s
Histograms 直方图
最大值,最小值,平均值,方差,中位值,百分比数据,如75%,90%,98%,99%的数据在哪个范围内。
- package com.alibaba.cxf.test.metric;
-
- import java.util.concurrent.TimeUnit;
-
- import com.yammer.metrics.Metrics;
- import com.yammer.metrics.core.Histogram;
- import com.yammer.metrics.reporting.ConsoleReporter;
-
- /**
- * TODO
- * @author scutshuxue.chenxf
- */
- public class TestHistograms {
- private static Histogram histo = Metrics.newHistogram(TestHistograms.class,"histo-sizes");
-
- /**
- * TODO
- * @author scutshuxue.chenxf
- * @param args
- * void
- * @throws InterruptedException
- */
- public static void main(String[] args) throws InterruptedException {
- // TODOAuto-generated method stub
-
- ConsoleReporter.enable(1,TimeUnit.SECONDS);
- int i=0;
- while(true){
- histo.update(i++);
- Thread.sleep(1000);
- }
- }
-
- }
效果如下:
- com.alibaba.cxf.test.metric.TestHistograms:
- histo-sizes:
- min = 0.00
- max = 5.00
- mean = 2.50
- stddev = 1.87
- median = 2.50
- 75% <= 4.25
- 95% <= 5.00
- 98% <= 5.00
- 99% <= 5.00
- 99.9% <= 5.00
Timers
时间统计
- package com.alibaba.cxf.test.metric;
-
- import java.util.Random;
- import java.util.concurrent.TimeUnit;
-
- import com.yammer.metrics.Metrics;
- import com.yammer.metrics.core.Timer;
- import com.yammer.metrics.core.TimerContext;
- import com.yammer.metrics.reporting.ConsoleReporter;
-
- /**
- * TODO
- * @author scutshuxue.chenxf
- */
- public class TestTimers {
- private static Timer timer = Metrics.newTimer(TestTimers.class, "responses", TimeUnit.MILLISECONDS,TimeUnit.SECONDS);
- /**
- * TODO
- * @author scutshuxue.chenxf
- * @param args
- * void
- * @throws InterruptedException
- */
- public static voidmain(String[] args) throws InterruptedException {
- // TODOAuto-generated method stub
- ConsoleReporter.enable(2,TimeUnit.SECONDS);
- Random rn = newRandom();
- timer.time();
- System.out.println();
- while(true){
- TimerContextcontext = timer.time();
-
- Thread.sleep(rn.nextInt(1000));
- context.stop();
- }
- }
-
- }
效果如下:
- com.alibaba.cxf.test.metric.TestTimers:
- responses:
- count = 26
- mean rate = 2.15calls/s
- 1-minute rate = 1.70calls/s
- 5-minute rate = 1.62calls/s
- 15-minute rate = 1.61calls/s
- min = 35.47ms
- max = 878.76ms
- mean = 462.50ms
- stddev = 284.91ms
- median = 419.90ms
- 75% <=764.13ms
- 95% <=877.76ms
- 98% <=878.76ms
- 99% <=878.76ms
- 99.9% <=878.76ms
Health Checks
健康检查,如心跳:
- package com.alibaba.cxf.test.metric;
-
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Random;
- import java.util.concurrent.TimeUnit;
-
- import com.yammer.metrics.HealthChecks;
- import com.yammer.metrics.core.HealthCheck;
- import com.yammer.metrics.reporting.ConsoleReporter;
-
- public class DatabaseHealthCheck extends HealthCheck {
- private static Databasedatabase;
- private static final Map<String, Result> results = HealthChecks.runHealthChecks();
-
- public DatabaseHealthCheck(Databasedatabase) {
- super("database");
- this.database =database;
- }
-
- @Override
- public Result check()throws Exception {
-
- if(database.isConnected()) {
- returnResult.healthy();
- } else {
- return Result.unhealthy("Cannotconnect to database" );
- }
- }
-
- public static void main(String[] args) throws Exception{
- Database db = new Database();
- DatabaseHealthCheck checkHealth = new DatabaseHealthCheck(db);
- HealthChecks.register(checkHealth);
-
- while(true){
- Map<String,Result> results = HealthChecks.runHealthChecks();
- for(Entry<String, Result> entry : results.entrySet()) {
- if (entry.getValue().isHealthy()) {
- System.out.println(entry.getKey() +" is healthy");
- } else {
- System.err.println(entry.getKey() +" is UNHEALTHY: " + entry.getValue().getMessage());
- }
- }
- Thread.sleep(1000);
- }
- }
- }
- class Database{
- static Random rn = newRandom();
-
- public booleanisConnected() {
- // TODOAuto-generated method stub
- returnrn.nextBoolean();
- }
-
- }
效果如下:
- com.alibaba.cxf.test.metric.TestTimers:
- responses:
- count = 26
- mean rate = 2.15calls/s
- 1-minute rate = 1.70calls/s
- 5-minute rate = 1.62calls/s
- 15-minute rate = 1.61calls/s
- min = 35.47ms
- max = 878.76ms
- mean = 462.50ms
- stddev = 284.91ms
- median = 419.90ms
- 75% <=764.13ms
- 95% <=877.76ms
- 98% <=878.76ms
- 99% <=878.76ms
- 99.9% <=878.76ms
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。