前回は、Spring BootとAPM Javaエージェントのデプロイを行いました。今回は、APM Java Tracerを用いて、APMでHelidonアプリケーションの監視を行う方法を紹介します。
OCI APMは、OpenTelemetryに対応しており、各フレームワークのトレーシング機能を有効化することによってAPM側でそのテレメトリーデータを受信し、APM Javaエージェントの場合と同様にトレースデータして表示させることが可能です。
まずは、Helidonベースのアプリケーションをデプロイすると同時にAPM Java Tracerを有効化しAPMで動作させる設定を行います。
アプリケーションのデプロイ & APM Java Tracerの有効化
#Dockerインストール
sudo dnf install -y docker
#アプリのダウンロード&解凍
wget https://github.com/western24/apmdemo/raw/main/helidonsedemo.zip
unzip helidonsedemo.zip
#アプリケーションの定義ファイルを開き
vi /home/opc/helidonsedemo/src/main/resources/application.yaml
##APMのEndpointとPrivateデータキーを編集
data-upload-endpoint: https://xxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com
private-data-key: xxxxxxxx
#DockerイメージのBuild&Run
cd helidonsedemo
docker build -t helidon-quickstart-se .
docker run --rm -p 8282:8282 helidon-quickstart-se:latest
APM Java Tracerに必要な設定
まずは動作させるところまでの環境を構築できたところで、実際にHelidonのアプリケーションでAPMを使うためには、何の設定をしなければらないないかという観点で解説します。
APM Java Tracerの場合は、APM Java Agentのようにエージェントをダウンロードしてインストールするのではなく、フレームワークにあるトレーシング機能を有効にします。
Helidonの場合は、pom.xmlに以下の依存性を追加します。(Helidon 3 SEの場合)
※今回のアプリケーションのpom.xmlには既に追加されています。
<dependency>
<groupId>io.helidon.tracing</groupId>
<artifactId>helidon-tracing-opentracing</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.apm.agent.java</groupId>
<artifactId>apm-java-agent-helidon3</artifactId>
<version>[1.8.3326,)</version>
</dependency>
そして、application.yamlには、テレメタリーデータの送信先に関する設定情報を追記します。APMのアップロードするためのAPMに表示するサービス名、エンドポイントとPrivateデータ・キーは必須項目です。
tracing:
service: helidondemo
data-upload-endpoint: https://xxxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com
private-data-key: xxxxxxxxxxxxxxxxxx
上記の設定を追加することによりHelidonのAPM Java Tracerが動作します。
トレーシングを有効化することでテレメタリデータを収集することをInstrumentation(計装)と呼びますが、これは自動計装(Automatic Instrumentation)と手動計装(Manual Instrumentation)の2つの種類があります。
自動計装は、プログラム・コード内で実行される様々イベントにて自動的に計測されるもので、手動計装は、ユーザー自身でSpanの範囲を指定し、計測したい処理範囲を自身で決定することができます。
先ほど確認したAPMのトレースには、HelidondemoのmainとHTTP Requestの2つのトレースデータが取得されていたのですが、実はこれ、それぞれ自動計装と手動計装されたものでした。
ちょっとmain.javaのコードを見てみると
//気象庁のREST APIコールの部分には、特にトレーシングに関するコードは追記していない
try {
HttpGet request = new HttpGet("https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json");
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(request);
res.headers().add("Content-Type", "application/json");
res.send(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
//明示的にSpanの範囲を指定している
try {
Tracer tracer = webServer.configuration().tracer();
Span span = tracer.spanBuilder("main").start(); // <----親Span Start
for(int i = 0; i < 3; i++) {
doWork(i, span); // <----子Span
}
span.end(); // <---親Span End
} catch(Exception e) {
プログラム・コードは最小限で記述していますので、ご自身でコードをカスタマイズしながらAPMの挙動を確認するとより理解しやすいのではないかと思います。また、ドキュメントには、Helidon以外のMicronautやMavenなどのフレームワークに対する設定も記述がありますので、こちらもご参考にして下さい。
次回は、Node.jsのアプリケーションのデプロイとOpenTelemetryの設定を紹介します。