55

Metrics学习01 – Gauge

 5 years ago
source link: https://www.tuicool.com/articles/Ebq2ArE
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近在写一个小应用,有些计量方式觉得可以参考一下Metrics,所以打算花两天的时间学习一下这个工具。

Overview

Metrics是一个java监控计量工具包。在Spark、Hadoop、Spring等软件中都可以看到它的影子。Metrics提供了多种指标工具,如Gauge、Counter、Metrer、Timer、Histogram以及HealthCheck等。

这次先看一下Gauge,其他的看时间再逐个学习。

Gauge 可以说是Metrics的最简单的一个指标:它的作用就是引用一个值。

来看个例子:

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接口实例:

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接口里并没有定义任何需要实现的方法:

/*
 * A tag interface to indicate that a class is a Reporter.
 */
public interface Reporter extends Closeable {
 
}

如果需要以自定义的形式输出报表数据,可以继承 ScheduledReporter 类或实现 Report 接口来实现自己的需求,比如将报表数据以HTTP发送给统计应用。

Other

最后,看一下示例代码的执行结果:

-- 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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK