先日のJavaZone 2024で、上記タイトルでプレゼンテーションをしてきたので、その内容をまとめておく。
TL; DR;
通常のJavaアプリケーションであれば、Agentと呼ばれるCollectorを使ってZero-code instrumentationが可能である。ところがGraalVM Native Imageの場合、通常のJVMではない(Substrate VM)ため、Agentが動作しない。
Micrometerも対応しているが、OpenTelemetryや各開発フレームワークでも対応が進んでいる。Spring BootではOpenTelemetry Spring Boot Starter(以下、starter)、QuarkusではOpenTelemetryのサポートが3.13で強化され、コンポーネントに内包するようになっている。
Micrometer
https://micrometer.io/
スライド
Spring Boot starter
OpenTelemetryプロジェクトとしてAgentをリリースしているが、それ以外にAgentを使わないstarterを2024/6にリリースした。
Spring Boot starter
https://opentelemetry.io/docs/zero-code/java/spring-boot-starter/
Pros/Consは以下の通り。ただ、現時点ではまだ鋭意開発中なので、今後Agentとの機能ギャップはうまっていくことが期待される。
| Pros | Cons |
|---|---|
| – (依存関係としてNative Imageアプリケーション内に含まれるため)Agentが動作しないところでも動作する – 通常のJavaアプリケーションにおいても利用可能、アプリケーション起動時間がAgent利用時に比べて速い | – 現時点ではAgentに比べてサポートしているInstrumentationが少ない |
Quarkus
3.13のリリースノートにある通り、OpenTelemetryのサポートが強化された(なお、現時点でもMicrometerの利用を推奨している)。
Quarkus 3.13 – OpenTelemetry Metrics, OpenTelemetry 1.39, TLS registry improvements and more…
https://quarkus.io/blog/quarkus-3-13-0-released/
QuarkusのコンポーネントとしてOpenTelemetryのライブラリが内包されているため、依存関係を外部から取得する必要はない。Exporterはこの依存関係に含まれており、Agentの利用は非推奨である。
QuarkiverseにAzure Monitor (Application Insights)、Google Cloud用のExporterがあり、Observability backendsとして利用できる。
Quarkus OpenTelemetry Exporter
https://docs.quarkiverse.io/quarkus-opentelemetry-exporter/dev/index.html
またQuarkus Amazon Servicesでは、OpenTelemetryのAWS SDK instrumentationとの統合もしている。
OpenTelemetry for Amazon Services
https://docs.quarkiverse.io/quarkus-amazon-services/dev/opentelemetry.html
デモ
デモコードは以下にあるが、少々古い。ただ2024/09/09現在、Java 21、および最新の依存関係で動作は確認済み。
Azure-Samples/java-native-telemetry
https://github.com/Azure-Samples/java-native-telemetry
注意すべきは、Native Imageアプリケーションを作成する際、署名付きJARファイルを依存関係として使う場合には、署名検証を無効化する必要がある。このデモでは依存関係として com.azure.spring:spring-cloud-azure-starter-monitor を使っているが、これが署名済みJAR(というか、Microsoftが出しているJARファイルはすべて署名付きだったりする)ので、検証を無効化するために、-Djava.security.properties=src/main/resources/custom.securityをnative-maven-pluginの引数として追加している。