首页 > 编程笔记

Spring Boot集成Micrometer

一个健壮的应用程序需要实时采集应用的性能指标,开发人员或运维人员关注这些指标可以掌握程序运行的情况,以便出现问题的时候及时报警。目前市场上出现了很多监控系统,这些监控系统由不同的语言开发,安装方式不同,使用起来也比较复杂。Micrometer 工具提供了抽象接口和脱离底层的第三方监控依赖,类似于 SLF4J 在 Java 日志中的作用。

Micrometer 简介

Micrometer 是一个基于 JVM 的应用程序指标收集工具包,其为收集 Java 应用的性能指标提供了通用的 API。Java 应用只需要使用这些通用的 API 收集性能指标即可,Micrometer 会适配各种不同的监控系统。

在 Micrometer 中有两个最基本的概念:Meter 计量器和 MeterRegistry 计量器注册表。

Meter 计量器可以创建多种类型的数据指标,包括 COUNTER、GAUGE、LONG_ TASK_TIMER、TIMER 和 DISTRIBUTION_SUMMARY 等。

MeterRegistry 是计量器注册表,负责创建和维护 Meter 计量器。Micrometer 中提供了核心包 micrometer-core,对所使用的监控系统只需要添加对应的模块即可。如果使用Prometheus 监控系统,则需要添加模块 micrometer-registry-prometheus。

Micrometer 核心库中提供了两个类,其中 SimpleMeterRegistry 类是一个基于内存的计量器注册表,其不支持将数据导入监控系统中,CompositeMeterRegistry 类是一个组合计量器注册表,其可以把多个计量器注册表组合起来,并允许同时在多个监控系统中发布数据。

不同的 Meter 命名规则建议以句号分隔,创建时需要指定标签(Tag),并且标签以键值对的形式出现,后续可以通过标签对数据进行过滤或者分维度统计。除了特有标签之外,还可以统一设置通用的标签。例如:
SimpleMeterRegistry registry = new SimpleMeterRegistry();
registry.config().commonTags("application", "micrometerApp");
Counter counter = registry.counter("biz.code.total", "code", "C000");
counter.increment();  //计数统计

下面主要讲解一些类型数据指标。

1. Counter

Counter(计数器)允许以固定的数值进行累加,该数值必须为正数。有两种创建方式,具体如下:
MeterRegistry registry = new SimpleMeterRegistry();
//写法一
Counter counter1 = registry.counter("counter");
counter1.increment(1.0);
//写法二
Counter counter2 = Counter.builder("code.counter").description("a counter simple", "code", "C000") //描述.tags("code", "S000")  //状态码
.register(registry);
counter2.increment(5.0);

2. Timer

Timer(计时器)一般用来记录一段代码的执行时间,如一次请求接口的时间。Timer 提供了 record() 方法用来记录代码块的执行时间,并且还可以对执行时间进行统计分析,如最长时间、平均时间及百分比等。 LongTaskTimer 可以统计一个任务的执行时间。创建 Timer 的例子如下:
Timer timer = Timer.builder("api.timer").description("a timer simple")  //描述 .tags("apiRequest", "userQuery")  //Tag定义 .register(registry);

3. Gauge

Gauge(测量器)用于测量一个指标的瞬时值,如 CPU 使用率和内存使用率等。示例如下:
AtomicInteger atomicInteger = new AtomicInteger(0); 
Gauge passCaseGuage = Gauge.builder("pass.guage", atomicInteger, AtomicInteger::get).tag("pass", "demo")  //Tag定义 .description("a gauge simple") //描述.register(registry);

Spring Boot 集成

Spring Boot Actuator 提供了对 Micrometer 的依赖管理和自动配置,同时支持多种类型的监控系统。 Spring Boot Actuator 会自动配置一个组合的 MeterRegistry 注册表,将所有支持的 Meter 都添加进去,这些 Meter 对象也会被自动添加到全局注册表对象中。可以通过MeterRegistryCustomizer 对象来配置 MeterRegistry。例如下面的例子中配置了通用的 Tag,代码如下:
@Bean 
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {     
    //通用的Tag定义         
    return registry -> registry.config().commonTags("application", "userApp"); 
}

还可以通过配置来指定开启某个 MeterRegistry。例如下面的例子可以开启 Prometheus 并暴露 prometheus 端点,配置如下:

management:  
    server:    
        port: 8081  
    endpoint:    
        metrics:      
            enabled: true    
        prometheus:      
            enabled: true  
    endpoints:    
        web:      
            exposure:        
                include: metrics,Prometheus      
            base-path: /  
    metrics:    
        export:      
            prometheus:        
                enabled: true

Spring Boot Actuator 还提供了一些核心指标,包括 :
配置完成后,可以编写自己需要的 Meter,然后统计相关的业务指标。下面的例子是按业务状态码统计数量,代码如下:
private void increment(String code, String operation) {
        //定义Tag
        Tags tags = Tags.of(
                Tag.of("code", code),
                Tag.of("handler", operation));
        //定义Counter
        Counter counter = Search.in(this.meterRegistry).name(BUSINESS_CODE_METRIC).tags(tags).counter();
        if (counter == null) {
            counter = this.meterRegistry.counter(BUSINESS_CODE_METRIC,tags);
        }
        //Counter计数加1
        counter.increment();
    }
配置好之后,访问 http://localhost:8081/prometheus 即可看到采集数据。

优秀文章