背景
Spring Boot 2.2.4.RELEASE 使用 spring-boot-starter-actuator 检测 heapdump 时服务503
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
错误分析
分析源码发现:
- 在Spring自动配置类 org.springframework.boot.actuate.autoconfigure.management.HeapDumpWebEndpointAutoConfiguration中,如果没有用户自己实现HeapDumpWebEndpoint则会直接新建一个HeapDumpWebEndpoint。
- 在org.springframework.boot.actuate.management.HeapDumpWebEndpoint.heapDump方法中,如果捕获到异常HeapDumperUnavailableException,那么就会返回STATUS_SERVICE_UNAVAILABLE即503.
- 进一步排查发现,抛出异常HeapDumperUnavailableException的源头为HotSpotDiagnosticMXBeanHeapDumper的构造函数。根据错误提示Unable to locate HotSpotDiagnosticMXBean,初步怀疑跟openJ9 jvm有关。
- 搜索引擎搜索 OpenJ9 与 HotSpot, 知道 OpenJ9 和 IBM J9 是和默认 Oracle HotSpot JVM 不同的 JVM 实现,所以无法定位到HotSpotDiagnosticMXBean
解决问题
根据Spring自动配置类的提醒,要解决此问题,那么我们需要提供适用于openJ9的HeapDumpWebEndpoint。那么怎么实现呢?最终在github上找到了答案。详见->ibm-heapdump-spring-boot-actuator
- 引入maven依赖
<dependency>
<groupId>io.github.sa1nt</groupId>
<artifactId>ibm-heapdump-spring-boot-actuator-starter</artifactId>
<version>0.8</version>
</dependency>
2.配置 J9HeapdumpMvcEndpoint
import io.github.sa1nt.ibmheapdump.J9HeapdumpMvcEndpoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IBMHeapdumpConfiguration {
@Bean
public J9HeapdumpMvcEndpoint ibmHeapdumpMvcEndpoint() {
return new J9HeapdumpMvcEndpoint();
}
}