JVMのJITコンパイルのメトリクスをMicrometerで収集する
chiroitoさんの以下のブログを拝見しました。
僕は今のところ、十分にJITコンパイルした後にサービスインしたいとは思わないんですが、
JITコンパイルの結果はメトリクスとして普段使ってるモニタリングシステムで見たいなと思ったので
ブログで紹介されていたコードを参考にしてMicrometerを使ってメトリクスを収集するサンプルアプリを書いてみました。
ソースはここに置いてます。
https://github.com/matsumana/jvm-jit-compilation-metrics-example
今回使用したバージョン: AdoptOpenJDK 14.0.2
(Java 14で追加された JEP 349: JFR Event Streaming を使っているため)
依存ライブラリにmicrometer-registry-prometheus
を追加してあるので、Prometheusでメトリクスが見れます。
また、パッケージ名をlabelとして追加する事で、パッケージ毎のJITコンパイルのメトリクスが見るようにしてみました。
# HELP jvm_jit_compilation_total
# TYPE jvm_jit_compilation_total counter
jvm_jit_compilation_total{package="java.util",succeded="true",} 333.0
jvm_jit_compilation_total{package="org.springframework.context",succeded="true",} 29.0
...
注意点:
パッケージ名をそのままラベルとして使うと大量のメトリクスが生成されて、モニタリングシステムに負荷がかかると思います(依存しているライブラリやフレームワークによりますが)
なので、最初のpackage名の先頭の3つの部分だけを使ってメトリクスをまとめるようにしています。
この辺は実際に仕事でやる時には調整した方がいいです。
僕は普段Java11でJFRを使ってますが、JVMオプション(-XX:StartFlightRecording
など)で起動時に有効にしておいてサービスに問題が出た時にヒープダンプやスレッドダンプと一緒にJFRのログファイルも確認するという使い方をしています。
JFRのAPIは今まで使った事がなかったので勉強になりました。
ありがとうございました。