ストレージアカウントのメトリックを一括で取得したかったので Azure CLI を使いました
めちゃくちゃハマりましたが、、、
結論から言うと、サブスクリプション内のストレージアカウントに含まれる Blob, Table, Queue, File の容量(メトリック)を取得することができました
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
storageAccounts = $( az storage account list --query '[].id' --output tsv)
# CSV ファイルにヘッダーを追加
echo "resourceID,kind,CapacityByte,CapacityKiB,CapacityMiB,CapacityGiB" > Capacity.csv
for storageAccount in $storageAccounts
do
resourceIDBlob = " ${ storageAccount } /blobServices/default"
CapacityBlobMetrics = $( az monitor metrics list --resource $resourceIDBlob --interval PT1H --metric BlobCapacity --output json --start-time $( date -u -d '2 hours ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $( date -u -d '1 hours ago' +%Y-%m-%dT%H:%M:%SZ))
echo " $CapacityBlobMetrics " | jq -r '.value[].timeseries[].data[].average' | awk -v resourceID = " $storageAccount " '{print resourceID "," "Blob," $1 "," $1/1024 "," $1/1048576 "," $1/1073741824}' >> Capacity.csv
resourceIDFile = " ${ storageAccount } /fileservices/default"
CapacityFileMetrics = $( az monitor metrics list --resource $resourceIDFile --interval PT1H --metric FileCapacity --output json --start-time $( date -u -d '2 hours ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $( date -u -d '1 hours ago' +%Y-%m-%dT%H:%M:%SZ))
echo " $CapacityFileMetrics " | jq -r '.value[].timeseries[].data[].average' | awk -v resourceID = " $storageAccount " '{print resourceID "," "File," $1 "," $1/1024 "," $1/1048576 "," $1/1073741824}' >> Capacity.csv
resourceIDQueue = " ${ storageAccount } /queueservices/default"
CapacityQueueMetrics = $( az monitor metrics list --resource $resourceIDQueue --interval PT1H --metric QueueCapacity --output json --start-time $( date -u -d '2 hours ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $( date -u -d '1 hours ago' +%Y-%m-%dT%H:%M:%SZ))
echo " $CapacityQueueMetrics " | jq -r '.value[].timeseries[].data[].average' | awk -v resourceID = " $storageAccount " '{print resourceID "," "Queue," $1 "," $1/1024 "," $1/1048576 "," $1/1073741824}' >> Capacity.csv
resourceIDTable = " ${ storageAccount } /tableservices/default"
CapacityTableMetrics = $( az monitor metrics list --resource $resourceIDTable --interval PT1H --metric TableCapacity --output json --start-time $( date -u -d '2 hours ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $( date -u -d '1 hours ago' +%Y-%m-%dT%H:%M:%SZ))
echo " $CapacityTableMetrics " | jq -r '.value[].timeseries[].data[].average' | awk -v resourceID = " $storageAccount " '{print resourceID "," "Table," $1 "," $1/1024 "," $1/1048576 "," $1/1073741824}' >> Capacity.csv
done
ざっくり手順
Azure Portal 上の表現の確認
Azure CLI で取得するメトリックの確認
Azure CLI で取得するメトリックの取得
1. Azure Portal 上の表現の確認
ストレージ アカウントには Blob, Table, Queue, File があります
これらはそれぞれに対して容量のメトリックがあります
Azure Portal でストレージアカウントのメトリックを見てみます
メトリック名前空間が [アカウント] になっていると、ストレージアカウント全体(=Blob, Table, Queue, File の合計)の容量を取得できます
ストレージアカウント全体の容量 :
一方で、メトリック名前空間を [Blob] にすると、Blob の容量のみを取得できます
Blob の容量 :
このように、メトリック名前空間を変えることで、Blob, Table, Queue, File の容量を取得できます
2. Azure CLI で取得するメトリックの確認
Azure CLI で下記のコマンドを使うと、リソースで使用できるメトリックがわかります
1
az monitor metrics list-definitions --resource $resourceID
実行結果を一部抜粋するとこのようになります
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[
{
"category" : "Capacity" ,
"displayDescription" : "The amount of storage used by the storage account. For standard storage accounts, it's the sum of capacity used by blob, table, file, and queue. For premium storage accounts and Blob storage accounts, it is the same as BlobCapacity or FileCapacity." ,
"id" : "/subscriptions/027d0d66-cd43-43d8-8b69-6a6c067635dc/resourceGroups/rg-flowlog/providers/Microsoft.Storage/storageAccounts/storagegbfocqunwodng/providers/microsoft.insights/metricdefinitions/UsedCapacity" ,
"isDimensionRequired" : false ,
"metricAvailabilities" : [
{
"retention" : "P93D" ,
"timeGrain" : "PT1H"
}
],
"name" : {
"localizedValue" : "Used capacity" ,
"value" : "UsedCapacity"
},
"namespace" : "Microsoft.Storage/storageAccounts" ,
"primaryAggregationType" : "Average" ,
"resourceGroup" : "rg-flowlog" ,
"resourceId" : "/subscriptions/027d0d66-cd43-43d8-8b69-6a6c067635dc/resourceGroups/rg-flowlog/providers/Microsoft.Storage/storageAccounts/storagegbfocqunwodng" ,
"supportedAggregationTypes" : [
"Average"
],
"unit" : "Bytes"
},
(省略)
]
このうち、[value] に当たる部分がメトリック名っぽいので、これだけを抜き出す下記のコマンドを実行します
1
az monitor metrics list-definitions --resource $resourceID | jq -r '.[].name.value'
実行結果がこちらです
Azure Portal の表示と比較すると、これは名前空間が [アカウント] になっているメトリック名前空間に該当することがわかります
1
2
3
4
5
6
7
8
system [ ~ ] $ az monitor metrics list-definitions --resource $resourceID | jq -r '.[].name.value'
UsedCapacity
Transactions
Ingress
Egress
SuccessServerLatency
SuccessE2ELatency
Availability
Copliot と相談した結果、ストレージアカウントのリソース ID に /blobServices/default
、/fileservices/default
、/queueservices/default
、/tableservices/default
を追加することで、Blob, Table, Queue, File の名前空間になることがわかりました
先ほどと同じように メトリックの確認コマンドを実行してみます
1
2
3
4
5
6
7
8
9
10
11
12
system [ ~ ] $ resourceIDBlob = " ${ resourceID } /blobServices/default"
system [ ~ ] $ az monitor metrics list-definitions --resource $resourceIDBlob | jq -r '.[].name.value'
BlobCapacity
BlobCount
ContainerCount
IndexCapacity
Transactions
Ingress
Egress
SuccessServerLatency
SuccessE2ELatency
Availability
無事に名前空間が Blob になっていることがわかりました
az monitor metrics list-definitions
の実行結果の JSON には、メトリックの詳細情報が含まれています
例えば下記の箇所を見ると、メトリックの保持期間や時間粒度がわかります。
この時間粒度を明示的に指定しないと、データの取得時にエラーが発生することがあります
"metricAvailabilities": [
{
"retention": "P93D",
"timeGrain": "PT1H"
}
],
3. Azure CLI で取得するメトリックの取得
では、最後に実際にデータが取得できるのか確認してみます
テストに使うストレージアカウントで、Blob の容量を取得してみます
まずは Azure Portal 上の表示を見てみると 24.1KiB でした
Blob の容量 :
続いて Azure CLI でメトリックを取得してみます
1
az monitor metrics list --resource $resourceIDBlob --interval PT1H --metric BlobCapacity
無事に取得できました
24646.0 Bytes であることがわかります
Blob の容量 :
KiB に直すと、24.06 KiB となり、小数第2位を四捨五入すると Azure Portal 上の表示と一致します
Blob の容量 :
おまけ:メトリックの値が存在しない?
ブログ執筆時は問題なくメトリックが取得できましたが、実際にはメトリックの値が存在しないことがあります
メトリックの値が存在しない :
想像ですが、取得するタイミングとメトリックの集計粒度によっては、メトリックの値が存在しないことがあるかもしれません
そのため、下記のように取得対象の時間範囲を変えてみるとメトリックの値が取得できるかもしれません
1
az monitor metrics list --resource $resourceIDBlob --interval PT1H --metric BlobCapacity --output json --start-time $( date -u -d '2 hours ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $( date -u -d '1 hours ago' +%Y-%m-%dT%H:%M:%SZ)
まとめ
ストレージアカウントのメトリックを Azure CLI を使って取得してみました
名前空間の指定の仕方にてこずったのと、メトリックの値が存在しない沼にハマったので備忘録として残しておきます
参考