Micrometer简介
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。Micrometer 还支持推送数据到多个不同的监控系统。Micrometer类似日志系统中SLF4J。
Micrometer目前支持的监控系统有:
https://micrometer.io/docs
Micrometer中有两个最核心的概念,分别是是计量器(Meter)和计量器注册表(MeterRegistry),下面来分别看下这两个概念。
计量器(Meter)
Meter用来收集性能指标数据(Metris),总共有四种类型的Meter,分别是Counter,Gauge,Timer,Summary。
每个Meter都有自己的名称,同时Meter可以指定一系列的tag。tag是以key-value的形式出现,这样我们就可以根据tag对指标进行过滤。除了每个Meter独有的标签外,也可以通过MeterRegistry添加通用的tag。
MeterRegistry.Config config = simpleMeterRegistry.config();
config.commonTags("tag1","value1","tag2","value2");
Counter
Counter只允许增加值,Counter所表示的计数值是double类型,默认情况下增加的值是1.0
@Autowired
private SimpleMeterRegistry simpleMeterRegistry;
@Bean
public Counter counter1(){
return Counter.builder("test.count1").register(simpleMeterRegistry);
}
@Bean
public Counter counter2(){
return simpleMeterRegistry.counter("test.count2");
}
@Test
public void test(){
counter1.increment();
}
Gauge
Cauge是表示单个的变化的值,例如温度,气压。与Counter的区别在于,Gauge的值不总是增加的
public void guage(){
Gauge.builder("guaua1", this::getValue).register(simpleMeterRegistry);
}
public double getValue(){
return ThreadLocalRandom.current().nextDouble();
}
Gauge对象一旦被创建,就不能手动对其中的值进行修改 。在每次取样时,Gauge 会返回当前值
Timer
Timer通常用来记录事件的持续时间。Timer会记录两类的数据,事件的数量和总的持续时间。Timer提供了不同方式来记录持续时间。第一种方式是使用record()方法来记录Runnable和Callable对象的运行时间,第二种方式是使用Timer.Sample来保存计时状态
public void record(){
Timer timer = simpleMeterRegistry.timer("record");
timer.record(() -> {
try {
Thread.sleep(3000);
}catch (Exception e){
e.printStackTrace();
}
});
}
public void sample(){
Timer.Sample sample = Timer.start();
new Thread(()->{
try {
Thread.sleep(3000);
}catch (Exception e){
e.printStackTrace();
}
sample.stop(simpleMeterRegistry.timer("sample"));
});
}
summary
summary用来记录指标的分布,summary根据每个指标的值,把值分配到对应的bucket中。Micrometer默认的bucket的值从1到Long.MAX_VALUE,可以通过minimumExpectedValue和maximumExpectedValue来控制bucket的范围,如果指标的值较小,还可以通过scale来设置一个值对数值进行放大
public void summary(){
DistributionSummary summ