ROMANCE DAWN for the new world

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

Azure SDK 2.6 の Azure Diagnostics に移行する

gooner.hateblo.jp

以前の記事でも書きましたが、Cloud Services で Azure Diagnostics を利用している場合、2015年12月9日までに Azure SDK 2.5 以降で利用できる Diagnostics 2.0 にアップグレードする必要があります。重複する部分もありますが、この記事では、Azure SDK 2.6 の Azure Diagnostics  に移行する方法を紹介していきます。

Azure SDK 2.6 の Azure Diagnostics とは?

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

Build 2015 でも、Azure Diagnostics 関連のセッションが2つほどありました。

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

  • ローカルのエミュレーターでも診断ログを収集できる
  • 診断ストレージ アカウントの接続文字列(Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString)の復活
  • パッケージを作ると、Extensions サブフォルダに PaaSDiagnostics.<ロール名>.PubConfig.xml という構成ファイルが作られる

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

以下の手順で、Azure SDK 2.6 の Azure Diagnostics を Cloud Services で利用することができます。Visual Studio のプロジェクトで、ロールの WebRole1 のプロパティから診断の有効化と構成が可能です。

wad12

wad19

似たような GUI で Azure SDK 2.5 も診断構成できましたが、診断ストレージ アカウントの接続文字列が復活したので、診断構成でストレージ アカウントを設定できなくなっています。

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

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

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

wad14

PowerShell の Set-AzureServiceDiagnosticsExtension コマンド

Set-AzureServiceDiagnosticsExtension コマンドの引数の DiagnosticsConfigurationPath で指定する診断構成ファイルは、Azure SDK 2.6 でパッケージを作ると、Extensions サブフォルダに PaaSDiagnostics.<ロール名>.PubConfig.xml という構成ファイルが作られるので、これをそのまま使えます。Azure SDK 2.5 のように、手動で作成する必要はなくなりました。

wad15

この診断構成ファイルを使って、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\PaaSDiagnostics.WebRole1.PubConfig.xml

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

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

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

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

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

wad01

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

wad02

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

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

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

wad03

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

(追記)ServiceConfiguration.Local.cscfg がないと、「エラー1 unable to get setting value パラメーター名:profileName」というエラーが発生して、診断ログを有効できないバグがあります。Azure SDK 1.4 より古いバージョンで作成したプロジェクトが該当します。その際には、Visual Studio の機能を利用して、ServiceConfiguration.cscfg のコピーを作成してください。ServiceConfiguration.Local.cscfg と ServiceConfiguration.Cloud.cscfg の2つを作成したら、元の ServiceConfiguration.cscfg を削除しましょう。

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

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 ファイルとコードのどちらでも構成できましたが、コードで構成していたケースは少ないはずです。プロジェクトのアップグレードが完了すると、DiagnosticMonitor クラスなどに Obsolete の警告が表示されますので、コードを削除します。ロールの WebRole1 に diagnostics.wadcfgx がありませんので、右クリックして「診断構成の追加」を実行します。あとは、前述した Azure SDK 2.6 で新しくプロジェクトを作成した場合の手順通りに、診断構成を再構成します。

Azure SDK 2.5 に移行していた場合

Azure SDK 2.4 以前からの移行が完了しており、Azure SDK 2.5 を使っていた場合です。

wad10

Azure SDK 2.6 で新しくプロジェクトを作成した際の画面とは異なりますが、「接続文字列を追加」ボタンから診断ストレージ アカウントの設定ができます。設定すると、通常の画面に戻ります。

wad11

診断構成の画面も少し変わっています。ここに表示されているストレージ アカウントは使われないので、diagnostics.wadcfgx ファイルから削除しておきましょう。

wad17

 まとめ

Azure SDK 2.6 の Diagnostics  は、慌ててリリースされた感のある 2.5 でのいくつかのバグも修正されており、やっと実運用で使える品質になったという印象です。

診断ログの仕組みとして、2.4 以前のデプロイメント モデルから 2.5 以降のエクステンション モデルに変更されたことで、アプリケーションとログ収集が完全に切り離されました。デプロイ パッケージに診断機能に関する情報が含まれません。これ自体は良いことですが、 Azure 管理ポータルからデプロイすると診断機能が無効になっているので、実際の運用作業で VIP Swap する際には、PowerShell で診断機能を有効にする作業を忘れないように注意しましょう。今後、Azure 管理ポータルからも診断機能を有効にできると便利だと思います。