LoginSignup
5
0

More than 3 years have passed since last update.

Azure Application Insights を Java アプリから使おう

Last updated at Posted at 2021-05-02

Application Insights を Javaアプリから使おう

アプリケーション開発者にとって、実際にアプリがどう動いているかを監視するのは、大事なことだったりします。そのため、例外をハンドルしたり、ログを仕込んだりと色々と準備しておくことも多いでしょう。

今回、ここで紹介する Application Insights ですが、コードに修正を入れることなくアプリケーションの各種メトリクスデータを取得できる優れものです。ログはもちろん、パフォーマンス、例外と言った記録を収集し蓄積してくれます。

公式ドキュメントの入り口は以下です。今では Azure Monitor の一機能的な位置づけになっています。

Azure Application Insights とは何か - Azure Monitor | Microsoft Docs

データモデル

はじめに Application Insights で収集するデータモデルを理解すると、全体像の把握に繋がると思います。Application Insights が収集するデータは抽象化されており、主要な言語は対応しています。(C#/Java/JavaScript/Python/Node.js)

どのようなデータを収集するかといえば、代表的な物は以下の通りです。

データ 意味
リクエスト HTTPのリクエストを記録する
トレース アプリケーションのログを記録する
例外 アプリケーションがスローした例外を記録する
メトリック Javaの場合だと、JVMの情報が定期的に記録される
依存関係 アプリが依存する外部コンポーネントを記録する。JDBCとか

Azure Application Insights Telemetry のデータ モデル - Azure Monitor | Microsoft Docs

例えば、 Java アプリケーションに Application Insights の設定を行っておけば、これらの情報が収集され、Azure 上にある Application Insights に情報が送られ続けます。これらをどのように見るか(可視化)は、ポータルで色々な方法が用意されていますし、クエリ言語でデータを検索することもできます。

Application Insights for Java

現在、2.6系と、3.0系の2つのバージョンがあります。

前者は、アプリケーションにライブラリを含める形でパッケージングする必要がありますので、既存資産に手を入れる必要がります。メンテナンスはされていますが、最新ではないので3.0を使うことをお勧めします。カスタムメトリクスを取得したい場合は、こちらを使う必要もあったりしますが、それは別の機会に。

現時点でのlatestは、3.0系です。 Java エージェントの仕組みを使用しており、既存資産に手を入れずApplication Insights に対応させることができます。

使い方は簡単で、JVM 引数に -javaagent:path/to/applicationinsights-agent-3.0.3.jar と指定するだけです。後で説明しますが、キーの設定は環境変数等に必要ですが。

以下のGithubから最新がダウンロード出来ると思います。執筆時点では、3.0.3が最新で、Java8以降が対象です。

また、エージェント方式のドキュメントは以下にあります。

Azure Monitor Application Insights Java - Azure Monitor | Microsoft Docs

何が収集されるか

先ほどのドキュメントにもかかれていますが、適当引用しますと、主要のコンポーネントに対応し、それらのメトリクスが自動収集されます。

リクエスト

  • JMS コンシューマー
  • Kafka コンシューマー
  • Netty/WebFlux
  • Servlets
  • Spring スケジュール

ログ

  • java.util.logging
  • Log4j (MDC プロパティを含む)
  • SLF4J/Logback (MDC プロパティを含む)

依存関係

  • Apache HttpClient と HttpAsyncClient
  • java.net.HttpURLConnection
  • JMS
  • Netty クライアント / OkHttp
  • JDBC

実際ためしてみる

そこそこのアプリじゃないと、集まるデータもあつまらないので、Spring Pet Clicnc アプリで試してみます。以下から、適当にCloneして環境を整えます。

Application Insights は、Azure ポータルから作成し、インストルメンテーションキーを含む接続文字列を取得しておきます。Application Insights は、Azure 上で動くアプリ限定というわけではありません。オンプレや他プラットフォームからも利用できます。テレメトリの送信はHTTPベースですので、気軽に利用できると思います。

mvn spring-boot:run すると、アプリが起動しますので、ブラウザでアクセスしてみましょう。おなじみの画面が表示されます。

2021-05-02 10_18_21-PetClinic __ a Spring Framework demonstration - [InPrivate] - Microsoft​ Edge.png

一旦終了し、以下の設定を行います。

pom.xml の maven plugin のJVM引数の構成を設定します。

        <configuration>
          <jvmArguments>-javaagent:c:\yourpath\applicationinsights-agent-3.0.3.jar</jvmArguments>
        </configuration>

次に接続文字列を環境変数に設定します。

set APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=...

観察してみる

再度実行して、Webを操作してみましょう。しばらくすると、送信されたテレメトリをAzure ポータル側で見られるようになります。代表的なものをいくつか見てみます。

ライブメトリクス

簡単に動作しているか確認するには、ライブメトリクスを開きます。リアルタイムにアプリケーションの状況が確認できます。言語によってはサポートしてない場合もあった気もしますが、Java の 3.0系ではサポートされています。

2021-05-02 10_40_29-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

検索

ざっくりどんなものが記録されているか確認するには、トランザクションの検索を見てみます。下記の画像のように、Request/Dependency テレメトリが記録されていることがわかります。

2021-05-02 10_42_21-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

アプリケーションマップ

自アプリケーションと、外部コンポーネントの依存関係がマップ形式表示されます。Spring Pet Clinicですと、外部コンポーネントが内部のDBくらいしかないので、この程度の表示になってしまいますが、ストレージに依存していたり、CosmosDbに依存したり、外部のAPIに依存していれば、当然それらはマップ化されます。

2021-05-02 10_44_35-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

失敗

例外が記録されます。ハンドルされないものや、例外オブジェクト付のログなんかは、ここに記録されます。Spring Pet Clinic では、例外を起こす画面があるので、そのページをアクセスしてみましょう。

この例ではあまり有意な情報はでませんが、エラーの上位や、エラーをドリルダウンしていくことができます。

2021-05-02 10_49_06-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

詳細

ドリルダウンしていくと以下のような詳細画面を表示できます。どのリクエストから、どの外部コンポーネントが呼ばれているのかを、チャート形式で見ることが出来ます。例外基点でどのようなリクエストがエラーを引き起こしたかなどの原因究明に役立つでしょう。

2021-05-02 10_50_51-エンド ツー エンド トランザクションの詳細 - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

ログの検索

記録された生のデータは、ログの検索から見ることが出来ます。テレメトリ毎にKQLというクエリ言語で検索したり、それらをグラフ化したりできます。以下はリクエストを取得した例です。

2021-05-02 10_53_31-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

余談ではありますが、ログを検索すれば、どのようなSQLが発行されたかを確認したり、

2021-05-02 10_54_40-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

VMの統計情報を見ることも出来ます。

2021-05-02 10_55_31-qiitaappinsights - Microsoft Azure および他 1 ページ - 職場 - Microsoft​ Edge.png

まとめ

今回は、Azure Application Insights を試してみましたが、アプリケーション開発者にとって入れて損することはないので、是非設定しましょう。WebApps/Functions などは、ポータルから設定することもできるので、ほぼなにもすることはありません( すでに、3.0 ベースのエージェントになっていると思いますが、未確認)

一定量までは無料で使うことも出来ますし、色々試してみることをお勧めします。ある程度データが蓄積されてないと面白くないのですが。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0