Windows Azure クラウド アプリケーションにトレースを使用する
このポストは、10 月 26 日に投稿された Using Trace in Windows Azure Cloud Applications の翻訳です。
編集メモ : 今回は、マイクロソフトの ASP.NET MVC プログラマ兼ライターを務める Rick Anderson の投稿をご紹介します。この投稿では、トレースを使用した Windows Azure クラウド アプリケーションについて取り上げています。
Windows Azure サンプル コードの多くで、Trace API が使用されています。Visual Studio (および Visual Studio 用 Windows Azure SDK) で Windows Azure 用のクラウド アプリケーションを新規作成すると、アプリケーションに以下の Trace 文が挿入されます。
Trace .WriteLine("Working","Information");
Windows Azure テンプレートにより生成されたコードには、部分的に構成されたトレース診断リスナーが含まれています。ここでは、このトレースを完全に構成する方法を説明します。
トレースの永続化
個人的に、エラーには Trace.TraceError を、情報には Trace.TraceInformation を好んで使用しています。
しかし API の呼び出しでは、Azure 内のデータを完全に永続化するには不十分です。そのため、診断モニターを構成する必要があります。私が使用しているコードを以下に示します。
private void ConfigDiagnostics()
{
DiagnosticMonitorConfiguration config =
DiagnosticMonitor .GetDefaultInitialConfiguration();
config.ConfigurationChangePollInterval = TimeSpan.FromMinutes(1d);
config.Logs.BufferQuotaInMB = 500;
config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1d);
DiagnosticMonitor .Start(
"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" ,
config);
}
上のコードでは、転送頻度は 1 分に設定されています (1 分が最小値であり、これより小さな値を設定すると 1 分に切り上げられます)。アプリケーションがトレース データを生成する速度が非常に遅く、たとえば 1 分あたり 1 イベント程度しか処理されない場合、各エージェントから毎分 1 行のみが 1 つのトランザクションでアップロードされます。転送頻度を 60 分に設定すると、60 行が 1 つのバッチにパッケージされ、1 トランザクションにアップロードされるため、トランザクション コストを抑えることができます。ただし、転送頻度を大きく設定すると以下のデメリットがあります。
ストレージへのデータ転送に大きな遅延が発生する。
データの行数が多い場合 (数万~数十万行)、アップロードは (スムースでなく) バースト的になるため、スロットリングの原因となります。
サンプルでは ScheduledTransferLogLevelFilter を Verbose に設定しているため、すべてのトレース メッセージが取得されます。
コードを使用するため、各 Web ロールおよびワーカー ロールの OnStart() メソッドでは、以下のコードに示す、ConfigDiagnostics を呼び出します。
public override bool OnStart()
{
ConfigDiagnostics();
Trace .TraceInformation("Initializing storage account")
// Code removed for clarity.
}
メモ: 上のコードは、Windows Azure 用のクラウド アプリケーションでのみ動作するものであり、Windows Azure Web サイトでは動作しません。
警告: トレース情報を保存する際には、料金が発生する場合があります。詳細については、Windows Azure 計算ツールを参照してください。また、Azure Storage Explorer (英語) の WADLogsTable で、トレース データをご覧いただけます。
良好なトレース データおよび実稼働データを得るには、独立したストレージ アカウントを使用することが重要です。私がトレース構成に使用する、ServiceConfiguration.Cloud.cscfg ファイルにある XML を以下に示します。
<? xmlversion = " 1.0 " encoding = " utf-8 " ?>
< ServiceConfigurationserviceName = " AzureEmailService " xmlns = " https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration " osFamily = " 1 " osVersion = " * " schemaVersion = " 2012-05.1.7 " >
< Rolename = " MvcWebRole " >
< Instancescount = " 1 " />
< ConfigurationSettings >
< Settingname = " Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString "
value = " DefaultEndpointsProtocol=https;
AccountName=[TraceAccount];
AccountKey=[Key] " />
< Settingname = " StorageConnectionString "
value = " DefaultEndpointsProtocol=https;
AccountName=[DataAccount];
AccountKey=[Key2] " />
</ ConfigurationSettings >
</ Role >
< Rolename = " WorkerRoleA " >
< Instancescount = " 1 " />
< ConfigurationSettings >
< Settingname = " Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString "
value = " DefaultEndpointsProtocol=https;
AccountName=[TraceAccount];
AccountKey=[Key] " />
< Settingname = " StorageConnectionString "
value = " DefaultEndpointsProtocol=https;
AccountName=[DataAccount];
AccountKey=[Key2] " />
</ ConfigurationSettings >
</ Role >
</ ServiceConfiguration >
トレースは、Windows Azure アプリケーションの監視にたいへん効果的です。また、プログラムのデバッグに役立つ情報が豊富に得られます。
Windows Azure のトレースに関する詳細については、以下を参照してください。