dropwizard metrics类初体验
背景
以前自己写过一个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();