Java中使用Micrometer来实现监控数据的输出

2020-04-15  本文已影响0人  睦月MTK

声明:
1.本节以Prometheus作为监控平台来监控,所以Micrometer的实现模块选择的也是Prometheus的
2.本节主要展示效果,具体写法请阅读参考文档列出的文章


主要内容

一、如何在Springboot项目中使用Micrometer

spring boot actuator中配置了与Micrometer相关的自动配置,只要添加Mircrometer的具体实现模块的依赖即可,配置完成后,运行程序,即可在/actuator/prometheus路径下看到输出的metric信息

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.2.1</version>
</dependency>

如果在运行时会出现找不到方法之类的异常,请适当降低依赖micrometer-registry-prometheus的版本

management:
  endpoints:
    web:
      exposure:
        include: "health,info,prometheus"

二、注册表

Micrometer中核心两个内容便是meter和registry,注册表用于将各种meter注册到自身中进行管理,而meter就是各种监控的工具,比如计数器,计量器,计时器等等。不同的监控系统会有不同的注册表实现,其基类都是MeterRegistry,对应于Prometheus的注册表是PrometheusMeterRegistry。
Spring boot中只要你配置好了上节所述的内容后,就会自动生成一个MeterRegistry类型的bean,你只需要在需要使用它的地方注入即可,如果你需要自定义MeterRegistry的各种配置,比如公共标签(所有该项目的监控信息都会加上一个相同的标签)等等,你可以配置一个类型为MeterRegistryCustomizer<MeterRegistry>的bean,来进行一些自定义的操作:

@Bean
@ConditionalOnBean({MtkMeterRegistryAutoConfiguration.class})
@Autowired
public MeterRegistryCustomizer<MeterRegistry> meterRegistryCustomizer(MtkMeterRegistryConfiguration mtkMeterRegistryConfiguration){
    return mtkMeterRegistryConfiguration::apply;
}

三、计数器

计数器用来表示计数类监控项目,比如“控制器的访问次数”,“方法的调用次数”等等,这类监控信息都是只增不减的,且和次数有关。


四、计量器

计量器用于持续计量类的任务,比如“集合长度”、“加载了类的个数”、“最大访问时间”等等。


五、计时器

计时器用于计时类监控,比如“某个线程的执行时间”,“某个操作的执行时间”。计时器有两种,一种是普通计时器,一种是长任务计时器,前者会在计时的任务结束后将计时器注册到注册表中,后者则可以实时显示任务执行了多久,即使任务还没执行完。需要注意的是,在使用record(Runnable runnable)方法对Runnable进行计时时,并不会去启动一个线程,而是执行Runnable中的run方法,并对该方法的执行时间进行计时。


额外内容

六、Meter的命名

监控系统会根据得到的监控信息的名称来进行一定的分析,所以如果你的命名毫无章法,那么可能会削弱一些监控的性能,Micrometer通过一个名为NamingConvention的接口来规定命名的规则。比如你在程序中使用了java.jvm.memory来命名一个Meter,而你使用的NamingConvention的实现类是针对于Prometheus的,那么监控信息的输出结果上,该Meter对应的信息的名字会是java_jvm_memory。Micrometer默认的命名规则,是以句点进行分割。下面给出同一个名字在不同监控系统的本地化命名:

原命名:http.server.requests
Prometheus : http_server_requests_duration_seconds
Atlas : httpServerRequests
Graphite : http.server.requests
InfluxDB : http_server_requests


七、Meter过滤器

Meter过滤器会根据一定的规则来判断一个Meter是否应该被注入到注册表中,以及何时注入到注册表中,也可以用来对匹配的Meter进行一些额外的配置,比如添加前缀等等。除此之外,TimerDistributionSummary这两种Meter还包含了额外的统计数据的相关配置,这也可以使用过滤器来实现一次性的配置。

registry.config()
    .meterFilter(MeterFilter.acceptNameStartsWith("http"))
    .meterFilter(MeterFilter.deny()); (1)

当Meter的名字为“http”开头时才允许该Meter被使用


参考文档:
[1] 使用 Micrometer 记录 Java 应用性能指标
[2] Micrometer官方文档


测试项目地址:

上一篇 下一篇

猜你喜欢

热点阅读