2011-09-22 12 views
5

Estamos teniendo problemas para conseguir que Windows Azure Diagnostics inicie sesión de forma fiable. Parece impredecible y no entendemos por qué.¿Por qué Windows Azure Diagnostics no registra de manera confiable?

Aquí está nuestro código que a veces funciona, a veces sin que:

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(); 
    } 
} 

Tenga en cuenta que nuestro método AzureStorageObject.Initialize reemplaza el método estándar CloudStorageAccount.SetConfigurationSettingPublisher.

Usando este código sin ningún cambio de código o cambio de configuración, podemos ejecutarlo una y otra vez en el emulador o implementarlo una y otra vez en Azure con resultados igualmente poco confiables. Fíjate que lo que se SUPONDE que ocurra es 1) configurar WAD 2) dormir 10 segundos para darle tiempo a terminar (estaba realmente agarrando pajas cuando agregué esto) 3) iniciar sesión que WAD init se hace 4) registramos que se llama Run() y luego hacemos todo nuestro trabajo (WorkerAgent tiene nuestro loop while(true)). A veces esto es lo que sucede. A veces, no recibimos el mensaje registrado en 3) pero lo recibimos en 4). A veces no lo conseguimos en 3 o 4). De nuevo, NADA cambia en el código o la configuración y todo esto apunta al almacenamiento de Azure (no al almacenamiento del emulador).

¿Por qué no está registrando de manera confiable cada vez que llamamos al Trace.Write?

+0

Lleva tiempo para que los diagnósticos se arrepientan para copiar sus registros al almacenamiento. ¿Su función dura más de 15 minutos? –

+1

Sí. Mire la configuración - Lo tengo configurado para copiarlos cada 1 minuto. Los elementos futuros se registran correctamente, son estos elementos iniciales que se registran al azar cuando inicio la instancia. Y como lo demuestra un 'Thread.Sleep (10000)', no estoy seguro de cuál es el factor determinante para cuando comienza a registrar con éxito. A veces es instantáneo y registra ese primer mensaje sin dormir, y a veces incluso con el sueño no registra ningún mensaje por "un momento" (no sé qué es "un momento" o por qué tarda "un tiempo" "). – Jaxidian

+1

desafortunadamente, me pregunto lo mismo, así que voté su pregunta. finalmente escribí mi propio registrador de almacenamiento de tabla ... y a veces falla debido a hipo de http de almacenamiento. – CedricB

Respuesta

2

Esta pregunta

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

reporta un problema al iniciar la sesión en silencio no como consecuencia de una excepción que es lanzado al iniciar la sesión. Específicamente en este caso, el mensaje de registro no se puede serializar.

La solución para esta situación es utilizar HttpUtility.HtmlEncode para codificar el texto de excepción antes de que se haya iniciado sesión en Azure.

+0

Este es un consejo muy interesante y bueno, pero este no es el caso para nosotros. He agregado líneas aleatorias 'Trace.WriteLine (" Hello World ");' (pasando por la memoria, la sintaxis puede ser incorrecta) y fallan por igual. Pero como dije, realmente aprecio que me hayas mencionado esto. ¡Estoy seguro de que este ha sido o será un problema que desconocíamos! – Jaxidian

+2

Francamente, creo que esto es un error en los archivos adjuntos de Azure: debería hacer la codificación HTML en nuestro nombre. (Paginación @smarx ...) –