以前の記事でも書きましたが、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 とは?
概要や使い方については、このあたりのサイトが参考になります。
- Azure SDK 2.6 for .NET および Visual Studio 2015 RC を発表
- Configuring Diagnostics for Azure Cloud Services and Virtual Machines
- Azure SDK for .NET 2.6 Release Notes
Build 2015 でも、Azure Diagnostics 関連のセッションが2つほどありました。
- 2-685 - What's New for Azure Developers in Visual Studio and Azure SDK
- 4-754 - Diagnosing Issues with Cloud Applications Hosted in Azure IaaS and PaaS Using Visual Studio
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 のプロパティから診断の有効化と構成が可能です。
似たような GUI で Azure SDK 2.5 も診断構成できましたが、診断ストレージ アカウントの接続文字列が復活したので、診断構成でストレージ アカウントを設定できなくなっています。
診断構成したプロジェクトからパッケージを作成し、Azure 管理ポータルからデプロイすると診断機能が無効になっています。Visual Studio か PowerShell のどちらかで診断機能を有効にする必要があるのは、Azure SDK 2.5 と変わりません。なお、Visual Studio から直接デプロイすると、診断機能が有効になった状態でデプロイできます。
Visual Studio のサーバーエクスプローラ
クラウドサービスのロールを右クリックして、診断を有効にできます。診断構成を変更することも可能です。
PowerShell の Set-AzureServiceDiagnosticsExtension コマンド
Set-AzureServiceDiagnosticsExtension コマンドの引数の DiagnosticsConfigurationPath で指定する診断構成ファイルは、Azure SDK 2.6 でパッケージを作ると、Extensions サブフォルダに PaaSDiagnostics.<ロール名>.PubConfig.xml という構成ファイルが作られるので、これをそのまま使えます。Azure SDK 2.5 のように、手動で作成する必要はなくなりました。
この診断構成ファイルを使って、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 のプロパティから診断構成画面で構成していた場合です。
Azure SDK 2.0 以降のバージョンで作成したプロジェクトがこのケースに該当するので、最も多いと思われます。プロジェクトのアップグレードが完了すると、ロールの WebRole1 に diagnostics.wadcfg が残っているので削除します。Azure SDK 2.5 以降では、diagnostics.wadcfgx を使いますので、右クリックして「診断構成の追加」を実行します。
あとは、前述した Azure SDK 2.6 で新しくプロジェクトを作成した場合の手順通りに、診断構成を再構成します。
diagnostics.wadcfg ファイルで構成していた場合
Visual Studio のプロジェクトで、WebRole の直下に diagnostics.wadcfg を配置して構成していた場合です。
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 を使っていた場合です。
Azure SDK 2.6 で新しくプロジェクトを作成した際の画面とは異なりますが、「接続文字列を追加」ボタンから診断ストレージ アカウントの設定ができます。設定すると、通常の画面に戻ります。
診断構成の画面も少し変わっています。ここに表示されているストレージ アカウントは使われないので、diagnostics.wadcfgx ファイルから削除しておきましょう。
まとめ
Azure SDK 2.6 の Diagnostics は、慌ててリリースされた感のある 2.5 でのいくつかのバグも修正されており、やっと実運用で使える品質になったという印象です。
診断ログの仕組みとして、2.4 以前のデプロイメント モデルから 2.5 以降のエクステンション モデルに変更されたことで、アプリケーションとログ収集が完全に切り離されました。デプロイ パッケージに診断機能に関する情報が含まれません。これ自体は良いことですが、 Azure 管理ポータルからデプロイすると診断機能が無効になっているので、実際の運用作業で VIP Swap する際には、PowerShell で診断機能を有効にする作業を忘れないように注意しましょう。今後、Azure 管理ポータルからも診断機能を有効にできると便利だと思います。