Windows Azureのパフォーマンスカウンターやログ、トレース

Windows Azure SDK 1.3でDiagnostics回りに変更があったり、Full IISでの不具合があったので、Azureのログって面倒・・・というイメージが多少あるかもしれません。

確かに Azure ではインスタンスのローカル・ストレージに保存され、その後ストレージ・サービスに転送するので、普通のWindows Serverに比べると、いろいろ面倒ではありますが、現在(Windows Azure SDK 1.4 Refresh)は比較的簡単に扱うことができますので、WebRoleのFull IISを使って試してみましょう。

今回は下記の8つの設定を行います。

1.トレース ログ
2.パフォーマンス カウンター
3.Windows イベント ログ
4.インフラストラクチャ ログ
5.IIS ログ
6.IIS 失敗した要求ログ
7.アプリケーションのクラッシュ ダンプ
8.任意のログとファイル(カスタムログファイル)

Windows Azure 診断(監視、ログ、およびトレース)の仕組みなどについては、下記のページをご覧ください。

Windows Azure アプリケーションのデバッグとトラブルシューティング
http://msdn.microsoft.com/ja-jp/library/ff966484.aspx

 

まずはプロジェクトの準備と共通の設定を行います。

1.Web Roleを1個含んだプロジェクトを作成します。

2.ロールのプロパティの Configuration にある Diagnostics にストレージアカウントを設定します。

20110818-001

3.次にOnStartにコンフィグの取得・設定を行うコードを追加します。

using Microsoft.WindowsAzure.Diagnostics.Management;
        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;
            CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
            {
                string configuration = RoleEnvironment.IsAvailable ?
                    RoleEnvironment.GetConfigurationSettingValue(configName) :
                    ConfigurationManager.AppSettings[configName];

                configSetter(configuration);
            });

            // コンフィグの取得
            var storageAccount = CloudStorageAccount.FromConfigurationSetting("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
            var roleInstanceDiagnosticManager = storageAccount.CreateRoleInstanceDiagnosticManager(RoleEnvironment.DeploymentId, RoleEnvironment.CurrentRoleInstance.Role.Name, RoleEnvironment.CurrentRoleInstance.Id);
            var diagnosticMonitorConfiguration = roleInstanceDiagnosticManager.GetCurrentConfiguration();

			// この下に各ログ用のコードを追加していくよ。



            // コンフィグの設定
            roleInstanceDiagnosticManager.SetCurrentConfiguration(diagnosticMonitorConfiguration);
            return base.OnStart();
        }

 

これで共通となる部分の準備完了です。次に個別の設定を行います。

サンプルコードでは、ストレージへの転送時間を1分に設定していますので、「しばらく待てば」の部分は1分以上待ってから確認ください。

※今回はセッションを使いませんし、そのままだとエラーになってしまうので、Web.Configを修正してセッションを無効にして、セッションプロバイダを削除しています

 

1.トレース ログ

Web.config ファイルの <configuration> セクション内に次のコードを配置します(すでに記述がある場合は不要です)。

  <system.diagnostics>
    <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics" />
      </listeners>
    </trace>
  </system.diagnostics>  

 

トレースログの設定を行います。

            diagnosticMonitorConfiguration.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
            diagnosticMonitorConfiguration.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

 

トレースを出力する場所に下記のようなコードを追加します。

            System.Diagnostics.Trace.TraceInformation("Test, Test, Test");

 

しばらく待てばテーブル(WADLogsTable)に入ってきます。

20110818-002

 

 

2.パフォーマンス カウンター

最初に取得するカウンターを定義しておきます。

        public static IEnumerable<string> ConfiguredCounters
        {
            get
            {
                yield return @"Processor(_Total)% Processor Time";
                yield return @"MemoryAvailable MBytes";
                yield return @"ASP.NET Applications(__Total__)Requests Total";                yield return @"ASP.NET Applications(__Total__)Requests/Sec";
            }
        }

 

パフォーマンスカンターの設定を行います。

            ConfiguredCounters.ToList().ForEach(
                counter =>
                {
                    var counterConfiguration = new PerformanceCounterConfiguration
                    {
                        CounterSpecifier = counter,
                        SampleRate = TimeSpan.FromMinutes(1)
                    };

                    diagnosticMonitorConfiguration.PerformanceCounters.DataSources.Add(counterConfiguration);
                });
            diagnosticMonitorConfiguration.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

 

しばらく待てばテーブル(WADPerformanceCountersTable)に入ってきます。

20110818-003

 

 

3.Windows イベント ログ

取得するイベントを設定します。

            diagnosticMonitorConfiguration.WindowsEventLog.DataSources.Add("Application!*");
            diagnosticMonitorConfiguration.WindowsEventLog.DataSources.Add("System!*");
            diagnosticMonitorConfiguration.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

 

しばらく待てばテーブル(WADWindowsEventLogsTable)に入ってきます。

20110818-004

 

 

4.インフラストラクチャ ログ

インフラストラクチャ ログの設定を行います。

            diagnosticMonitorConfiguration.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = System.TimeSpan.FromMinutes(1);
            diagnosticMonitorConfiguration.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;

 

しばらく待てばテーブル(WADDiagnosticInfrastructureLogsTable)に入ってきます。

20110818-005

 

 

5.IIS ログ

IIS ログの設定を行います。

diagnosticMonitorConfiguration.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

 

サイトにアクセスして、しばらくまてばブロブ(wad-iis-logfiles)に入ってきます。

20110818-006

 

 

6.IIS 失敗した要求ログ

「5.IIS ログ」の設定を行いIIS ログが転送させるようにしてください。

Web.config ファイルの <system.webServer> セクション内に次のコードを配置します。

    <tracing>
      <traceFailedRequests>
        <add path="*">
          <traceAreas>
            <add provider="ASP" verbosity="Verbose" />
            <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
            <add provider="ISAPI Extension" verbosity="Verbose" />
            <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module" verbosity="Verbose" />
          </traceAreas>
          <failureDefinitions statusCodes="400-599" />
        </add>
      </traceFailedRequests>
    </tracing>

 

サイトにアクセスし404でも出して、しばらくまてばブロブ(wad-iis-failedreqlogfiles)に入ってきます。

20110818-007

 

 

7.アプリケーションのクラッシュ ダンプ

「5.IIS ログ」の設定を行いIIS ログが転送させるようにしてください。

クラッシュ ダンプの設定を行います。

            CrashDumps.EnableCollection(true);

 

WebRole.csで0除算でも行ってクラッシュダンプを出力させて、しばらく待てばブロブ(wad-crash-dumps)に入ってきます。

20110818-008

 

 

8.任意のログとファイル(カスタムログファイル)

ログを書き込むローカルストレージの設定を行います。

20110818-101

 

OnStartでログ用コンテナの使用容量(Quota)と名前を設定し、データソースに追加します。

            var dirConfig = new DirectoryConfiguration()
            {
                Container = "my-custom-logfiles",
                DirectoryQuotaInMB = 100,
            };
            var res = RoleEnvironment.GetLocalResource("LocalStorage1");
            dirConfig.Path = res.RootPath;
            diagnosticMonitorConfiguration.Directories.DataSources.Add(dirConfig);

 

上記で設定したディレクトリにファイルを書き込み、しばらく待てばブロブ(my-custom-logfiles)に入ってきます。

                var ls = RoleEnvironment.GetLocalResource("LocalStorage1");
                string path = Path.Combine(ls.RootPath, DateTime.Now.ToString("yyyyMMdd.txt"));
                using (var sw = new StreamWriter(path, true))
                {
                    sw.WriteLine("{0} : {1}", DateTime.UtcNow, "ほげほげ");
                }

20110818-102

20110818-103

 

長くなりましたが、こんな感じですね。

Comments are closed.

Post Navigation