最近在写一个小应用,有些计量方式觉得可以参考一下Metrics,所以打算花两天的时间学习一下这个工具。
Overview
Metrics是一个java监控计量工具包。在Spark、Hadoop、Spring等软件中都可以看到它的影子。Metrics提供了多种指标工具,如Gauge、Counter、Metrer、Timer、Histogram以及HealthCheck等。
这次先看一下Gauge,其他的看时间再逐个学习。
Gauge
可以说是Metrics的最简单的一个指标:它的作用就是引用一个值。
来看个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class GaugeShow { public static void main(String[] args) throws InterruptedException { final MetricRegistry metrics = new MetricRegistry(); ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build(); reporter.start(3, TimeUnit.SECONDS); Gauge<String> gauge = new Gauge<String>() { @Override public String getValue() { return new SimpleDateFormat("MM-dd HH:mm:ss").format(new Date()); } }; metrics.register("时间计时", gauge); for (int i = 0; i < 3; i++) { TimeUnit.SECONDS.sleep(3); } } } |
代码中通过匿名类的形式创建了一个Gauge接口的实例,作用是获取当前的时间。实现得非常简单,不需要多做解释。
因为Gauge接口只有一个方法getValue,是一个函数接口,所以可以考虑用lambda表达式创建Gauge接口实例:
1 |
Gauge<String> gauge = () -> new SimpleDateFormat("MM-dd HH:mm:ss").format(new Date()); |
既然Gauge这么简单,为什么不直接使用Gauge的值,还偏要用Gauge接口封装一下?是为了能在Metrics框架中记录并表示这个值。
Metrics框架中有几个基础概念:MetricRegistry、Reporter以及Metric。Metric前面提过两句,也演示了Metric之一的Gauge的用法。接下来简单介绍下MetricRegistry和Reporter。
MetricRegistry
MetricRegistry的作用从类名就可以看出来:是Metric的注册中心(或者说是Metric容器),负责管理用户创建的所有Metric实例。
MetricRegistry主要提供了几种工具方法:
- 指标名称创建
- 创建Metric实例并自动注册
- 增删Metric实例
- 对注册的Metric实例应用监听器和过滤器
Reporter接口
从接口名称看起来,Reporter的作用应该是汇总指标实例的数据并生成报表。
Reporter接口的主要子类是ScheduledReporter
,其核心是ScheduledExecutorService
和ScheduledFuture
,用来管理报表的定时输出。ScheduledReporter
的子类包括ConsoleReporter
、CsvReporter
和Slf4jReporter
,可以以不同的形式展示报表数据。
在4.x版本以前,Reporter接口还有实现一个类JmxReporter
,可以通过JMX的形式输出报表数据。
扫了几个Reporter的实现,看出Reporter确实主要用来生成报表。不过也许是Metrics框架想要提供更多的自由,Reporter接口里并没有定义任何需要实现的方法:
1 2 3 4 5 6 |
/* * A tag interface to indicate that a class is a Reporter. */ public interface Reporter extends Closeable { } |
如果需要以自定义的形式输出报表数据,可以继承ScheduledReporter
类或实现Report
接口来实现自己的需求,比如将报表数据以HTTP发送给统计应用。
Other
最后,看一下示例代码的执行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-- Gauges ---------------------------------------------------------------------- 时间计时 value = 06-19 09:17:32 19-6-19 9:17:35 ================================================================ -- Gauges ---------------------------------------------------------------------- 时间计时 value = 06-19 09:17:35 19-6-19 9:17:38 ================================================================ -- Gauges ---------------------------------------------------------------------- 时间计时 value = 06-19 09:17:38 |
发表评论