Powershell×AzureCLIでAzureメトリックを自動取得する

## 目標

windowsのpowershellからAzureCLIを使ってAzureメトリックを取得すること

## 背景

お客様のAzure環境のメトリック分析をすることになりました。今回は試験的試みということもありメトリック取得は閲覧権限のユーザでおこなうことになりました。

とはいえリソース数はそれなりにあり、さらにそのリソースに対してメトリック数もそれなりにあります。手動ダウンロードでは煩雑なためAzureCLIを用いて自動取得することにしました。

AzueCLIを用いたAzureメトリックの取得方法は探せばきちんとMicrosoftのドキュメントに記載があります。ただ、はじめてやる私にとって必要なマニュアルをピンポイントで辿って正解にたどり着くことは難しかったのでこの記事を残します。

## 概要

今回の作業の流れを以下の図にまとめました。

![概要図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640132/a77e0849-4163-848a-783b-2e2277b3941b.png)

:::note warn
**作業の流れ**
1. Azureポータルからメトリックを取得したいリソースのリソースIDを取得
2. AzureCLIでAzureにログイン
3. AzureCLIでメトリック定義の取得
4. AzureCLIでメトリックの取得
:::

## 事前情報

### 前提

- AzureCLIはインストール済み
- メトリックを取得したいAzureリソースは作成済み

AzureCLIのインストールに関してはこちらを参照してください。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli

### 環境

今回実行した環境は以下です。

- windows 10 22H2
- azure-cli 2.55.0

## 詳細手順

### リソースIDの取得

メトリックの取得にはまず対象リソースのリソースIDが必要です。リソースIDはAzureポータルから確認できます。リソースIDの確認手順はこちらが分かりやすいので参考にしてください。

https://jpaztech.github.io/blog/information/Subscription-ID-verification/

### AzureCLIのログイン

powershellを開き、以下のコマンドを実行しログインします。ブラウザでAzureへのログイン画面が表示されるのでログインします。

```powershell
az login
```

### メトリックの定義の取得

次に取得したいリソースにはどのようなメトリックが用意されているかを確認します。

厳密にはメトリックは指定しなくてもコマンド実行できるのですが、その場合すべてのメトリックが取得されるわけではなくデフォルト設定されているメトリックが取得できるのみのようです。そのため、実質必須パラメータかと思います。

メトリック定義の取得コマンドは以下です。

```powershell
az monitor metrics list-definitions --resource {リソースID}
```

https://learn.microsoft.com/ja-jp/cli/azure/monitor/metrics?view=azure-cli-latest#az-monitor-metrics-list

たとえば先ほどのAppServiceのメトリック定義を取得すると以下コマンドになります。

```powershell
az monitor metrics list-definitions --resource /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$RESOURCE_NAME
```

コマンドが正常に実行されるとこのような内容が返されます。本当は指定したリソースIDで指定できる全メトリックが表示されるのですが、今回は`CPU Time`の部分だけを抜粋しています。

```json
[
  {
    "dimensions": [
      {
        "localizedValue": "Instance",
        "value": "Instance"
      }
    ],
    "displayDescription": "The amount of CPU consumed by the app, in seconds. For more information about this metric. Please see https://aka.ms/website-monitor-cpu-time-vs-cpu-percentage (CPU time vs CPU percentage). For WebApps only.",
    "id": "{リソースID}/providers/microsoft.insights/metricdefinitions/CpuTime",
    "isDimensionRequired": false,
    "metricAvailabilities": [
      {
        "retention": "P93D",
        "timeGrain": "PT1M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT5M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT15M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT30M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT1H"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT6H"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT12H"
      },
      {
        "retention": "P93D",
        "timeGrain": "P1D"
      }
    ],
    "name": {
      "localizedValue": "CPU Time",
      "value": "CpuTime"
    },
    "namespace": "Microsoft.Web/sites",
    "primaryAggregationType": "Total",
    "resourceGroup": "{リソースグループ}",
    "resourceId": "{リソースID}",
    "supportedAggregationTypes": [
      "Count",
      "Total",
      "Minimum",
      "Maximum"
    ],
    "unit": "Seconds"
  },
  {
    "dimensions": [
      {
        "localizedValue": "Instance",
        "value": "Instance"
      }
    ],
```

レスポンスを見るとメトリック名以外にも多くの項目が記載されています。
たとえばmetricAvailabilitiesを見ると、取得できるデータ間隔が分かります。

```json
    "metricAvailabilities": [
      {
        "retention": "P93D",
        "timeGrain": "PT1M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT5M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT15M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT30M"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT1H"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT6H"
      },
      {
        "retention": "P93D",
        "timeGrain": "PT12H"
      },
      {
        "retention": "P93D",
        "timeGrain": "P1D"
      }
    ],
```

`PT1M`は1分毎、`PT5M`は5分毎、`PT1H`は1時間毎、`P1D`は1日毎といった具合です。これはメトリック毎に異なります。

また、`supportedAggregationTypes`では取得するメトリックの集計方法が分かります。

```json
    "supportedAggregationTypes": [
      "Count",
      "Total",
      "Minimum",
      "Maximum"
    ],
```

データ間隔が`PT1H`（1時間ごと）だとすると、`Total`ではCPU Timeの1時間の合計、`Minimum`では1時間の最低値となります。

これらはメトリック取得する際にオプション指定もできますので、ここで一緒に確認できるのは便利です。

#### 補足① メトリック名はAzureポータル上だと表記が若干異なる

メトリック名はAzureポータルからも確認できます。ただし、ポータル上の表示はコマンドで実行するときに使う表記と若干異なるため注意が必要です。（スペースのあるなしや大文字小文字など）。

たとえばAzureポータル上でAppServiceのメトリックを開くと`Average memory working set`というメトリックがあります。

![Azureポータル上でのメトリック確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640132/ba9373e7-0a5e-8073-90c9-8fb7b9cbbd86.png)

しかし、コマンド実行時にこれをそのまま打つとエラーになります。コマンドで実行する際は`AverageMemoryWorkingSet`となります。このような差もあるため、AzureCLIで指定できるメトリック名を取得します。

#### 補足② メトリック定義はマニュアルで確認するのは少し面倒

メトリック定義を紹介しているマニュアルももちろんあります。AppServiceのメトリック定義情報はこちらです。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/reference/supported-metrics/microsoft-web-sites-metrics

ただし、見てわかるようにメトリック定義はサービスごとにページが分かれています。結局リソースIDを調べるのであればコマンドの方が楽かと思います。また、CLIで取得した場合は取得した値をそのまま次のメトリック取得コマンドで使う等応用も効くのでコマンド取得がおススメです。

### メトリックの取得

いよいよメトリックの取得です。こちらがマニュアルです。

https://learn.microsoft.com/ja-jp/cli/azure/monitor/metrics?view=azure-cli-latest#az-monitor-metrics-list

コマンドは以下になります。

```AzureCLI
az monitor metrics list --resource {リソースID} --metrics {メトリック名}
```

たとえばAppServiceの`CpuTime`を取得するときは以下になります。

```powershell
az monitor metrics list --resource /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$RESOURCE_NAME　--metrics CpuTime
```

出力はこのようになります。（評価用に作成したリソースのため値が0になっています。）

```json
{
  "cost": 59,
  "interval": "PT1M",
  "namespace": "Microsoft.Web/sites",
  "resourceregion": "{リージョン}",
  "timespan": "2024-01-12T06:26:59Z/2024-01-12T07:26:59Z",
  "value": [
    {
      "displayDescription": "The amount of CPU consumed by the app, in seconds. For more information about this metric. Please see https://aka.ms/website-monitor-cpu-time-vs-cpu-percentage (CPU time vs CPU percentage). For WebApps only.",
      "errorCode": "Success",
      "id": "{リソースID}",
      "name": {
        "localizedValue": "CPU Time",
        "value": "CpuTime"
      },
      "resourceGroup": "{リソースグループ}",
      "timeseries": [
        {
          "data": [
            {
              "timeStamp": "2024-01-12T06:26:00Z",
              "total": 0.0
            },
            {
              "timeStamp": "2024-01-12T06:27:00Z",
              "total": 0.0
            },
            {
              "timeStamp": "2024-01-12T06:28:00Z",
              "total": 0.0
            }
            // 省略
          ],
          "metadatavalues": []
        }
      ],
      "type": "Microsoft.Insights/metrics",
      "unit": "Seconds"
    }
  ]
}
```

また`-o`オプションで出力形式も変更できます。

```powershell
az monitor metrics list --resource /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$RESOURCE_NAME　--metrics "CpuTime"　-o table
```

```powershell
Timestamp             Name      Total
--------------------  --------  -------
2024-01-12T06:31:00Z  CPU Time  0.0
2024-01-12T06:32:00Z  CPU Time  0.0
2024-01-12T06:33:00Z  CPU Time  0.0
:
```

## おわりに

いかがでしたでしょうか。

簡単そうに見えますが、複数の箇所のマニュアルを見る必要がありやってみるとそこそこ苦戦するところかもしれません。同じような取り組みをする人の助けになれば幸いです。

## We Are Hiring

BIPROGYでは一緒に働く仲間を募集しています。ご興味ある方はこちらをご参照ください。

https://www.biprogy.com/recruit/recruiting/