Windows Azure Storage 2013-08-15 の Minute Metrics
Windows Azure Advent Calendar 2013 - Qiita [キータ]の 5 日目の記事です。最初Javaネタを書こうと思ってたのですが、11/27にWindows Azure Storageの新しいバージョン(x-ms-version:2013-08-15)が公開され盛り上がっているのでストレージネタに切り替えました。
新バージョンに付いては以前に書いているので、それを見て下さい。
Windows Azure Storage Team Blog で、新しいWindows Azure Storageのリリースが紹介されています。Windows Azure Storage Release - Introducing CORS, JSON, Minute Metrics, and More
立派な訳が出てるので、こちらも合わせてどうぞ。
2013/11/30 翻訳が出ました。S/N RATIO BY SATO NAOKI Windows Azureストレージのリリース – CORS、JSON、分単位メトリックなど2013/12/20 Windows Azure Japan Team Blog 公式 谷訳出ました。 Windows Azure ストレージのリリース - CORS、JSON、分単位メトリックなど各種機能の導入
久しぶりのストレージ のリリースで機能盛り沢山なのですが[1]、その中でもパフォーマンスジャンキー注目の Minute Metrics (分単位メトリックス)を紹介します。機能紹介だけだと面白くないので脱線しながら書きますのでお楽しみ下さい。
Minute Metrics (分単位メトリックス)とは
今まで、Windows Azure StorageのMetricsは時間集計でした。Storage Analytics Metrics の詳細新しい 2013-08-15 version のMinute Metrics では、5分以内に 分単位の集計(Minute Metrics) が参照できるようになりました。それに伴って下記のテーブルが追加されています。
- $MetricsHourPrimaryTransactionsBlob
- $MetricsHourPrimaryTransactionsTable
- $MetricsHourPrimaryTransactionsQueue
- $MetricsMinutePrimaryTransactionsBlob
- $MetricsMinutePrimaryTransactionsTable
- $MetricsMinutePrimaryTransactionsQueue
Hourと付いているのは、以前の $MetricsTransactionsBlob、$MetricsTransactionsTable、$MetricsTransactionsQueue の名前が変わったものです。古い名前のものもありますが、Minute Metrics の導入に伴って命名規則が整理されたようです。今のところ Windows Azure Portal では分単位の設定はできませんが、将来サポートされるそうです。
名前を見ていて面白いのは、Primary という文字列が入っていることです。もしかしたら、GEO replication 先のメトリックスも見れるようになるんじゃないかと思って、「$MetricsMinuteSecondaryTransactionsTable」って名前でテーブルを参照してみました。
エラーには成らなかったのですが、下記のようなレスポンスでTableは空のようです。[2]
HTTP/1.1 200 OK
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: application/json;odata=minimalmetadata;streaming=true;charset=utf-8
Server: Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 9e39e71e-70ea-41b3-be3e-b7a6231315b0
x-ms-version: 2013-08-15
X-Content-Type-Options: nosniff
Date: Thu, 05 Dec 2013 12:00:39 GMT
83
{"odata.metadata":"http://waac2013omi001diag.table.core.windows.net/$metadata#$MetricsMinuteSecondaryTransactionsTable","value":[]}
0
ちなみに、$で始まる適当な名前でリクエストを流すと400 Bad Requestで、リソースに不正な文字が含まれているというエラーになります。
HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Content-Type: application/json;odata=minimalmetadata;streaming=true;charset=utf-8
Server: Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 272dce2f-ac46-46b7-b59d-b0338cefa78b
x-ms-version: 2013-08-15
X-Content-Type-Options: nosniff
Date: Thu, 05 Dec 2013 11:57:59 GMT
DE
{"odata.error":{"code":"InvalidResourceName","message":{"lang":"en-US","value":"The specifed resource name contains invalid characters.\nRequestId:272dce2f-ac46-46b7-b59d-b0338cefa78b\nTime:2013-12-05T11:58:00.5348125Z"}}}
0
メトリックス系のテーブルは下記のようにListTableでも帰ってこないので存在するかどうかは難しいところですが、エラーにならないところを見ると特別扱いされているようで期待してしまいます。
var tables = tableClient.ListTables("$Metrics");
Minute Metrics (分単位メトリックス)を有効にする
Minute Metricsを有効にするには、xms-version:2013-08-15 を指定して、Set Service Properties REST APIを使います。今回は、Widnows Azure Storage Client 3.0.0を使います。今のところWidnows Azure Storage Client 3.0.0のドキュメントがほぼ存在しないのですが、nugetで入れるとデフォルトでは入ります。設定は、ServiceProperties に、Version、MetricsLevel、RetentionDays(保存期間)を入れて、CreateCloud(Blob|Table|Queue)ClientのSetServicePropertiesを呼ぶだけです、簡単ですね。下記のコードだと、Loggingと時間集計メトリックスの設定も同時にやっています。Minute MetricsのRetentionの期間は従来と同じで日付なのでデータ量には要注意です。従来の時間単位集計に比べて60倍のデータが蓄積されます。[3]
private static void SetStorageAnalytics(CloudStorageAccount account)
{
var serviceProperty = new ServiceProperties
{
Logging = new LoggingProperties
{
Version = "1.0",
LoggingOperations = LoggingOperations.All,
RetentionDays = 7,
},
HourMetrics = new MetricsProperties
{
Version = "1.0",
MetricsLevel = MetricsLevel.ServiceAndApi,
RetentionDays = 7
},
MinuteMetrics = new MetricsProperties
{
Version = "1.0",
MetricsLevel = MetricsLevel.ServiceAndApi,
RetentionDays = 1
}
};
account.CreateCloudBlobClient().SetServiceProperties(serviceProperty);
account.CreateCloudTableClient().SetServiceProperties(serviceProperty);
account.CreateCloudQueueClient().SetServiceProperties(serviceProperty);
}
このコード書いていてServicePropertiesのプロパティで「あれ?」と思いました。以前は、ServicePropertiesは、LoggingProperties と MetricsProperties の2つのプロパティを持っていたのですが、3.0では MetricsProperties が無くなって HourMetrics になってしまっているようです、Table側は古い名前も残してあるのに、ライブラリは Braking Changesにしてしまったようですね。このあたりの判断は難しいところなのでしょうが、古い名前もあっても良い気がします。
nugetから無条件で最新版として入るのに前のバージョンと互換性が無いっていうのは大胆な気がしますが、なんらかの事情でちょっとドキュメントが遅れているだけなのでしょう。
実行してリクエスト、レスポンスを覗いてみます。
http request
PUT http://waac2013omi001diag.blob.core.windows.net/?comp=properties&restype=service&timeout=90 HTTP/1.1
User-Agent: WA-Storage/3.0.0 (.NET CLR 4.0.30319.34003; Win32NT 6.3.9600.0)
x-ms-version: 2013-08-15
x-ms-client-request-id: 56bffee5-4626-4835-b254-af38a1520242
x-ms-date: Thu, 05 Dec 2013 12:39:54 GMT
Authorization: SharedKey ********************************************************
Host: waac2013omi001diag.blob.core.windows.net
Content-Length: 626
Connection: Keep-Alive
<?xml version="1.0" encoding="utf-8"?><StorageServiceProperties><Logging><Version>1.0</Version><Delete>true</Delete><Read>true</Read><Write>true</Write><RetentionPolicy><Enabled>true</Enabled><Days>7</Days></RetentionPolicy></Logging><HourMetrics><Version>1.0</Version><Enabled>true</Enabled><RetentionPolicy><Enabled>true</Enabled><Days>7</Days></RetentionPolicy><IncludeAPIs>true</IncludeAPIs></HourMetrics><MinuteMetrics><Version>1.0</Version><Enabled>true</Enabled><RetentionPolicy><Enabled>true</Enabled><Days>1</Days></RetentionPolicy><IncludeAPIs>true</IncludeAPIs></MinuteMetrics><Cors /></StorageServiceProperties>
http response
HTTP/1.1 202 Accepted
Transfer-Encoding: chunked
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 650e2253-9e51-43e5-90bd-6077ef43ef31
x-ms-version: 2013-08-15
Date: Thu, 05 Dec 2013 12:39:47 GMT
0
リクエストで、ServicePropertiesに設定した内容を投げていますがXMLなんですね。ここはJSONじゃないのかと思ったけど、そんなにトラフィックが多いところじゃないので問題ないですね。シンプルでいい感じです。
Minute Metrics (分単位メトリックス)の結果
細かい確認ができていないのですが、結果自体はテーブル名が違うだけで従来の時間集計と同じものが出てるようです。パーテションキーが単位で採番されています。
PartitionKey | RowKey | TotalIngress | TotalEgress | AverageE2ELatency | AverageServerLatency |
---|---|---|---|---|---|
20131205T0303 | user;All | 393 | 59079 | 352 | 53 |
20131205T0303 | user;QueryEntities | 393 | 59079 | 352 | 53 |
20131205T0304 | system;All | 8057 | 9452 | 20 | 19 |
20131205T0304 | user;All | 2188 | 15747 | 46.833333 | 5.166667 |
20131205T0304 | user;QueryEntities | 1478 | 14291 | 68.5 | 6.25 |
20131205T0304 | user;QueryTables | 710 | 1456 | 3.5 | 3 |
20131205T0305 | system;All | 24161 | 28398 | 14.333333 | 13.333333 |
20131205T0305 | user;All | 2041 | 13787 | 268.5 | 5.75 |
20131205T0305 | user;GetTableServiceProperties | 338 | 584 | 2 | 2 |
20131205T0305 | user;QueryEntities | 1703 | 13203 | 357.333333 | 7 |
20131205T0306 | system;All | 32239 | 37972 | 17.25 | 16 |
20131205T0307 | system;All | 23475 | 27904 | 15 | 14.5 |
まとめ
Minute Metrics は出てくるまで少々遅延(5分ぐらい?)があるようですが、分単位のメトリックスが見れるのは助かります。簡単な負荷テストの結果を確認するのにも使えます。今回はStorage Clinet 3.0を使いましたが、現時点ではGitHubにコードが出ていない、変更点のドキュメントが無いなど少々使いづらいところがあります。もし新機能にこだわりが無いなら、あの嫌らしいCastのBUGも治ってますし2.1.0.4 を使うのが良いと思います。今回のように、Minute Metricsの設定がしたいというなら、Storage Clinet 3.0 が必要です。あと、ServicePropertiesに、CorsPropertiesが追加されているので、CROS が使いたい場合も3.0が便利だと思います。
訂正 2013/12/06
訂正です。Storage Clinet 3.0は、現時点ではGitHubにコードが出ていないと書きましたが、正式名称 Windows Azure Storage Libraries for .NET のソースはgithub:azure-storage-netで公開されています。
[1] | 日本リージョン、IaaSのGAなど大きな話題が続いている Azure 全体に比べると地味ですね。 |
[2] | レスポンスのbodyがJSONですね、このバージョンからJSONがサポートされています。 |
[3] | 当たり前ですね |