OpenTelemetryでGraalVM Native Imageアプリケーションのテレメトリデータを収集する

先日の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との機能ギャップはうまっていくことが期待される。

ProsCons
– (依存関係として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の引数として追加している。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください