JavaアプリからノンコーディングでAzure Application Insightsにメトリックス情報などを送信する

はじめに

以下の記事でJavaアプリをDockerイメージ化してAzure App Service上で動かすことをしました。

miyohide.hatenablog.com

また、データベースとの接続処理も実装しました。

miyohide.hatenablog.com

今日のエントリーでは、Javaアプリを運用するに必要な各種メトリックス情報を取得する方法を試してみたいと思います。

前提条件

以下の環境で実施しました。

実装

以下のドキュメントを参考に。

docs.microsoft.com

上記の記事にあるようにjavaagentオプションを渡してあげる必要があります。Spring Bootのアプリをgradle bootBuildImageを使ってDockerイメージ化する場合、簡単にはjavaagentオプションを渡すことはできなさそうでしたので、今回はjibを使うことにしました。

github.com

あとは以下の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。

github.com

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の画面に行くといろいろとデータを見ることができます。

f:id:miyohide:20200705152906p:plain アプリケーションマップ

f:id:miyohide:20200705152933p:plain ログ

Spring Actuatorを設定しておくと「メトリックス」の部分でSpring Actuatorが出力するデータも参照できるようになります。

f:id:miyohide:20200705153111p:plain

実際にApplication Insightsに出力するためのコーディングを行わなくても、各種メトリックス情報をApplication Insightsに送信することができました。

ソース

github.com