Spring BootのFlightRecorderApplicationStartupを試す
Spring Boot 2.4 (Spring Framework 5.3) から追加されたFlightRecorderApplicationStartupを試したときのメモ。
追記
このバグがあるので、Spring Boot 2.4.7 (Spring Framework 5.3.8) 以降を使ったほうがいい。
https://github.com/spring-projects/spring-framework/issues/26941
準備
JDK Mission Control
ここからJDK Mission Controlをダウンロードしてインストールする。
ソースコード
build.gradle
plugins { id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() }
DemoApplication.java
@SpringBootApplication public class DemoApplication implements CommandLineRunner { public static class Foo {} @Bean public Foo foo() { try { // duration確認用に5秒sleepを入れる TimeUnit.SECONDS.sleep(5); } catch (Exception ignored) { } return new Foo(); } @Override public void run(String... args) { System.out.println("Hello!"); } public static void main(String[] args) { SpringApplication app = new SpringApplication(DemoApplication.class); app.setApplicationStartup(new FlightRecorderApplicationStartup()); app.run(args); } }
Demo
Flight Recorderを有効にしてデモアプリを実行すると、jfrファイルが作成される。
(filenameとdurationはとりあえずマニュアルと同じ)
% sdk use java 11.0.10.hs-adpt % java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar build/libs/demo-0.0.1-SNAPSHOT.jar
JDK Mission Controlでjfrファイルを開くと、イベント・ブラウザ => 「Spring Application」カテゴリ => 「Startup Step」イベントで、foo beanのspring.beans.instantiateに5秒かかっているのが確認できた。
参考
- https://docs.spring.io/spring-boot/docs/2.4.x/reference/htmlsingle/#boot-features-application-startup-tracking
- https://github.com/spring-projects/spring-framework/issues/24878
- https://www.youtube.com/watch?t=1091s&v=lgyO9C9zdrg&feature=youtu.be
ソースコードはこの辺り
- https://github.com/spring-projects/spring-framework/blob/v5.3.3/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java#L303
- https://github.com/spring-projects/spring-framework/blob/v5.3.3/spring-core/src/main/java/org/springframework/core/metrics/jfr/FlightRecorderApplicationStartup.java
- https://github.com/spring-projects/spring-framework/blob/v5.3.3/spring-core/src/main/java/org/springframework/core/metrics/jfr/FlightRecorderStartupStep.java
- https://github.com/spring-projects/spring-framework/blob/v5.3.3/spring-core/src/main/java/org/springframework/core/metrics/jfr/FlightRecorderStartupEvent.java