Azure Monitor Application Insights を Container Apps コンテナ アプリに設定する

# Azure Monitor Application Insights を Container Apps コンテナ アプリに設定する

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu から Azure Container Apps コンテナ アプリに、Azure Monitor Application Insights を設定する一例を紹介します。
![spring-boot_on_azure-container-apps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/1ff6c077-30d8-b680-5056-11b7cb71c9d5.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

Azure Container Apps コンテナ アプリに、Azure CLI コマンドで Azure Monitor Application Insights を設定します。

:::note alert
**Microsoft Azure** は、**Web ブラウザ**から簡単に **Container Apps コンテナ アプリ** の **メトリック** を**閲覧**できる機能があります。これにより、**Application Insights** を導入する**メリットは多くはありません**。この記事では学習のため、Ubuntu で操作する CLI から直接 Container Apps コンテナ アプリを設定する方法を試みています。ご注意ください。 
:::

## 技術トピック

### Azure Monitor Application Insights とは？  

<details>
<summary>こちらを展開してご覧いただけます。</summary>

### [Application Insights](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview)

:::note info
Azure Monitor Application Insights は、Microsoft Azure 上で稼働するアプリケーションの監視・トラブルシューティング・パフォーマンス解析を行うためのクラウドベースのアプリケーションパフォーマンス管理サービスです。

このサービスを使用することで、アプリケーションの稼働状況やエラー発生率、パフォーマンスの低下要因、ユーザーの利用状況などをリアルタイムで可視化し、問題を特定して解決することができます。
:::

</details>

## 開発環境

+ Windows 11 Home 22H2 を使用しています。  

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  
:::

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
```

Java JDK [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/4d11e94a2389758759cd)

```sh
$ java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
```

Maven [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/f4cdc4039158153365fb)

```sh
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
```

Docker [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/3bceee25ac67cc73ebbe)

```sh
$ docker --version
Docker version 23.0.1, build a5ee5b1
```

Azure CLI [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/9721041f9e6e3e987cf0)

```sh
$ az --version
azure-cli                         2.45.0
core                              2.45.0
telemetry                          1.0.8
```

</details>

:::note warn
この記事では基本的に **Ubuntu のターミナルで操作**を行います。**Vim を使用してコピペする方法**を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
:::

https://qiita.com/studio_meowtoon/items/7771ad48676926e41463

## Application Insights を設定する手順

### シェル変数の作成

:::note alert
**シェル変数**として以下の値を作成します。状況により、コンテナ アプリの名前を変える必要があります。
:::

```sh
$ location_name=japaneast
$ resource_group_name=rg-hello
$ containerapp_env_name=cae-hello
$ containerapp_name=ca-hello-spring-boot
$ container_image_name=app-hello-spring-boot-agent:latest
```

:::note warn
この記事では、**Azure** の**リソース設定**において特に使用頻度が高い**リージョン**と**リソースグループ**、**アプリの名前など**については、**シェル変数**という機能を使って設定する方法を紹介しています。
:::

### ログイン

Azure CLI で Azure にログインします。  

```sh
$ az login
```

こちらの関連記事で手順がご確認いただけます。 

https://qiita.com/studio_meowtoon/items/9721041f9e6e3e987cf0

### リソースグループ

リソースグループを作成します。

```sh:Microsoft.Resources/resourceGroups
$ az group create \
    --name $resource_group_name \
    --location $location_name
```

### Application Insights

Application Insights インスタンスを作成します。  
※ 初回に拡張機能のインストールが必要となる旨のメッセージが表示されます。  

```sh:microsoft.insights/components
$ az monitor app-insights component create \
    --resource-group $resource_group_name \
    --app $containerapp_name \
    --location $location_name
```

**Azure Portal** では以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/deb25101-19c7-29ba-3275-4ce713742213.png)
Application Insights インスタンスの**接続文字列**をシェル変数 **connection_string** に取得します。

```sh
$ connection_string=$(az monitor app-insights component show \
    --resource-group $resource_group_name \
    --app $containerapp_name \
    --query connectionString \
    --output tsv)
```

シェル変数の値を確認します。

```sh
$ set | grep connection_string
connection_string='InstrumentationKey=dfxxxx22-4cc9-4xx0-a279-39xxxxxxxff0;IngestionEndpoint=https://japaneast-0.in.applicationinsights.azure.com/;LiveEndpoint=https://japaneast.livediagnostics.monitor.azure.com/'
```

:::note warn
**Azure** の**リソース**設定では、**他のリソースのキー**や**接続文字列**が必要になることがあります。**Azure CLI** を使用して設定を進める場合、**シェル変数**を使う方法があります。シェル変数に馴染みがない人もいるかもしれませんが、手順に従って進めることができます。
:::

:::note info
ここまでの手順で **Application Insights インスタンス**を作成して、その**接続文字列**を取得することができました。
:::

### Spring Boot アプリを作成

こちらの関連記事で手順がご確認いただけます。

https://qiita.com/studio_meowtoon/items/9c07e20b4124d8c5f972

#### プロジェクトフォルダに移動  

プロジェクトフォルダに移動します。  
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。   

```sh
$ cd ~/tmp/hello-spring-boot
```

#### [Application Insights Agent for Java](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/opentelemetry-enable?tabs=java) のダウンロード

https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/opentelemetry-enable?tabs=java

:::note info
JAR ファイル形式のライブラリを **Ubuntu**に**ダウンロード**します。
:::

**agent** ディレクトリを作成して移動します。

```sh
$ mkdir -p agent
$ cd agent
```

Application Insights Agent の最新バージョンの情報をシェル変数 **agent_version** に取得します。

```sh
$ agent_version=$(curl -s \
    https://api.github.com/repos/microsoft/ApplicationInsights-Java/releases/latest \
    | grep tag_name \
    | cut -d '"' -f 4)
```

シェル変数を確認します。

```sh
$ set | grep agent_version
agent_version=3.4.10
```

Application Insights Agent の最新バージョンをダウンロードします。

```sh
$ wget https://github.com/microsoft/ApplicationInsights-Java/releases/download/$agent_version/applicationinsights-agent-$agent_version.jar
```

JAR ライブラリを確認します。

```sh
$ ls -la | grep *applicationinsights-agent*
-rw-r--r-- 1 $USER $USER 37580237  2月 23 14:36 applicationinsights-agent-3.4.10.jar
```

:::note info
ここまでで、**GitHub** から **Application Insights Java** ライブラリを **Ubuntu**に取得することができました。
:::

#### Application Insights の設定ファイル作成

:::note alert
上の手順で取得した **connection_string** が必要です。
:::

applicationinsights.json を作成します。

```sh
$ cat << EOF > applicationinsights.json
{
   "connectionString": "$connection_string"
}
EOF
```

connection_string が設定されているか確認します。

```sh
$ cat applicationinsights.json
```

ディレクトリ内のファイルの内容を確認します。

```sh
$ pwd
/home/$USER/tmp/hello-spring-boot/agent
$ ls -lah
合計 36M
drwxr-xr-x 2 $USER $USER 4.0K  3月 17 14:55 .
drwxr-xr-x 6 $USER $USER 4.0K  3月 17 13:09 ..
-rw-r--r-- 1 $USER $USER  36M  2月 23 14:36 applicationinsights-agent-3.4.10.jar
-rw-r--r-- 1 $USER $USER  223  3月 17 14:55 applicationinsights.json
```

:::note info
ここまでで、**applicationinsights.json** 設定ファイルを **Ubuntu** に作成することができました。
:::

#### Docker ファイルの編集

プロジェクトフォルダに戻ります。

```sh
$ cd ..
```

Dockerfile を編集します。

```sh
$ vim Dockerfile
```

ファイルの内容

```sh:Dockerfile
# from the base image of a jdk 11 container on Ubuntu 20.04.
FROM adoptopenjdk/openjdk11:x86_64-ubuntu-jdk-11.0.18_10-slim

# version for an application insights agent.
ARG agent_version=$agent_version

# create a work dir.
WORKDIR /app

# copy a jvm app.
COPY target/*.jar app.jar

# copy an application insights agent.
COPY agent/applicationinsights-agent-${agent_version}.jar applicationinsights-agent.jar

# copy an application insights config file.
COPY agent/applicationinsights.json applicationinsights.json

# open port 8080 for a jvm app.
EXPOSE 8080

# startup a jvm app with an agent.
ENTRYPOINT ["java","-javaagent:applicationinsights-agent.jar","-jar","app.jar"]
```

Docker デーモンを起動します。

```sh
$ sudo service docker start
 * Starting Docker: docker    [ OK ]
```

:::note warn
Docker 環境をお持ちでない場合は、以下の関連記事から Docker Engine のインストール手順をご確認いただけます。
:::

https://qiita.com/studio_meowtoon/items/3bceee25ac67cc73ebbe

コンテナイメージをビルドします。

```sh
$ docker build \
    --no-cache \
    --build-arg agent_version=$agent_version \
    -t app-hello-spring-boot-agent .
```

コンテナイメージを確認します。

```sh
$ docker images | grep app-hello-spring-boot-agent
app-hello-spring-boot-agent      latest     039fc6b22535   42 seconds ago   427MB
```

:::note info
ここまでで、**Ubuntu** の **Docker** 環境に **app-hello-spring-boot-agent:latest** カスタムコンテナイメージを作成することができました。
:::

### Docker Hub にコンテナイメージを登録  

Docker Hub にログインします。  

```sh
$ docker login
Login Succeeded
```

コンテナイメージにタグを付けます。

:::note warn
**$USER** の部分はご自身のコンテナリポジトリに読み替えて下さい。  
:::

```sh
$ docker tag app-hello-spring-boot-agent:latest $USER/app-hello-spring-boot-agent:latest
```

Docker Hub にコンテナイメージをプュシュします。

```sh
$ docker push $USER/app-hello-spring-boot-agent:latest
```

:::note info
ここまでで、**Docker Hub** に **app-hello-spring-boot-agent:latest** カスタムコンテナイメージをプュシュすることができました。
:::

### Container Apps コンテナ アプリの作成

コンテナ アプリ環境を作成します。

```sh
$ az containerapp env create \
    --resource-group $resource_group_name \
    --name $containerapp_env_name \
    --location $location_name
```

コンテナ アプリを作成します。

```sh
$ az containerapp create \
    --resource-group $resource_group_name \
    --environment $containerapp_env_name \
    --name $containerapp_name \
    --image $USER/$container_image_name \
    --target-port 8080 \
    --ingress 'external' \
    --min-replicas 1
```

コンテナ アプリの FQDN をシェル変数 **fqdn** に取得します。

```sh
fqdn=$(az containerapp show \
    --resource-group $resource_group_name \
    --name $containerapp_name \
    --query 'properties.configuration.ingress.fqdn' \
    --output tsv)
```

コンテナ アプリの URL をリクエストします。

```sh
$ curl https://$fqdn/api/data -w `\n`
```

以下のように **"Hello World!"** の表示を得ることができました。

```sh
{"message":"Hello World!"}
```

Azure Portal には以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/7945013f-fd19-41d5-e524-224265260ec2.png)

:::note info
ここまでで **Container Apps コンテナ アプリ**を Azure クラウドに**デプロイ**することができました。
:::

**Azure Portal** を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/35f3657a-84fc-7014-2138-adc35694a3c8.png)

:::note info
こちらの表示はしばらく経った状況ですが、**メトリックデータの収集**が正常に**動作**していることが確認できました。
:::

## まとめ

検証環境の Azure で、Azure Monitor Application Insights を Container Apps コンテナ アプリに設定することができました。

:::note warn
**Ubuntu** を使ってこの記事の手順を追うことにより、**Linux の知識**も身につけることができます。最初は難しく感じるかもしれませんが、少しずつ進めていくことで自信を持って取り組むことができるようになります。
:::

どうでしたか？ WSL Ubuntu で、Azure クラウドアプリケーション開発環境を手軽に構築することができます。ぜひお試しください。今後も Azure の開発環境などを紹介していきますので、ぜひお楽しみにしてください。