Azure App Spaces と Observability

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

この記事は **[<font color="#6495ED">AoTo Advent Calendar 2023</front>](https://qiita.com/advent-calendar/2023/aoto) 5日目**の記事です。

今回は、[Microsoft Build 2023](https://news.microsoft.com/build-2023/)で発表された [**Azure App Spaces**](https://learn.microsoft.com/ja-jp/azure/app-spaces/overview) を利用することで、Azure での Observability へ入門してみました。

この記事の前段として、[**Azure App Spaces**](https://learn.microsoft.com/ja-jp/azure/app-spaces/overview) を使ってテンプレートをもとに簡単な Todo List アプリケーションを作成し、**Azure App Spaces** と その裏側で利用されている **Azure Developer CLI** の関係についてまとめいます。

https://qiita.com/AoTo0330/items/0075c55d2c4bcf4acbe2

前回に引き続き、Azure から提供されているテンプレート ToDo List アプリケーションを利用します。今回は`azure-dev.yml`に`USE_APIM: true`を追加することで、**Azure API Management** を利用したアーキテクチャを利用しました。

<details><summary>azure-dev.yml の変更</summary>

``` diff_yaml
jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: mcr.microsoft.com/azure-dev-cli-apps:latest
    env:
      AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
      AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}
+     USE_APIM: true
```
</details>

![resources-with-apim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/0f96c7a8-b9d0-f5e8-a8a9-8cf273de164a.png)

## Bicep で Azure Monitor を設定
### プラットフォーム側
App Spaces で監視の実装をするためには、[**Bicep**](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview) による設定が必要です。ここでは`infra/main.bicep`により`monitoring.bicep`を指定して、[**Log Alaytics ワークスペース**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/log-analytics-workspace-overview)と [**Application Insights**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview)、[**Application Insights Dashboard**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/overview-dashboard) が有効化・作成できます。

ここで設定されている内容は、App Spaces の画面(Monitoring)から確認できます。

![AppSpaces_Monitoring.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/fd0f8a75-6361-aa94-67f0-ca094c7ed2b5.jpeg)

今回はこれらのサンプリアプリケーションを利用して、Azure Monitor 監視する方法を掘り下げていきます。

### アプリケーション側
監視対象のアプリケーションにも Application Insights 名を `monitoring.outputs.applicationInsightsName`の形で渡して、監視情報をルーティングできるようにしています。

ちなみに、Application Insights の[サポート言語](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview#supported-languages)は広く、サーバー側のアプリケーション言語 **(ASP.NET, Java, Python, Node.js, ASP.NET Core)** だけではなく、クライアント側の **JavaScript SDK(React, ReactNative, Angular)** にも対応しているため、React クライアントアプリケーションからのリクエストから Python API サーバでの処理をつなげて確認することが可能です。[^1]
[^1]: React は SDK の組み込みが、Pythonコードへ直接の組み込み(手動計装)が必要ですが、今回は触れません。

## Log Analytics
### 概要
[**Log Analytics**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/log-analytics-overview) は現在では [**Azure Monitor Logs**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/data-platform-logs) で利用できるログ分析の機能ですが、もともとは Azure Monitor とは分離されたログ分析ソリューションでした。Azure Monitor に統合され現在も、保管先のテナントとして Log Analytics ワークスペース が必要なことには変わりありません。[^2]
[^2]: Azure Log Analytics は 2021年頃に Azure Monitor に統合されましたが、廃止されるのは Log Analytics Agent(Microsoft Monitoring Agent) のみで、Log Analytics ワークスペースは廃止されません。

Bicep によりこのワークスペースが有効化されており、一連のアプリケーションのリソースによって記録されたログが収集されます。ログは [Azure Table](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/manage-logs-tables) にログの種類ごとにテーブルを分けて保存され、保持期間もテーブルごとに設定できます。

### ログの分析
Log Analytics は対象のワークスペース上でログをクエリすることでログの検索が可能です。ログのクエリは [Kusto Query Language (KQL)](https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/) を使用します。クエリステートメントは3種類ありますが、基本的には以下のような[表形式の式ステートメント](https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/tabularexpressionstatements)で単純なクエリを実行できます。

```sql: query.kql
${{ LogTableName }}
| where StartTime between (datetime(2023-12-01) .. datetime(2023-12-25))
| where State == "${{ QueryStatement }}"  
```

対象のログのテーブル名は Log Analytics ワークスペースの [Tables] から確認できます。
ここで検索対象のログを見つけ、[Logs]で KQL によるクエリを実行します。

![LogAnalytics_Tables.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/67762b24-77d1-c727-249c-35c9bd617f07.jpeg)

![LogAnalytics_KQL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/acbde022-695f-6948-f0cb-3854c3cbee20.jpeg)

## Application Insight
### 概要
[**Application Insights**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview) は言わずとれた、Azure Monitor の Application Preformance Monitoring(APM) ソリューションで、**ASP.NET, Java, Python, Node.js, ASP.NET Core** などの言語のアプリケーション処理やリクエストを可視化することができます。

今回の環境では前述の通り、Python のサーバー側の処理に加えて、React のクライアント側のリクエストまで Application Insights による組み込みで可視化されています。

Application Insights による監視情報は、下記の**ロジック図**に基づいて関連する情報を参照できます。

![app-insights-overview-blowout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/7e52edff-49d6-4b93-8025-a9f684407844.png)

### アプリケーションパフォーマンスの分析
まず初めにアプリケーションの状態を把握するには、[Application map]からアプリケーションのリクエストやコール数を確認するのがわかりやすいです。今回のアプリケーションでは、クライアント側のビュー数が React アプリケーションの計装によってわかり、バックエンドの Python API サーバーに到達するまでに、API Management がリクエストを受け取って処理している様子が可視化されています。

![AppInsight_Appmap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/48fbc26d-7bb6-0fd2-10e6-c85f5c5d2479.jpeg)

ここでは、最終的にAPI Management から Python API サーバーを呼び出したうちの0.3%がエラーとなっていることが一目でわかります。

エラーが発生している箇所のリクエストをクリックすると、その内容をより詳細に確認できます。全体のレスポンスコードの割合やエラータイプ、どこがエラーになっているのかを可視化できます。

![AppInsight_Operations.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/fa653eaf-2359-5d9a-4c30-3e0ba6e9fc90.jpeg)

## Application Insights Dashboard
### 概要
[**Application Insights Dashboard**](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/overview-dashboard) は Application Insights で取得できたアプリケーションのパフォーマンスメトリクスを一画面で確認し、根本原因の特定や障害の調査に役立てることができる機能です。

グラフや要素をクリックするだけで、時間軸を指定したり、特定のメトリクスグラフの詳細の確認が簡単に行えます。

![AppInsight_Operations.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/56e4ee10-3ab3-c29a-8bb7-0d5eea9213ff.jpeg)

### アプリケーションメトリクスの分析
[SRE のゴールデンシグナル](https://sre.google/sre-book/monitoring-distributed-systems/)と呼ばれるような、**トラフィック・エラーレイテンシー・サチュレーション(飽和)** に準じたメトリクスがグラフ上に同一の時系列で表示されます。

これらのメトリクスの時間上の相関を確認し、失敗したリクエストの増加によってレスポンスタイムが増加していることを確認したり、その原因としてI/O処理時間が遅くなっていることを発見できます。

このように Application Insights Dashboard はアプリケーションに欠かせない重要なメトリクスを意識することなく一画面に可視化し、アプリケーションの健全性を即座に把握するのに役立てることができます。

## おわりに
今回は App Spaces とはあまり関係なく、Azure Monitor の監視ソリューションをサンプルアプリケーションをもとに確認してきました。Azure Monitor は監視情報の中でも重要な**メトリクス・ログ・トレース**の情報を関連づけながら確認できる **Azure ネイティブ**なソリューションです。

これらの監視ソリューションの導入は App Spaces のように **Bicep や Azure Resource Manager** のように、コードで一元的に管理することができ、Azure 上のエコシステムを有効活用する上ではとても便利な機能です！

Azure Monitor の各種機能が気になっていた、という方は Azure App Spaces のサンプルアプリケーションから触ってみてはいかがでしょうか？:dog: