🔥

Java 用の Application Insights を試してみた

2022/01/13に公開

1 つ前の記事で Java のハローワルドアプリが Web App にデプロイ出来たので、次は Application Insights を有効化してみようと思います!

https://zenn.dev/okazuki/articles/deploy-springboot-to-azure-app-service

Application Insights をオンにするのは簡単で、Web App の、Application Insights の所からオンにするだけです。

ログの出力先の Application Insights を指定(もしくは作成)して、最後に必要があれば applicationinsights.json の内容を以下のテキストボックスに張り付けることでカスタマイズしたい部分を設定できます。

これだけで、それとなく出るようになりました。

もうちょっと情報をとりたい

Java で開発してた頃なんとなくやった覚えのある JMX にも対応しているみたいです。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/java-jmx-metrics-configuration

でもメモリの使用量とか GC の回数は出てるみたいなので、何か独自の物をとりたいときに設定するとよさそうですね。

Java の Application Insights の SDK

Application Insights Java 2.x SDK というものがありますが、これは古いものになっています。3.x については Application Insights の SDK は存在していなくて JVM の引数に -javaagent:path/to/applicationinsights-agent3.2.3.jar のようにエージェントを指定する形になります。こうすることで自動的に色々な情報が収集されるようになります。Azure にデプロイする場合は、上で記載したように自動でやってくれる設定をオンにすることで対応するのが一番簡単です。

  • Servlets への要求
  • Apache HttpClient の依存関係
  • JDBC の依存関係
  • java.util.logging, log4j, slf4j,/Logback の出力するログ
    • logger の設定で採取すると設定されているログの中から、Application Insights で取得すると設定されているものが Application Insights に入る
  • JMX メトリック
  • 各種 Azure SDK が出力するテレメトリ
  • など

完全なリストは以下のドキュメントの「インストルメンテーション ライブラリ」に記載があります。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/java-in-process-agent#instrumentation-libraries

各種構成方法の詳細は以下のドキュメントに記載があります。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/java-standalone-config

Application Insights を Java で使う場合は普段使いをしていれば、それに応じてログが出てくれるという感じです。それ以外にもより詳しいログを出したい場合は opentelemetry-api や Micrometer というものを使って行う感じになりそうです。

一部 Application Insights Java SDK の 2.x 系じゃないとサポートされていないものとして、カスタム イベントがあるのでカスタム イベントがどうしても重要な場合は 2.x 系を使うことになりそうです。

サンプリング

Application Insights は、ログのデータ量と保存期間で課金される形になります。一応、無料枠はあるのですが大量にログを出しすぎて無料枠をオーバーしてしまうと高額になることもあります。そのために実際に保存されるログを間引くサンプリングという仕組みがあります。
一番賢いのがアダプティブ サンプリングといってログの出力状況を見て必要に応じて間引いてくれる機能です。

残念ながらアダプティブ サンプリングは .NET 系でしかサポートされていません。Java では固定レート サンプリングとインジェスト サンプリングがサポートされています。デフォルトではサンプリングは無効になっています。

どっちのサンプリングを使う?

基本的に固定レート サンプリングだけ考えていればいいと思います。というのもインジェスト サンプリングは Application Insights が受け取ったログの中から間引く動きになります。固定レート サンプリングは、ログを出す側で間引く動きになります。ログを出す側で間引いたほうがネットワーク的にやさしいですしね。

設定方法

applicationinsights.json の中でサンプリングの設定項目があって、そこで何パーセントのログを実際に Application Insights に保存するかということを設定できます。Web App の場合は Application Insights の有効化のところで applicationinsights.json の内容を設定する項目があるので、そこで設定します。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/java-standalone-config#sampling

あとは、環境変数で APPLICATIONINSIGHTS_SAMPLING_PERCENTAGE という名前で設定することもできます。

まとめ

ということで、Java のアプリを Azure にデプロイする場合は Application Insights 用にアプリケーションに特別な記述や設定をする必要がないので結構簡単に連携出来そうだなと思いました。後は、アダプティブ サンプリングが来て欲しいなぁと思いました。

Microsoft (有志)

Discussion