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
?
Lleva tiempo para que los diagnósticos se arrepientan para copiar sus registros al almacenamiento. ¿Su función dura más de 15 minutos? –
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
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