Mamy problemy z niezawodnie logowaniem się Windows Azure Diagnostics. Wygląda na to, że jest to hit-miss-miss i nie rozumiemy dlaczego.Dlaczego system Windows Azure Diagnostics nie jest niezawodny?
Oto nasz kod, który czasami działa, czasami nie:
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
Trace.WriteLine("Run() beginning.", LogLevel.Information.ToString());
try
{
var logic = new WorkerAgent();
logic.Go(false);
}
catch (Exception err)
{
Trace.WriteLine(err.ToString(), LogLevel.Critical.ToString());
Run();
}
}
public override bool OnStart()
{
// Initialize our Cloud Storage Configuration.
AzureStorageObject.Initialize(AzureConfigurationLocation.AzureProjectConfiguration);
// Initialize Azure Diagnostics
try
{
//get the storage account using the default Diag connection string
var cs = CloudStorageAccount.FromConfigurationSetting("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
//get the diag manager
var dm = cs.CreateRoleInstanceDiagnosticManager(RoleEnvironment.DeploymentId,
RoleEnvironment.CurrentRoleInstance.Role.Name,
RoleEnvironment.CurrentRoleInstance.Id);
//get the current configuration but if that failed, get the values from config file
var dc = dm.GetCurrentConfiguration() ?? DiagnosticMonitor.GetDefaultInitialConfiguration();
//Windows Azure Logs
dc.Logs.BufferQuotaInMB = 25;
dc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
dc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
//Windows Event Logs
dc.WindowsEventLog.BufferQuotaInMB = 25;
dc.WindowsEventLog.DataSources.Add("System!*");
dc.WindowsEventLog.DataSources.Add("Application!*");
dc.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
////Performance Counters
//dc.PerformanceCounters.BufferQuotaInMB = 25;
//var perfConfig = new PerformanceCounterConfiguration
// {
// CounterSpecifier = @"\Processor(_Total)\% Processor Time",
// SampleRate = TimeSpan.FromSeconds(60)
// };
//dc.PerformanceCounters.DataSources.Add(perfConfig);
//dc.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
//Failed Request Logs
dc.Directories.BufferQuotaInMB = 25;
dc.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
////Infrastructure Logs
//dc.DiagnosticInfrastructureLogs.BufferQuotaInMB = 25;
//dc.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
//dc.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
//Crash Dumps
CrashDumps.EnableCollection(true);
//overall quota; must be larger than the sum of all items
dc.OverallQuotaInMB = 5000;
//save the configuration
dm.SetCurrentConfiguration(dc);
}
catch (Exception ex)
{
Trace.Write(ex.Message, LogLevel.Critical.ToString());
}
// give logging time to register itself and load up.
Thread.Sleep(10000);
Trace.WriteLine("Completed diagnostics initialization.", LogLevel.Information.ToString());
return base.OnStart();
}
}
pamiętać, że nasz AzureStorageObject.Initialize
metoda zastępuje standardową metodę CloudStorageAccount.SetConfigurationSettingPublisher
.
Stosując ten kod bez absolutnie żadnych zmian w kodzie ani zmian konfiguracji, możemy go wielokrotnie uruchamiać w emulatorze lub wdrażać w systemie Azure z równie niewiarygodnymi wynikami. Zauważ, że wszystko, co się wydarzyło, to 1) WAD 2 konfiguracji) spać 10 sekund, aby dać mu czas na zakończenie (naprawdę chciałem słychać kiedy to dodałem) 3) zaloguj się, że WAD init jest zrobiony 4) logujemy, że Run()
nazywa się a następnie robimy całą naszą pracę (WorkerAgent
ma naszą pętlę while(true)
). Czasami tak się dzieje. Czasem nie otrzymujemy loginu 3), ale otrzymujemy go w 4). Czasami nie dostaniemy go w 3 lub 4). Ponownie, NIC zmiany w kodzie lub konfiguracji i wszystko to wskazuje na magazyn Azure (nie magazynowanie emulatora).
Dlaczego nie jest to niezawodnie rejestrowane za każdym razem, gdy dzwonimy pod numer Trace.Write
?
Potrzeba czasu, aby materiały diagnostyczne mogły się obejść, aby skopiować dzienniki do magazynu. Czy twoja rola trwa dłużej niż 15 minut? –
Tak. Spójrz na konfigurację - mam to ustawione, aby kopiować je co 1 minutę. Przyszłe elementy są pomyślnie rejestrowane, to te początkowe elementy są losowo niezalogowane podczas uruchamiania instancji. I jak wynika z "Thread.Sleep (10000)", nie jestem pewien, co jest czynnikiem decydującym, gdy zaczyna się pomyślnie zalogować. Czasami jest to natychmiastowe i rejestruje pierwszą wiadomość bez snu, a czasem nawet ze snu nie loguje żadnych wiadomości przez "jakiś czas" (nie wiem, co to jest "za chwilę", ani dlaczego trwa to "chwilę" "). – Jaxidian
niestety, zastanawiam się nad tym samym, więc zagłosowałem na twoje pytanie. w końcu napisałem swój własny rejestrator pamięci tabeli ... i czasami nie działa z powodu problemów z przechowywaniem http. – CedricB