5 votes

Pourquoi Windows Azure Diagnostics n'enregistre-t-il pas les données de manière fiable ?

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 ?

2voto

Jeremy McGee Points 13826

Cette question

TraceSource.TraceEvent() n'enregistre pas les événements lorsque le message d'exception contient des caractères non imprimables.

signale un problème lorsque l'enregistrement échoue silencieusement en raison d'une exception levée lors de l'enregistrement. Dans ce cas précis, le message ne peut pas être sérialisé.

Pour remédier à cette situation, il convient d'utiliser HttpUtility.HtmlEncode pour encoder le texte de l'exception avant qu'il ne soit enregistré dans Azure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X