Azure Application Insights のログを集める

## はじめに
Log Analytics の Basic Logs を検証するにあたり、Application Insights のログがとりあえず必要になりました。今回は以下のspring boot 公式のサンプルアプリを実行し、そのログを Application Insights に送ります。
https://github.com/spring-guides/gs-spring-boot

この記事はアプリ開発の経験はないがアプリのログをとにかく確認したい人向けのものになります。ゴールは **Application Insights のログを取得すること**です (;^_^A

アプリ開発したことない人向けなので何も設定されていない前提で一からやる手順を記載しています。
そのため、今回利用するサンプルアプリは maven を使用してビルドすることから、maven をインストールしたり、maven は Java ツールのため Java を事前にインストールしたりします。

## Java Deployment Kit (JDK) のインストール
Java ツールである maven の仕様に向け、JDK をインストールします。
既存の環境に JDK が入っているかはコマンドプロンプトを立ち上げ、以下のコマンドを入力します
```cmd:
javac -version
```

以下の応答が返ってきた場合、JDK が入っていないためインストールが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/2af9de82-0c67-72f4-7e51-015f2483f001.png)

以下サイトよりインストーラーをダウンロードします。
※Oracle プロファイルの作成が必要です。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

ダウンロードした「jdk-8u341-windows-x64.exe」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/190bec3b-9b5c-e432-3250-68e1baac20e1.png)

[次へ] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/324d78cc-9bcd-85ae-3afd-d478ee274eb5.png)

必要に応じてインストール先を変更し、[次(N)>]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/38b05b30-31c8-65ea-a4e1-46d0f696a83b.png)

インストールを待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/5be78553-9dc4-3691-6cac-77b89f731a81.png)

新しくポップアップウィンドウが出てきます。
コピー先フォルダを必要に応じて指定し、[次(N)>]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/97b4a2fc-ae92-6667-9f4a-c311fef8db9a.png)

[閉じる]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/3d5a7c0b-4286-e24b-4c04-f3c80e16ba76.png)

参考資料として以下が指摘されます。
https://docs.oracle.com/javase/8/docs/

JDKをインストールしたら、環境変数にて JDK に関する設定を行い、Java が正しく動作するようにします。
環境変数には「ユーザー環境変数」と「システム環境変数」の2種類がありますが、JDKの動作のためには「システム環境変数」を設定します。
設定・追加する環境変数は「Path」と「JAVA_HOME」の2つです。

今回の端末は Windwos 10 のため、以下の順に推移します。
[スタートメニュー] - [設定] - [システム] - [システムの詳細設定]

[システムのプロパティ]が立ち上がるので、[環境変数] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/a2426034-7725-7319-415f-427e60c6106b.png)

[システム環境変数] にて [Path] を選択し、[編集] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/255900a6-70dc-623c-ae6b-aa5013207089.png)

[新規] ボタンを押して、以下のパスを入力します。バージョンによってフォルダ名は異なるためご注意ください。
```path:
C:\Program Files\Java\jdk1.8.0_341\bin
```

続いて「JAVA_HOME」の環境変数を作成します。
[システム環境変数] にて [新規(W)..] をクリックし、以下の内容を入力し [OK] をクリックします。
変数名 : JAVA_HOME
変数値 : C:\Program Files\Java\jdk1.8.0_341
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/e274d50c-a0a8-57c1-267a-f579c9588cf5.png)

ここまで設定が完了したらコマンドプロンプトを立ち上げて、以下のコマンドを実行します。
```cmd:
java -version
//または
javac -version
```

設定が入っていれば、下記の応答が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/e84ae215-e80b-82c1-fb6b-2a6066629640.png)

参考：
https://eng-entrance.com/java-install-jdk-windows#JDK-3

## maven のインストール
以下サイトにアクセスします。

「Binary zip archive」をダウンロードします。
Mavenを自分でビルドする場合のみ、ソースアーカイブを使用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/e276f30c-b26d-06ce-b54d-d6f42b3d3190.png)

「apache-maven-3.8.6-bin.zip」をすべて展開します。
回答したファイルである「apache-maven-3.8.6」を「C:\Program Files」配下に移動します。

JDK の際と同様に環境変数を指定します。
[スタートメニュー] - [設定] - [システム] - [システムの詳細設定]の順に遷移します。
[システムのプロパティ]が立ち上がるので、[環境変数] をクリックします。
[システム環境変数] にて [Path] を選択し、[編集] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/255900a6-70dc-623c-ae6b-aa5013207089.png)

[新規] ボタンを押して、以下のパスを入力します。バージョンによってフォルダ名は異なるためご注意ください。
```path:
C:\Program Files\apache-maven-3.8.6\bin
```

設定が完了したら、コマンドプロンプトを立ち上げ低下のコマンドを入力・実行します。
```path:
mvn -v
//または
mvn --version
```
以下の応答が返ってきたら設定は無事完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/068ecf3e-f0b1-8af0-a04e-edbd3ad80937.png)

参考：
https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
https://maven.apache.org/install.html

## spring boot サンプル アプリケーションを実行する
spring boot の以下リポジトリから git clone をします。
https://github.com/spring-guides/gs-spring-boot.git

私は Visual Studio Code を立ち上げて、「Clone Git Repositry..」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/08ddbcb4-ca4c-ed96-ead3-0e5ed7ca709c.png)

[Clone from URL...] を選択すると、自分のローカルディレクトリにリポジトリの中身をコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/47caff01-6406-98c3-cb96-1fb9f669066a.png)

私は今回 Cディレクトリ直下に「gs-spring-boot」を配置しました。

おそらく以下のサイトからダウンロードしても同様のことができると思います。
https://start.spring.io/

リポジトリからコピーしたフォルダの「initial」配下に移動し、「initial」ディレクトリ配下にあるアプリ本体をmavenでビルドします。以下コマンドをコマンドプロンプトにて実行します。
```path:
cd C:\gs-spring-boot\initial
mvn clean package
```

このようなビルド画面が続きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/ce2390f6-d37c-c14c-8a2e-353ce23a075d.png)

完了すると以下の表示が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/3b33cc6b-0844-5286-0d4b-2cb58e1ac318.png)

「spring-boot-initial-0.0.1-SNAPSHOT.jar」によってアプリの稼働確認をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/18fc0ca0-b4b9-006a-d891-ca83a779566f.png)

以下コマンドを実行します。
```path:
cd C:\gs-spring-boot\initial\target
java -jar spring-boot-0.0.1-SNAPSHOT.jar
```
成功すると以下のようにブート画面が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/e1011cdf-1629-7de7-c0cc-24f75ae76dc3.png)

http://[::1]:8080 にアクセスして、ブラウザに「Greetings from Spring Boot!」と表示されればアプリのビルドは成功となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/d018597b-ba5d-2d4f-4abf-7653303ff1a1.png)

8080 を使用しているプロセスがあると失敗するため、まず 8080 ポートを使用しているプロセスを以下コマンドプロンプトを使用して特定します。
```path:
netstat -ano | findstr 8080
```

確認したプロセス ID (PID) によるタスクを kill します。
```path:
taskkill /F /pid <任意の PID>
```

サンプルアプリケーションの実行は以上となります。

次に Application Insights を作成し、このサンプルアプリケーションに Application Insights SDK を使ってテレメトリを収集してみます。

## Application Insights の作成

[Azure Portal](URL:https://portal.azure.com/) にアクセスします。
Azure サブスクリプションがすでにある前提で話は進んでいきますので、ご注意ください🙇

はじめに Application Insights のログを格納基盤として、Log Analytics ワークスペースを作成します。
Log Analytics については以下の記事の冒頭部分が参考になりますと幸いです。

検索バーにて「Log Analytics ワークスペース」を検索し、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/cc04716f-35f8-4e71-795b-52439b331918.png)

[+作成]をクリックしたのちに以下項目を選択または新規作成し、[作成]をクリックします。
サブスクリプション: ＜任意のサブスクリプションを選択＞
リソース グループ: ＜テナント内で一意なリソースグループ名＞
名前: ＜Log Analytics ワークスペースの名前＞
地域: ＜リソースグループと同じ地域の選択を推奨＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/cf4d1e1b-1a90-3662-4eaf-fe2f890c1ec4.png)

Log Analytics ワークスペースが作成されたことを確認し、終了します。

次に、検索バーにて「Application Insights」を検索し、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/95f0c840-b2e1-19e4-9e57-744125d2f1df.png)

[+作成]をクリックしたのちに以下項目を選択または新規作成し、[作成]をクリックします。
サブスクリプション: ＜任意のサブスクリプションを選択＞
リソース グループ: ＜テナント内で一意なリソースグループ名＞
名前: ＜Application Insightsの名前＞
地域: ＜リソースグループと同じ地域の選択を推奨＞
リソースモード: **ワークスペースベース**
Log Analytics ワークスペース: ＜先ほど作成した Log Analytics ワークスペースを指定＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/69c4c61e-b8a7-d3fd-6dfc-8136d4a7da9c.png)

リソースの作成が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/515d748c-3efd-f4c4-509e-2f2484caa2d8.png)

## Application Insights とアプリの接続

以下のサイトから Application Insights の SDK をダウンロードします。
https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-in-process-agent
ダウンロードした SDK およびファイル「applicationinsights-agent-3.3.0.jar」をgs-spring-boot\initial\lib ディレクトリに配置します。

Application Insights のリソースにアクセスします。
[概要]ペインの[接続文字列]をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/0e7282ef-3b51-1a09-8d8d-00cb594240da.png)

[接続文字列](URL:https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/sdk-connection-string?tabs=net)はアプリケーションのテレメトリ データの送信先を定義する文字列です。

「applicationinsights.json」という名前のファイルを「applicationinsights-agent-3.3.0.jar」と同じディレクトリに配置します。このファイルは以下テキストを含みます。
```JSON:
{
  "connectionString": "＜コピーした接続文字列＞"
}
```

「applicationinsights-agent-3.3.0.jar」を Java エージェントとして指定して、コマンドプロンプトから以下のコマンドを実行することで Java アプリケーションを起動します。
```cmd:
cd C:\gs-spring-boot\initial\lib
java -javaagent:applicationinsights-agent-3.0.3.jar -jar target/spring-boot-0.0.1-SNAPSHOT.jar
```
この後、何度か http://[::1]:8080 にアクセスしてください。
ここまでで、Application Insights の作成とアプリケーション ログの収集構成が完了となります。

## Application Insights のログ確認

[Azure Portal](URL:https://portal.azure.com/) にアクセスします。
Application Insights のリソースにアクセスします。
[概要]ペインにて表示されているダッシュボードより、ログが収集できていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/227225d0-0641-a5ec-522b-d017bb7bfd42.png)

[監視|ログ] ペインに遷移します。
以下の非常に簡易的な KQL を入力し、[実行]をクリックします。
```kql:
requests
| take 5
```

内容は「request」というデータテーブルからイベントを 5 件取得しています。
request テーブルにはアプリケーションへのアクセス ログが収集されます。

結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668292/475602d5-7b57-3790-27e1-b10d982d6b48.png)

無事ログが採取できていたため、本検証は以上とします。

参考：
SIOS TECH.LAB 様の以下記事を参考にさせていただきました。
https://tech-lab.sios.jp/archives/23948#i-5