このエントリは2020/11/06現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります(2021/11/08記載内容を更新、2021/11/08現在の最新版は3.2.2)。
先日、Azure Monitor Application Insightsの新機能が一般提供された。この機能は、コードの埋め込みが不要なAgentライブラリを使ってのJavaアプリケーションの監視ができる、というもの。他社のAPM (Application Performance Management) では類似の機能がすでに存在しているが、これまでAzure Monitor(というかApplication Insights)では、Javaアプリケーションを監視する場合、SDKを使ってテレメトリを投げるような仕組みをコードに入れ込む必要があった。ドキュメントは以下の通り。
Azure Monitor Application Insights を監視する Java のコード不要のアプリケーション / Java codeless application monitoring Azure Monitor Application Insights
https://docs.microsoft.com/azure/azure-monitor/app/java-in-process-agent
何も考えずに試すだけであれば、Azure Monitor (Application Insights) のインスタンスを作成し、作成したApplication Insightsで提供されるインストルメントキーを含む接続文字列をapplicationinsights.json
に記載すればOK。

applicationinsights.json
のフォーマットは以下の通り(2021/11/08最新の構文に変更済み)。
{
"connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000";IngestionEndpoint=...
}
このファイルは通常はAgentのJARファイルと同じ場所になければならないが、環境変数 APPLICATIONINSIGHTS_CONNECTION_STRING
もしくはJavaシステムプロパティ applicationinsights.configuration.file
に記載すれば別の場所の構成ファイルを探しにいってくれる。相対Pathを指定した場合、基準となるPathはAgentのJARファイルが存在するディレクトリ。その他構成の詳細は以下のドキュメントを参照。
構成オプション – Azure Monitor Application Insights の Java スタンドアロン エージェント / Configuration options – Java standalone agent for Azure Monitor Application Insights
https://docs.microsoft.com/azure/azure-monitor/app/java-standalone-config
収集対象の依存関係やメトリックは以下のURLに記載がある。
自動収集された要求、依存関係、ログ、およびメトリック / Autocollected requests, dependencies, logs, and metrics
https://docs.microsoft.com/azure/azure-monitor/app/java-in-process-agent#autocollected-requests-dependencies-logs-and-metrics
Agentは実行時に以下のように指定する。SpringBootやJava/Jakarta EEアプリケーションサーバで稼働させることもできる。
java -javaagent:path/to/applicationinsights-agent-3.2.2.jar ....
種々の環境での設定方法は以下に記載がある。このエントリでは、WebLogic ServerとHelidonで試してみた。
Azure Monitor Application Insights の JVM 引数の Java スタンドアロン エージェントを構成する / Configuring JVM args Java standalone agent for Azure Monitor Application Insights
https://docs.microsoft.com/azure/azure-monitor/app/java-standalone-arguments
WebLogic Server 14.1.1のサンプルアプリケーションを監視する
先ごろリリースされたWebLogic Server 14.1.1を監視できるか試した。上記の-javaagent:の部分はWebLogicドメインの構成ファイルなどに記載しておく必要がある。今回は、 <Domain_Home>/bin/setDomainEnv.sh のJAVA_OPTIONSに追記するように起動スクリプトを変更した。また、アプリケーションはmedrec-springを使った。アプリケーションをいろいろ動かしたあとにアプリケーションマップを開くと、こんな感じ。

アプリケーションマップのSQLをクリックすると、呼び出されているクエリ等が確認できるので、[パフォーマンスの調査]をクリックすると、以下のようなメトリックにアクセスできる。

End-to-Endのトランザクションを確認するために、[依存関係のサンプルを選択]のリストのアイテムをクリックする。今回は提案されたものをクリックしてみた。依存関係とのフローがわかりやすいとは言えないので、[関連アイテム]の[この依存関係前後に生じた事柄をUser Flowsで表示する]をクリックすると、ユーザーフローを確認できる。

Docker ContainerにHelidon QuickStart Applicationを入れて、Azure App Serviceで動かす
単純にHelidon SEとHelidon MPのコンテナを作成し、これらをApp Serviceで動作させてみる。Docker Image作成時に、DockerfileのCMDもしくはENTRYPOINTに-javaagent:xxxを追記しておく必要がある。以下はその例。
...
CMD ["java", "-javaagent:applicationinsights-agent-3.2.2.jar", "-jar", "helidon-quickstart-se.jar"]
...
1個のDocker containerに入っているAPIを呼ぶだけでは意味がないので、Helidon SEのコンテナでホストするAPIがHelidon MPのAPIを呼び出すような仕組みにしてみた。これでClient > SE > MPの流れが追跡できるはず(以後、Helidon SEで作成したAPIをSE、Helidon MPで作成したAPIをMPと表現する)。
まず、例外の追跡ができるのか確認してみる。具体的には、SEからの呼び出し先、つまりMPのURLを指定せず、例外が発生するようにしてみた。なお、SE内でこの例外の処理は意図的に行っていない。すると、End-to-Endのトランザクションで以下のような感じで例外を確認できる。内容を見てもらうと分かる通り、http://localhost:8080 ってことで、別にクラウドでなくてもオンプレミスも監視対象にできることがわかる。

続いて本題。MPを呼び出すSEを何度か呼び出してみた。そのときのアプリケーションマップが以下。

SE(helidon-se-quickstart)からMP(helidon-mp-quickstart)を呼び出していることが図からも確認できる。SEをクリックして、右から出てきたペイン内の[パフォーマンスの調査]をクリック。

依存関係タブを選択すると、この例では3回Client > SE > MPの呼び出しを実行したことがわかる。

どのように呼び出したかを見るため、[(3) サンプル]をクリックし、出てきたサンプルをクリックする。今回は提案されたもの(黄色でマークしたもの)を使った。

クリックすると、APMツールでおなじみの、依存関係込みの呼び出しトレースを確認できる。

なお、実験的にJava 17で動作させてみたところ、特に問題なくテレメトリを取得できた。
まとめ
Helidonのサンプルアプリケーションは以下のURLからどうぞ。
Codeless Java Application Monitoring using Azure Monitor Application Insights
https://github.com/anishi1222/Codeless-Java-Application-Monitoring-using-Azure-Monitor-Application-Insights
Issue
https://github.com/microsoft/ApplicationInsights-Java/issues