Java 14 から JDK Flight Recorder で取得した情報を Java プロセス内で処理する JFR Event Streaming が導入されました。今回はこれを Quarkus で使ってみたいと思います。
今回のサンプルでは JFR では標準的な情報を取得するようにします。JFR Event Streaming は、JVMの情報を記録するイベントを受け取ったらそのイベントを標準出力に処理します。Java MP のアプリケーションスコープの開始処理と終了処理で JFR Event Streaming をそれぞれ開始/終了します。
開始処理では、JFCファイルというJFRの設定ファイル名を指定して設定を読み込み、ストリームを作成します。さらに、ストリームを流れるイベントの種類ごとに処理内容を指定し、ストリームを開始します。今回読み込むJFCファイルはdefault.jfcなので、defaultを指定します。また、今回受け取るイベントの名前はjdk.JVMInformationです。
終了処理では、ストリームがあれば閉じます。
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import java.io.IOException; import java.text.ParseException; @ApplicationScoped public class JfrStreamingBean { private EventStream es; void onStart(@Observes StartupEvent ev) { try { Configuration config = Configuration.getConfiguration("default"); this.es = new RecordingStream(config); this.es.onEvent("jdk.JVMInformation", System.out::println); this.es.startAsync(); } catch (ParseException | IOException e) { System.err.println("Couldn't start JFR Event Streaming"); } } void onStop(@Observes ShutdownEvent ev) { if (this.es != null) { es.close(); } } }
このプログラムを実行してみます。Quarkus の通常の実行方法で実行します。今回は開発者モードで実行します。
mvnw.cmd quarkus:dev
Quarkus が実行したあとに、JVM情報のイベントであるjdk.JVMInformationというイベントが出力されます。
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2020-05-28 18:16:55,594 INFO [io.quarkus] (Quarkus Main Thread) quarkus-jfr-streaming 1.0-SNAPSHOT (powered by Quarkus 1.4.2.Final) started in 1.110s. Listening on: http://0.0.0.0:8080
2020-05-28 18:16:55,605 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2020-05-28 18:16:55,605 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, smallrye-metrics]
jdk.JVMInformation {
startTime = 18:16:55.549
jvmName = "OpenJDK 64-Bit Server VM"
jvmVersion = "OpenJDK 64-Bit Server VM (14+36-1461) for windows-amd64 JRE (14+36-1461), built on Feb 6 2020 19:03:18 by "mach5one" with MS VC++ 15.9 (VS2017)"
jvmArguments = "-XX:TieredStopAtLevel=1 -Xverify:none -Xdebug -Xrunjdwp:transport=dt_socket,address=0.0.0.0:5005,server=y,suspend=n -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
jvmFlags = N/A
javaArguments = "C:\Users\cito\develop\quarkus-sample\quarkus-jfr-streaming\target\quarkus-jfr-streaming-dev.jar"
jvmStartTime = 18:16:54.186
pid = 9092
}