開發雲端應用程式的思維可不能像平常開發應用程式一樣,我們每天在開發應用程式時,都能運用除錯器來偵錯,或是調台近端的主機上傳測試用,或是公司自己有自動化測試的機制,然而當應用程式上了雲端環境後,這些習慣幾乎通通不能用了,原因很簡單,雲端應用程式執行的地方可能是離你幾千公里外的公有雲機房,我們不可能在機房內掛除錯器偵錯,就算要上傳也要幾經思量(要錢),但是我們又希望能夠記錄或測量應用程式的執行細節,這時我們能夠用的,就是Windows Azure Platform本身的診斷服務(Diagnostics Service)。
診斷服務是由Diagnostics APIs(位於Microsoft.WindowsAzure.Diagnostics.dll)為核心,並整合虛擬機器內的診斷監視器行程(Diagnostics Monitor)組成,應用程式可以利用原本在.NET Framework基礎建設中的Trace機制輸出不同的記錄訊息給Diagnostics Monitor,透過它向Storage傳遞並儲存訊息,應用程式如果本身已經有利用Trace的話,只要修改Trace Listener給DiagnosticMonitorTraceListener即可,利用這個方式產生的記錄檔稱為Windows Azure Logs,而Diagnostics Service可用的記錄檔如表所示,但不同的記錄檔有不同格式,且預設也不是一定會啟動。
在說明將診斷訊息開啟的方法之前,您必須要知道每一個診斷訊息存取Storage時都需要可以連接到Storage的連線字串,依預設,每一個雲端應用程式角色的專案中都會內建使用Development Storage的連線字串,並且名稱預設為DiagnosticsConnectionString,每一個雲端專案的ConfigurationSettings內都有一個Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString設定,且字串值為UseDevelopmentStorage=true,表示使用Development Storage來儲存資料(如果是v1.2以前的版本,此設定名稱為DiagnosticsConnectionString)。另外,Diagnostics Service使用的Connection String的Key不可以和應用程式本身所用的Key相同,原因是Windows Azure Platform規定一個Key只能被一個應用程式使用,不過因為Storage Service本身會提供兩個Key,所以這個問題不難解決,只要修改使用不同的Key即可。
如果要使用Windows Azure Logs以外的診斷記錄,就必須要特別設定ScheduleTransferPeriod屬性,它定義了Diagnostics Monitor要多久將資料拋給Storage Service,部份不啟用的診斷記錄此屬性的預設值為0,等於說如果要啟用那些診斷記錄,就要把這個屬性值設為非零值。
DiagnosticMonitorConfiguration configuration = DiagnosticMonitor.GetDefaultInitialConfiguration();
// 將ScheduledTransferPeriod間隔設為每分鐘傳輸一次。
configuration.Logs.ScheduledTransferPeriod = new TimeSpan(0, 1, 0);
configuration.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = new TimeSpan(0, 1, 0);
DiagnosticMonitor.Start("DiagnosticsConnectionString", configuration);
我們也可以要求Diagnostics API將虛擬機器目前運作的效能計數記錄到Storage去,除了設定ScheduledTransferPeriod外,還要設定要捕捉哪個計數器。
configuration.PerformanceCounters.DataSources.Add(
new PerformanceCounterConfiguration()
{
CounterSpecifier = @"\Processor(_Total)\% Processor Time",
SampleRate = new TimeSpan(0, 1, 0)
});
configuration.PerformanceCounters.ScheduledTransferPeriod = new TimeSpan(0, 1, 0);
隨著Windows Azure工具的進步,微軟也對診斷功能做了一些改進,像是在Visual Studio 2010的IntelliTrace也可以用在Windows Azure應用程式內(在發行時勾選使用IntelliTrace即可),最新的Visual Studio Tools for Windows Azure則引入了新的Profiling功能,允許開發人員在應用程式中直接啟用Profiling來偵測雲端程式的效能變化。
診斷功能在雲端應用程式是十分重要的功能,在無法使用除錯器偵錯的情況下,愈充份的記錄愈能重現錯誤的狀況,並加速問題的判斷與排除,所以雲端應用程式應善用診斷的功能,以確保能在短時間內快速的發掘與解決問題。
Reference:
http://msdn.microsoft.com/en-us/library/hh369930.aspx
http://msdn.microsoft.com/en-us/library/windowsazure/gg433048.aspx
http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_WindowsAzureDebugging