はじめに
本記事はElasticのAPM Java Agentにおいて使用できる技になります。
執筆時点のJava Agentのバージョン1.34.1で試しています。
やりたいこと
Elastic APM Java Agentをデフォルトの状態で使用すると、トレースの中のスパンとして可視化されるのはサポートされているテクノロジーのポイントとなるメソッドです。
例としてこの簡単なHello Worldコードを使います。
package com.example.springbootdocker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class SpringBootDockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDockerApplication.class, args);
}
@RequestMapping("/")
public String home() {
randomSleep();
return "Hello World!";
}
private void randomSleep() {
try {
Thread.sleep((long)(Math.random() * 1000));
} catch (java.lang.InterruptedException e) {
}
}
}
上記コードはデフォルトでは以下のように可視化されます。Spring BootのWebリクエストのエントリポイントとして定義されているメソッドが可視化されています。
しかし、例えば業務アプリのコードの特定のクラスメソッドを可視化し、性能を見たい場合があると思います。サンプルコードだと、プライベートメソッドrandonSleepを追加で可視化するように。
コードの変更が可能ならJava AgentのAPIを使って明示的に可視化可能ですが、今回はコード変更が難しい場合のauto instrumentationの方法について紹介します。
手順
手順は簡単で、以下のelasticapm.propertiesファイルを作成し、Java AgentのJARファイルelastic-apm-agent.jarと同じディレクトリに配置するだけです。
trace_methods=com.example.springbootdocker.SpringBootDockerApplication#randomSleep
記述の方法は以下のドキュメントに詳しくあります。
https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-trace-methods
リストとして複数を設定する時の方法が読んだだけではわからなかったのですが、以下のようにカンマ区切りで可能でした。また、改行する際はバックスラッシュで可能でした。
trace_methods=com.example.springbootdocker.SpringBootDockerApplication#randomSleep1, \
com.example.springbootdocker.SpringBootDockerApplication#randomSleep2, \
com.example.springbootdocker.SpringBootDockerApplication#randomSleep3 \
まとめ
Elastic APMでの任意のJavaメソッドの性能可視化の方法について紹介しました。