はじめに
以下の記事でJavaアプリをDockerイメージ化してAzure App Service上で動かすことをしました。
また、データベースとの接続処理も実装しました。
今日のエントリーでは、Javaアプリを運用するに必要な各種メトリックス情報を取得する方法を試してみたいと思います。
前提条件
以下の環境で実施しました。
- Spring Boot 2.3.1
- Jib 2.4.0
- applicationinsights-agent-3.0.0-PREVIEW.4.jar
- この記事を書いている2020年7月5日時点ではPREVIEW.5がでているようです。
- https://github.com/microsoft/ApplicationInsights-Java/releases
実装
以下のドキュメントを参考に。
上記の記事にあるようにjavaagent
オプションを渡してあげる必要があります。Spring Bootのアプリをgradle bootBuildImage
を使ってDockerイメージ化する場合、簡単にはjavaagent
オプションを渡すことはできなさそうでしたので、今回はjibを使うことにしました。
あとは以下のFAQに掲載されているようにjib.container.jvmFlags = ['-javaagent:/applicationInsights/applicationinsights-agent-3.0.0-PREVIEW.4.jar']
を指定してあげつつ、src/main/jib
以下にapplicationInsights/applicationinsights-agent-3.0.0-PREVIEW.4.jar
を格納すればOK。
Dockerイメージ化はgradle jibDockerBuild
とすればOKです。
実行
Application Insightsのリソースを作成して、環境変数APPLICATIONINSIGHTS_CONNECTION_STRING
を指定します。手順は上記のドキュメントに記されているので適宜参照してください。
その後、Dockerイメージ化したSpring Bootアプリケーションを起動します。アプリケーションの実行環境はAzure上のサービスでもローカルでもどこでもOKのようなので、今回はローカルで実行させます。最初、以下のような例外が吐かれましたが、何度か停止・起動を繰り返すといつの間にか出なくなりました。
2020-07-05 04:21:55.762Z ERROR i.o.auto.tooling.HelperInjector - Error preparing helpers while processing class org.springframework.core.io.ClassPathResource for ClassPathResourceInstrumentation. Failed to inject helper classes into instance jdk.internal.loader.ClassLoaders$AppClassLoader@2f333739 java.lang.IllegalStateException: Error invoking (accessor)::defineClass at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$UsingUnsafeInjection.defineClass(ClassInjector.java:922)
あとはApplication Insightsの画面に行くといろいろとデータを見ることができます。
アプリケーションマップ
ログ
Spring Actuatorを設定しておくと「メトリックス」の部分でSpring Actuatorが出力するデータも参照できるようになります。
実際にApplication Insightsに出力するためのコーディングを行わなくても、各種メトリックス情報をApplication Insightsに送信することができました。