2011-09-22 13 views
5

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?

+0

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? –

+1

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

+1

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

Odpowiedz

2

To pytanie

TraceSource.TraceEvent() fails logging when Exception message contains non-printable characters

zgłasza problem podczas logowania cicho nie jako konsekwencja wyjątek wyrzucane podczas logowania. W szczególności w tym przypadku komunikat dziennika nie może być serializowany.

Rozwiązaniem tej sytuacji jest użycie HttpUtility.HtmlEncode do kodowania tekstu wyjątku przed zalogowaniem na platformie Azure.

+0

Jest to bardzo interesująca i dobra wskazówka, ale nie dotyczy to nas. Dodałem losowe 'Trace.WriteLine (" Hello World ");' (przechodzenie przez pamięć, składnia może być błędna) linie i równie zawodzą. Ale tak jak powiedziałem, naprawdę doceniam, że zwracasz na to uwagę. Jestem pewien, że to był lub będzie problem, o którym nie wiedzieliśmy! – Jaxidian

+2

Szczerze mówiąc, uważam, że jest to błąd w doodadach logowania Azure - powinien on kodować HTML w naszym imieniu. (Paging @smarx ...) –

Powiązane problemy