ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure SDK 2.5 の Azure Diagnostics に移行する

(追記)Azure SDK 2.6 の Azure Diagnostics に移行することをお薦めします。

gooner.hateblo.jp

昨年の 12月10日に Azure アカウント宛にメールが来ていて、Cloud Services(Web Role, Worker Role)で Azure Diagnostics を利用している場合、2015年12月9日までに Azure SDK 2.5 から利用できる Diagnostics 2.0 にアップグレードする必要があると告知されていました。以前の記事で書いた Azure Storage REST API の旧バージョン削除の件も、削除予定日が 2015年8月1日 から 2015年12月9日 に延長されています。Storage Client のサポート終了日は、Ver.1.7 ~ 1.5.1 は 2015年12月9日 から 無期限 に延期され、それ以前のバージョンは 2015年12月9日 から 2016年8月1日 に延期されました。Azure Diagnostics は、Web Role や Worker Role のサーバーインスタンスから Azure Storage にログを転送する機能なので、古い REST API の削除が影響するのだと思われます。

  •  Web Role や Worker Role を使っているアプリの多くが Azure Diagnostics を利用している
  • Azure SDK 2.5 は、2014年11月 にリリースされたばかり
  • Azure SDK 1.6 ~ 2.1 は 、2015年11月12日 にサポート終了する

といったことを考えると、現在 Cloud Services 上で動いているほぼ全てのアプリは、パッケージの更新と再デプロイが必要となります。Azure SDK 2.5 では Visual Studio 2010 を使った開発ができないため、Visual Studio 2012 or 2013 への更新が必要なケースもあります。この記事では、Azure Diagnostics を Azure SDK 2.5 に移行する方法を紹介していきます。

Azure SDK 2.5 の Azure Diagnostics とは?

概要や使い方については、このあたりのサイトが参考になります。

Azure SDK 2.4 と 2.5 の Azure Diagnostics には、次のような機能の違いがあります。

  • Event Tracing for Windows(ETW)に対応
  • Azure Virtual Machines でも、診断ログを転送できる
  • 診断構成ファイル(diagnostics.wadcfg → diagnostics.wadcfgx)が変更された
  • 接続文字列の Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString は使わない
  • デプロイした直後は診断機能が無効化されているので、PowerShell で有効にしないと Storage に転送されない
  • 開発環境のエミュレータでは、診断ログが Storage に転送されなくなった
  • コードで診断の構成を定義できなくなった
  • ロール単位でのみ構成でき、インスタンス単位では構成できなくなった
  • クラッシュダンプも、診断構成ファイルで構成できるようになった

Cloud Services で Azure Diagnostics を利用する方法

以下の手順で、Cloud Services で Azure SDK 2.5 の Azure Diagnostics を利用することができます。

Visual Studio のプロジェクトで、ロールの WebRole1 のプロパティから診断の有効化と構成が可能です。

wad04

似たような GUI で Azure SDK 2.4 以前も診断構成できましたが、ETW ログやクラッシュ ダンプのタブが追加されています。ここで、Azure Storage に収集したいログの転送レベルや転送期間を構成します。

診断構成したプロジェクトからパッケージを作成し、Azure 管理ポータルからデプロイすると診断機能が無効になっていますので、Visual Studio か PowerShell のどちらかで診断機能を有効にする必要があります。将来的にはポータルからも有効にできそうな気がします。ちなみに、Visual Studio から直接デプロイすると、診断機能が有効になった状態でデプロイできます。

Visual Studio のサーバーエクスプローラ

クラウドサービスのロールを右クリックして、診断を有効にできます。診断構成を変更することも可能です。

wad05

PowerShell の Set-AzureServiceDiagnosticsExtension コマンド

まず、Set-AzureServiceDiagnosticsExtension コマンドの引数の DiagnosticsConfigurationPath で指定する診断構成ファイルを作成します。

  1. Visual Studio のプロジェクトで管理されている diagnostics.wadcfgx を別の場所にコピーする
  2. DiagnosticsConfiguration, PrivateConfig, IsEnabled の3つのタグを削除し、PublicConfig タグの中身だけを残す
  3. StorageAccount タグに診断ログの収集先となる Azure Storage アカウント名を設定する

作成した診断構成ファイルは、次のようなレイアウトになります。スキーマの詳細は、こちらで確認できます。

#diagnostics.wadcfgx
<?xml version="1.0" encoding="utf-8"?>
<PublicConfig xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
  <WadCfg>
    <DiagnosticMonitorConfiguration overallQuotaInMB="4096">
      <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter="Error"/>
      <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Error" />
      <Directories scheduledTransferPeriod="PT1M">
        <IISLogs containerName ="wad-iis-logfiles" />
        <FailedRequestLogs containerName ="wad-failedrequestlogs" />
      </Directories>
      <WindowsEventLog scheduledTransferPeriod="PT1M" >
        <DataSource name="Application!*" />
      </WindowsEventLog>
      <CrashDumps containerName="wad-crashdumps" dumpType="Mini">
        <CrashDumpConfiguration processName="WaIISHost.exe"/>
        <CrashDumpConfiguration processName="WaWorkerHost.exe"/>
        <CrashDumpConfiguration processName="w3wp.exe"/>
      </CrashDumps>
      <PerformanceCounters scheduledTransferPeriod="PT1M">
        <PerformanceCounterConfiguration counterSpecifier="\Memory\Available MBytes" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\ISAPI Extension Requests/sec" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\Bytes Total/Sec" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Requests/Sec" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Errors Total/Sec" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Queued" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Rejected" sampleRate="PT3M" />
        <PerformanceCounterConfiguration counterSpecifier="\Processor(_Total)\% Processor Time" sampleRate="PT3M" />
      </PerformanceCounters>
    </DiagnosticMonitorConfiguration>
  </WadCfg>
  <StorageAccount>mystoragename</StorageAccount>
</PublicConfig>

あとは、デプロイ環境に対して Set-AzureServiceDiagnosticsExtension コマンドを実行するだけです。Azure Storage や Service の名前は、環境に合わせて置き換えてください。

#Set-AzureServiceDiagnosticsExtension
$storageContext = New-AzureStorageContext –StorageAccountName <storagename> –StorageAccountKey <key>
Set-AzureServiceDiagnosticsExtension -ServiceName <servicename> -Slot Production -Role WebRole1 -StorageContext $storageContext -DiagnosticsConfigurationPath C:\Users\xxx\Desktop\diagnostics.wadcfgx

診断機能が有効になると、各種のログが Azure Storage に転送されるようになります。

Azure SDK 2.4 以前から移行する方法

Azure Diagnostics には、診断構成にいくつかの方法があります。大きく3つのパターンに分類します。どのパターンでも、Visual Studio で Azure SDK をアップグレードするまでは同じです。アップグレード後の手順が異なるので、順番に説明していきます。

なお、接続文字列の Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString は削除されていますので、もしこの接続文字列を使っているコードがあれば、そちらも修正が必要です。

Visual Studio 上の GUI で構成していた場合

Visual Studio のプロジェクトで、ロールの WebRole1 のプロパティから診断構成画面で構成していた場合です。

wad01

Azure SDK 2.0 以降のバージョンで作成したプロジェクトがこのケースに該当するので、最も多いと思われます。プロジェクトのアップグレードが完了すると、ロールの WebRole1 に diagnostics.wadcfg が残っているので削除します。Azure SDK 2.5 からは、diagnostics.wadcfgx を使いますので、右クリックして「診断構成の追加」を実行します。

wad02

あとは、前述した Azure SDK 2.5 で新しくプロジェクトを作成した場合の手順通りに、診断構成を再構成します。

diagnostics.wadcfg ファイルで構成していた場合

Visual Studio のプロジェクトで、WebRole の直下に diagnostics.wadcfg を配置して構成していた場合です。

wad03

Azure SDK 1.x のバージョンで作成したプロジェクトは、このケースに該当します。プロジェクトのアップグレードが完了すると、WebRole の直下に diagnostics.wadcfg が残っているので削除します。ロールの WebRole1 に diagnostics.wadcfgx がありませんので、右クリックして「診断構成の追加」を実行します。あとは、前述した Azure SDK 2.5 で新しくプロジェクトを作成した場合の手順通りに、診断構成を再構成します。

コードで構成していた場合

WebRole クラスの OnStart() メソッドで、Microsoft.WindowsAzure.Diagnostics 名前空間の API を使って構成していた場合です。

#WebRole.cs
public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        // 診断ログを構成
        DiagnosticMonitorConfiguration config = DiagnosticMonitor.GetDefaultInitialConfiguration();
        config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
        config.Logs.ScheduledTransferLogLevelFilter = Microsoft.WindowsAzure.Diagnostics.LogLevel.Error;
        config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
        DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);
 
        return base.OnStart();
    }
}

Azure SDK 1.x のバージョンで作成したプロジェクトは、diagnostics.wadcfg ファイルとコードのどちらでも構成できましたが、コードで構成していたケースは少ないはずです。diagnostics.wadcfg ファイルの方がロールインスタンス開始前のログも取得できますし、構成が簡単だからです。プロジェクトのアップグレードが完了すると、DiagnosticMonitor クラスなどに Obsolete の警告が表示されますので、コードを削除します。ロールの WebRole1 に diagnostics.wadcfgx がありませんので、右クリックして「診断構成の追加」を実行します。あとは、前述した Azure SDK 2.5 で新しくプロジェクトを作成した場合の手順通りに、診断構成を再構成します。

まとめ

Azure SDK 2.5 の Azure Diagnostics では、Event Tracing for Windows(ETW)や Azure Virtual Machines への対応が大きな機能強化ですが、アプリの開発と運用のログを分けて管理できるようになったことも大きなポイントです。今回は、Cloud Services の Diagnostics を旧バージョンから移行する方法を中心に書きましたので、ETWなどの新機能については別の記事にまとめたいと思います。