JSONオブジェクト(メトリクスデータ)をcsvに変換する(jq.exe)

#1. はじめに
ATLシステムズの田中です。前回は、「az monitor metrics list」を[Azure CLIからAzureメトリックを収集するコマンド](https://qiita.com/ATL_Tanaka/items/ee70babe702828565be6)でご紹介しましたが、json形式で出力されるため、そのままではExcelなどでグラフにすることが困難です。
そこで、jq.exe(ver1.6)というフリーウェアを使い、JSON形式のメトリックをCSV形式へ加工する仕方を紹介します。
　対応OS：Linux,MacOSX,FreeBSD,Solaris,Windows

**※免責事項(必ず、ご一読ください)**
　　本記事の情報により生じた、いかなる損害や損失についても、当社は一切の責任を負いかねます。また、誤情報が入り込んだり、情報が古くなったりすることもありますので、必ずしも正確性を保証するものではありませんのでご了承ください。

#2. 概要
　JSON形式のメトリックを、jq.exeでCSV形式へ加工します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1661584/9e3f40ca-0ddf-ac05-57cd-164b230430dc.png)

#3. 結果
完成したbatファイルは下記です。

```azmetrics2csv.bat
cd /d %~dp0
call az login --tenant ドメイン名
call az monitor metrics list --resource "/subscriptions/サブスクリプションのid/resourceGroups/TANA-Test-RG/providers/Microsoft.Web/sites/TestQiitaAppService" --metric AverageMemoryWorkingSet --aggregation maximum average --start-time 2021-06-01T00:00:00+09:00 --end-time 2021-06-30T23:59:59+09:00 --interval PT24H|jq-win64.exe -r ".value[0].timeseries[0].data[]|[.timeStamp,.total]|@csv" > resource_metrics.csv 2>&1
```

azmetrics2csv.batを実行すると、このbatファイルが配置されている階層に、resource_metrics.csvを出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1661584/b7d76bf0-7c41-337b-791a-a0dc139e07b8.png)

#4. jqコマンド部分の解説
今回は、**"timeStamp","average","maximum"**を列とするcsvを作成したいので、下記のコマンドとなります。

```jqコマンド.bat
jsonを出力するコマンド|  jq-win64.exe -r ".value[0].timeseries[0].data[]|[.timeStamp,.average,.maximum]|@csv" > resource_metrics.csv 2>&1
                     ^➀ ^^^^^^^^^^➁ ^^➂ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^➃ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^➄ ^^➅ ^➆ ^^^^^^^^^^^^^^^^^➇ ^^^^➈ 　
```

ここで、➀～➈は下記を意味します。
➀｜
　　dosの**パイプ演算子**。演算子より左のコマンドの出力を、演算子より右のコマンドに流し込む。

➁jq-win64.exe
　　jq実行ファイル。Windows向け。jsonオブジェクト→csvデータに変換する。下記でダウンロード可能。
　　[リンク：jq is a lightweight and flexible command-line JSON processor.](https://stedolan.github.io/jq/)
　　他のOS(Linux,MacOSX,FreeBSD,Solaris)の場合、以下のリンクからダウンロード可能。
　　[Download jq](https://stedolan.github.io/jq/download/)

➂-r
　　JSON形式ではなく、生の文字列として出力するオプション。

➃.value[0].timeseries[0].data[]
　　プロパティの指定。取得する変数を内包するブラケット{}が入っているプロパティを指定する。
➄[.timeStamp,.average,.maximum]
　　取得する変数の指定する。csvの列にセットされる。
　　変数名の先頭に、➃の子要素の、という意味の　**.**　を付けることを忘れずに！
　→➃➄を指定する文法については[5.文法](#5-文法)を参照。
➅@csv
　出力形式の指定。

```jq-win64.exeに流れ込むjsonオブジェクト.json
{
  "cost": 86396,
  "interval": "1 day, 0:00:00",
  "namespace": "Microsoft.Web/sites",
  "resourceregion": "japaneast",
  "timespan": "2021-05-31T15:00:00Z/2021-06-30T14:59:59Z",
　"value": [
    {
      "resourceGroup": "TANA-Test-RG",
      "timeseries": [
        {
          "data": [ ←➃でここのプロパティを指定する。
            {
              "average": 0.0,
              "count": null,
              "maximum": 0.0,
              "minimum": null,
              "timeStamp": "2021-05-31T15:00:00+00:00",←➄で変数を指定。
              "total": null←➄で変数を指定。
            },
```
➆>
　　リダイレクト演算子。左のコマンドの出力(csvデータ)を、➇に流し込む。
➇resource_metrics.csv
　　出力ファイル名の指定。
➈2>&1
　　リダイレクトする範囲の指定。標準出力も標準エラー出力も区別せずにリダイレクトする。

#5. 文法
　[#4.jqコマンド部分の解説](#4-jqコマンド部分の解説)では、data配列の全要素それぞれの"timeStamp"、"average"、"total"を指定する必要があったので、➃➄➅では、以下のようにdataの全要素を指定する必要があります。

```
　　".value[0].timeseries[0].data[]|[.timeStamp,.average,.total]|@csv"
```
疑似コードに読み下すと、**「全体要素の子要素(.)のvalueの[0]番目の子要素(.)のtimeseriesの[0]番目の子要素(.)のdata配列全て（data[]）を指定しなさい。その各オブジェクト(|[])の子要素(.)のtimeStampとaverageとtotalを取得しなさい。」**という指示になります。
注意点は、"value"のような**「JSONでオブジェクトの配列が1つ存在する」**という場合は、配列であることに変わりはないので、**[0]は忘れないでプロパティの後ろ**に付けてください。

また、**"resourceGroup"**をとりたい場合➃➄➅は下記となります。

```
　　".value[0]|[.resourceGroup]|@csv"
```
疑似コードに読み下すと、**「全体要素の子要素(.)のvalueの[0]番目を指定しなさい。その各オブジェクト(|[])の子要素(.)のresourceGroupを取得しなさい。」**という指示になります。

・・・これで、プロパティ/変数名の指定は、ある程度できるようになりそうですね。（^^）b

jq.exeのオプションを知りたいときは、jq-win64.exe --helpを叩けば教えてくれます。

#7. 最後に一言
　最後まで読んでいただき、ありがとうございました！
　余談ですが、弊社は**facebook**もしております！
　　　　　　　　[![f_logo_RGB-Blue_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1661584/81cb9432-5fc7-7dfd-0155-15a602114fa2.png)](https://www.facebook.com/atlsystems)

#8. 参考資料
- [Download jq](https://stedolan.github.io/jq/download/)
- [jq is a lightweight and flexible command-line JSON processor.](https://stedolan.github.io/jq/)
- [jq Manual (development version)](https://stedolan.github.io/jq/manual/)