前回の続きになりますが、 The Microsoft Conference + Expo Tokyo 1日目に行われたライトニングトークに登壇してきました。
Windows Azure の各ロールにてログを取得したい場合、一般的なケースだとロールの OnStart メソッドにてデータソースの指定や Windows Azure Storage への転送などを記述して有効にします。
ですが、この場合だと予め取得するログを決め打ちで指定して配置する必要がありますね。(もちろんコンフィグファイル等を駆使して動的にすることも可能ですが、、、、)
Windows Azure に限らず、一般的なアプリケーションの運用を考えると、
- 平常時
- 何か問題が発生した際に追跡できるように、アプリケーションのクラッシュダンプやリクエスト失敗ログ等は出力、他のログはクリティカルなものだけ
- 障害時など
- 平常時のログに加え、パフォーマンスの記録(計測)やログの出力レベルを詳細にする等
といったように、目的に応じて取得するものやレベルを変えたいことが多いと思います。
通常のASP.NET等のWebアプリケーションの場合はOS含めて操作できるので、このあたり柔軟に対応可能なのですが、いかんせんPaaSである Windows Azure では簡単にはいきません。どうしてもリモートで設定変更や確認、ログの取得を行う必要があります。
ライトニングトークでは、このリモートでの診断モニタの設定変更についてのTipsを紹介しています。
※簡単な話、Managing Windows Azure Diagnostics Remotely に記載されてる内容をそのまま紹介したような感じですね。
コードとしては単純で DiagnosticMonitorConfiguration のインスタンスをどう取得するか、だけがポイントとなります。
サンプルコードでは DeploymentDiagnosticManager インスタンスの GetRoleNames メソッドで返されるロール名を基にロールインスタンスを取得し、そこから DiagnosticMonitorConfiguration を取得しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.Diagnostics.Management;
namespace AzureRemoteDiagnosticsManagerConsole
{
class Program
{
static void Main(string[] args)
{
Console.Write("Deployment ID: ");
string deploymentID = Console.ReadLine();
Console.Write("Storage Account Name: ");
string accountName = Console.ReadLine();
Console.Write("Storage Key: ");
string accountKey = Console.ReadLine();
CloudStorageAccount csa = new CloudStorageAccount(new StorageCredentialsAccountAndKey(accountName, accountKey), true);
DeploymentDiagnosticManager ddm = new DeploymentDiagnosticManager(csa,deploymentID);
foreach (string rolename in ddm.GetRoleNames())
{
Console.WriteLine("Role Name: " + rolename);
var ridm = ddm.GetRoleInstanceDiagnosticManagersForRole(rolename);
foreach (var ridmN in ridm)
{
Console.WriteLine("Role Instance ID: " + ridmN.RoleInstanceId);
DiagnosticMonitorConfiguration dmc = ridmN.GetCurrentConfiguration();
//Create a performance counter for processor time
PerformanceCounterConfiguration pccCPU = new PerformanceCounterConfiguration();
pccCPU.CounterSpecifier = @"\Processor(_Total)\% Processor Time";
pccCPU.SampleRate = TimeSpan.FromSeconds(5);
//Create a performance counter for available memory
PerformanceCounterConfiguration pccMemory = new PerformanceCounterConfiguration();
pccMemory.CounterSpecifier = @"\Memory\Available Mbytes";
pccMemory.SampleRate = TimeSpan.FromSeconds(5);
//Add the new performance counters to the configuration
dmc.PerformanceCounters.DataSources.Add(pccCPU);
dmc.PerformanceCounters.DataSources.Add(pccMemory);
dmc.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
//Update the configuration
ridmN.SetCurrentConfiguration(dmc);
}
}
Console.Write("Hit any key.");
Console.ReadKey();
}
}
}
で、配置したアプリケーションにどんなロールがあって、それぞれどんなロール名で稼働してるロールのIDはなんなんだ、というのが Windows Azure Storage Blob の wad-control-container コンテナ以下に存在しています。なので、一番最初に DeploymentDiagnosticManager を生成する際にデプロイメントIDと、 (wad-control-container コンテナが存在している)CloudStorageAccount が必要になっています。
基本的に診断モニタの設定は全部リモートでできるのですが、リモートでの操作を有効にするために( wad-control-container コンテナを作成する為に)、最低限ロールのOnStartで診断モニタを有効にすると良いと思います。
※もちろん本番用のアプリケーションはもっとちゃんと練ってくださいね。
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
//診断モニタの有効化
DiagnosticMonitor.Start("DiagnosticsConnectionString", config);
ちなみにサンプルではパフォーマンスカウンタを指定してパフォーマンスログを記録するようにしていますが、指定できるパフォーマンスカウンタは以前の投稿でざっくり抜き出してみてますのでそちらも参照ください。
※取得したパフォーマンスログの日時は EventTickCount に入っているので DateTime.FromBinary メソッドで変換して見やすくしましょう。
Windows Azure の各ロールインスタンスにリモートデスクトップ接続ができるようになれば、ログの確認等トラブルシュートは格段にしやすくなると思います。
また監視や管理に特化した製品や、System Center Operations Manager などの製品もありますので、利用目的などに併せて利用すると良いと思います。
あとログは結構サイズ食うと思いますのでむやみやたらに詳細にせず、用法・用量を守って正しくお使いください。
ピンバック: Tweets that mention Windows Azure 上の診断モニタをリモートで設定変更する « ブチザッキ -- Topsy.com
ピンバック: .NET Clips
すばらしいっす!勉強になります!