dropwizard metrics类初体验

  |   0 评论   |   0 浏览

背景

以前自己写过一个Metrics类非常好用。可惜在新公司,还是用传统的Metrics类吧。

在Spring Boot 2中,使用Micrometer取代了Dropwizard指标。

初体验

pom

<dependency>
   <groupId>io.dropwizard.metrics</groupId>
   <artifactId>metrics-core</artifactId>
   <version>4.2.9</version>
</dependency>

Metric类型

Gauges

Gauge是最简单的度量类型,存储了一个double类型的值,所以一般用它记录系统的一些即时值,比如最近的一次的内存占用或者是系统CPU百分比。

Counter

Counter顾名思义是计数器的意思,用于存储一个64位长计数器,由应用系统的代码逻辑控制Counter的自增或自减。而且该计数器是支持明细计数的,Counter保持一个总的计数,并且保持一个子项的计数明细数组。

计数器可以用来记录当前系统的并发数。在进入调用时计数器自增,退出之前自减。并且还可以支持使用一个Counter实现针对各个接口进行明细统计。

Histograms

Histogram直方图,度量流数据中Value的分布情况,将会计算最大/最小、平均值、方差、分位数(75%,90%,98%,99%的数据在哪个范围)。例如可以统计每一个POST请求中的内容的大小或者处理所花的时间。

Meters

Meter度量的是事件在一定单位时间内发生的次数。比如单位时间内事件发生的平均次数,或者1分钟、5分钟或15分钟内发生次数的滑动平均值。可以使用Meter统计异常发生的频率。

Timer

Timer是Histogram跟Meter的一个组合,他在Meter的基础上,增加了对处理耗时的Histogram的度量,并且他还度量了一个ActiveSession的值,他代表了一个并发数。Timer是五种度量里最复杂的度量类型。

使用

Gauges

import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.MetricRegistry;

import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

public class MainMetric {
    public static void main(String[] args) throws InterruptedException {
        MetricRegistry metric = new MetricRegistry();

        // 在控制台上打印,每3秒打印一次。
        ConsoleReporter reporter = ConsoleReporter.forRegistry(metric).build();
        reporter.start(3, TimeUnit.SECONDS);

        //实例化一个Gauge
        Queue<String> queue = new LinkedBlockingQueue<>();
        Gauge<Integer> gauge = new Gauge<Integer>() {
            @Override
            public Integer getValue() {
                return queue.size();
            }
        };

        //注册到容器中
        metric.register(MetricRegistry.name(MainMetric.class, "pending-job", "size"), gauge);

        //模拟数据
        for (int i = 0; i < 20; i++) {
            queue.add("a");
            Thread.sleep(1000);
        }
    }
}

结果

22-4-3 12:48:33 ===============================================

-- Gauges ------------------------------------------------------------
MainMetric.pending-job.size
             value = 10


22-4-3 12:48:36 ===================================

-- Gauges -------------------------------------------------------------
MainMetric.pending-job.size
             value = 13

Meter

Meter meter = new Meter();

BotMetric.getMeterMap().putIfAbsent("xf_asr_rate", meter);

meter.mark();



参考

  1. Java实时监控类库Metrics
  2. Metrics-Java版的指标度量工具之一
  3. Metrics-Java版的指标度量工具之二