package org.springside.modules.metrics; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.ObjectName; import org.junit.Test; import org.springside.modules.metrics.exporter.JmxExporter; import org.springside.modules.metrics.metric.CachedGauge; import org.springside.modules.metrics.metric.Counter; import org.springside.modules.metrics.metric.Gauge; import org.springside.modules.metrics.metric.Histogram; import org.springside.modules.metrics.metric.Timer; import org.springside.modules.metrics.metric.Timer.TimerContext; import org.springside.modules.metrics.reporter.ConsoleReporter; import org.springside.modules.metrics.reporter.Slf4jReporter; /** * 示例分别使用ConsoleReporter与Slf4jReporter, 演示Counter, Histogram 和 Timer的用法. * * src/test/resources/logback.xml中已对Slf4jReporter进行配置 */ public class MetricExamples { @Test public void counterExample() throws InterruptedException { MetricRegistry metricRegistry = new MetricRegistry(); // 使用ConsoleReporter ConsoleReporter consoleReporter = new ConsoleReporter(); Counter counter = metricRegistry.counter(MetricRegistry.name("UserService", "getUser.counter")); ReportScheduler scheduler = new ReportScheduler(metricRegistry, consoleReporter); scheduler.start(1, TimeUnit.SECONDS); counter.inc(); Thread.sleep(1050); counter.inc(2); Thread.sleep(1050); scheduler.stop(); } @Test public void histogramExample() throws InterruptedException { MetricRegistry metricRegistry = new MetricRegistry(); // 使用slf4j reporter,并使用默认logger名字 Slf4jReporter slf4jReporter = new Slf4jReporter(); ReportScheduler scheduler = new ReportScheduler(metricRegistry, slf4jReporter); scheduler.start(1, TimeUnit.SECONDS); Histogram histogram = metricRegistry.histogram(MetricRegistry.name("UserService", "getUser.latency")); histogram.update(1); histogram.update(100); Thread.sleep(1050); // 增加百分位 histogram.setPcts(new Double[] { 99d, 99.95d }); histogram.update(2); histogram.update(200); Thread.sleep(1050); scheduler.stop(); } @Test public void timerExample() throws InterruptedException { MetricRegistry metricRegistry = new MetricRegistry(); // 使用slf4j reporter,并使用自定义logger名字 Slf4jReporter slf4jReporter = new Slf4jReporter("mymetrics"); ReportScheduler scheduler = new ReportScheduler(metricRegistry); scheduler.addReporter(slf4jReporter); scheduler.start(1, TimeUnit.SECONDS); Timer timer = metricRegistry.timer(MetricRegistry.name("UserService", "getUser.timer"), new Double[] { 99d, 99.99d }); // 写法1 TimerContext timerContext = timer.start(); Thread.sleep(100); timerContext.stop(); timerContext = timer.start(); Thread.sleep(200); timerContext.stop(); Thread.sleep(750); // 用法2 long start = System.currentTimeMillis(); Thread.sleep(150); timer.update(start); start = System.currentTimeMillis(); Thread.sleep(250); timer.update(start); Thread.sleep(650); scheduler.stop(); } @Test public void gaugeExample() throws InterruptedException { MetricRegistry metricRegistry = new MetricRegistry(); // 使用ConsoleReporter ConsoleReporter consoleReporter = new ConsoleReporter(); final MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); Gauge<Long> usedMemoryGague = new Gauge<Long>() { public Long getValue() { return memoryMXBean.getHeapMemoryUsage().getUsed(); } }; Gauge<Long> cachedUsedMemoryGague = new CachedGauge<Long>(10, TimeUnit.SECONDS) { public Long loadValue() { return memoryMXBean.getHeapMemoryUsage().getUsed(); } }; metricRegistry.registerGauge(MetricRegistry.name("JVM", "usedMemory"), usedMemoryGague); metricRegistry.registerGauge(MetricRegistry.name("JVM", "cachedUsedMemory"), cachedUsedMemoryGague); ReportScheduler scheduler = new ReportScheduler(metricRegistry, consoleReporter); scheduler.start(1, TimeUnit.SECONDS); Thread.sleep(1050); // use some memory List<Integer> list = new ArrayList<Integer>(200000); list.add(1); Thread.sleep(1050); scheduler.stop(); } @Test public void jmxExample() throws InterruptedException, Exception { MetricRegistry metricRegistry = new MetricRegistry(); Counter counter = metricRegistry.counter(MetricRegistry.name("UserService", "getUser.counter")); Timer timer = metricRegistry.timer(MetricRegistry.name("UserService", "getUser.timer"), new Double[] { 0.99d, 0.999d }); // 无reporter,only exporter JmxExporter jmxExporter = new JmxExporter("metrics-example", metricRegistry); jmxExporter.initMBeans(); ReportScheduler scheduler = new ReportScheduler(metricRegistry); scheduler.start(1, TimeUnit.SECONDS); counter.inc(); TimerContext timerContext = timer.start(); Thread.sleep(100); timerContext.stop(); Thread.sleep(950); counter.inc(2); Thread.sleep(1050); scheduler.stop(); // 校验MBean中的值 MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); System.out.println("TotalCount from MBean:" + mBeanServer .getAttribute(new ObjectName("metrics-example", "name", "UserService.getUser.counter"), "TotalCount") .toString()); } }