Gateway服务监控信息不展示问题分析
概述
排查并解决Gateway服务的内存、cpu、线程、GC等指标不展示问题
现象
gateway突然内存不展示
排查与解决
最开始由于不展示jvm内存最开始写了一段手动注册监控信息的代码,发现仅仅注册了内存信息,所有跟踪JvmGcMetrics 一路翻代码找到了相关处理类。
package com.xxx.tech.gateway.config; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; /** * 如果自动配置未生效,可以手动注册 JVM 指标 * (由于自动注册失效) * @author marker */ @Configuration public class JvmMetricsConfig { private final MeterRegistry meterRegistry; public JvmMetricsConfig(MeterRegistry meterRegistry) { this.meterRegistry = meterRegistry; } @PostConstruct public void bindJvmMetrics() { new JvmMemoryMetrics().bindTo(meterRegistry); } }
代码配置后内存展示,但是没有线程、cpu等指标展示。于是debug跟踪bindTo方法在一个正常服务中的调用情况,最终发现了MeterRegistryPostProcessor。
后续继续排查发现这段代码阻断了BeanPostProcessor 处理器的链路,导致后续的MeterRegistryPostProcessor 无法正常处理bean对象,引发了该问题。
SimpleMeterRegistry类会在SimpleMetricsExportAutoConfiguration 自动装配Bean,装配后会进入到MeterRegistryPostProcessor Bean处理器中进行加工处理。
bean的处理底层就是将jvm的内存、cpu、线程等指标信息注册到actuator监控
当注释@Configuration 后,重启,内存信息重新展示。