Nous avons des difficultés à faire en sorte que Windows Azure Diagnostics enregistre les données de manière fiable. Cela semble aléatoire et nous ne comprenons pas pourquoi.
Voici notre code qui fonctionne parfois, parfois non :
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();
}
}
Il convient de noter que notre AzureStorageObject.Initialize
remplace la méthode standard CloudStorageAccount.SetConfigurationSettingPublisher
méthode.
En utilisant ce code sans aucun changement de code ou de configuration, nous pouvons l'exécuter encore et encore dans l'émulateur ou le déployer encore et encore sur Azure avec des résultats tout aussi peu fiables. Remarquez que ce qui est SUPPOSÉ se produire est 1) configurer le WAD 2) dormir 10 secondes pour lui donner le temps de finir (je me suis vraiment accroché à la paille quand j'ai ajouté ceci) 3) enregistrer que l'init du WAD est fait 4) nous enregistrons que Run()
est appelé et nous allons ensuite faire tout notre travail ( WorkerAgent
a notre while(true)
en son sein). C'est parfois ce qui se passe. Parfois, nous n'obtenons pas le message enregistré en 3) mais nous l'obtenons en 4). Parfois, nous ne l'obtenons ni en 3 ni en 4.) Encore une fois, RIEN ne change dans le code ou la configuration et tout cela pointe vers le stockage Azure (pas le stockage de l'émulateur).
Pourquoi cela n'est-il pas enregistré de manière fiable à chaque fois que nous appelons Trace.Write
?