2017-03-31 3 views
0

Nous avons finalement configuré EventSource et ElasticSearch correctement configurés dans notre cluster de matrice de service. Maintenant que nous avons ce que nous voulons ajouter EventSources à nos applications Web qui interagissent avec nos applications de tissu de service afin que nous puissions voir tous les événements (journaux d'application) dans un endroit et filtre/requête via Kibana.Comment ajouter EventSource à une application Web

Notre problème semble être lié aux différences entre une application Web de service qui est un exe et une application Web .NET 4.6 (pas .net CORE) qui est sans état. Dans le service Fabric, nous plaçons l'instruction using qui instancie le pipeline dans Program.cs et définit un sleep infini.

private static void Main() 
{ 
     try 
     { 
      using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("CacheApp-CacheAPI-DiagnosticsPipeline")) 
      { 
       ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Endpoint).Name); 
       // Prevents this host process from terminating so services keeps running. 
       Thread.Sleep(Timeout.Infinite); 
      } 

Comment faire cela dans une application Web? C'est le code de pipeline que nous utilisons pour une implémentation non ServiceFabric de l'EventSource. C'est ce que nous utilisons:

using (var pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json")) 
    { 
     IEnumerable ie = System.Diagnostics.Tracing.EventSource.GetSources(); 

     ServiceEventSource.Current.Message("initialize eventsource"); 

    } 

Nous sommes en mesure de voir le pipeline et envoyer des événements à ElasticSearch à partir de l'instruction à l'aide, mais pas à l'extérieur de celui-ci. Donc, la question est:

  1. comment/où plaçons-nous notre pipeline en utilisant une déclaration pour une application web? Avons-nous besoin d'instancier et de détruire le pipeline chaque fois que nous nous connectons ou existe-t-il un moyen de réutiliser ce pipeline sur les événements Web sans état? Il semblerait que ce serait très cher et nuit à la performance. Peut-être pouvons-nous mettre en cache un pipeline?

C'est le jist, laissez-moi savoir si vous avez besoin de clarification. Je vois beaucoup de doco là-bas pour les applications client mais pas beaucoup pour les applications web.

Merci, Greg

AVEC MISE A JOUR CODE DE SOLUTION

pipeline DiagnosticPipeline;

protected void Application_Start(Object sender, EventArgs e) 
{ 
    try 
    { 
     pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json"); 
     IEnumerable ie = System.Diagnostics.Tracing.EventSource.GetSources(); 
     AppEventSource.Current.Message("initialize eventsource"); 

    } 
} 

protected void Application_End(Object sender, EventArgs e) 
{ 
    pipeline.Dispose(); 
} 

Répondre

1

En supposant ASP.NET de base le plus simple moyen d'initialiser pipeline EventFlow serait dans la méthode Program.cs Main(), par exemple:

public static void Main(string[] args) 
{ 
    using (var pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json")) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .UseApplicationInsights() 
      .Build(); 

      host.Run(); 
    } 
} 

Cela tire parti du fait que host.Run () bloquera jusqu'à ce que le serveur soit arrêté, et ainsi le pipeline existera pendant le temps où les demandes sont reçues et servies.

Selon la structure Web que vous utilisez, les éléments peuvent varier. Par exemple. Si celui que vous utilisez offre des hooks "setup" et "cleanup", vous pouvez créer un pipeline de diagnostic pendant la phase d'installation (et y stocker une référence dans une variable membre), puis l'éliminer pendant la phase de nettoyage. Par exemple, dans ASP.NET classique, vous devez mettre le code en global.asax.cs et tirer parti des méthodes Application_OnStart et Application_OnEnd. Voir Application Instances, Application Events, and Application State in ASP.NET pour plus de détails.

La création d'une instance de pipeline chaque fois qu'une requête est traitée est assez inefficace, comme vous l'avez dit. Il n'y a vraiment pas de bonne raison de le faire.

+0

merci mais ce n'est pas. NET CORE, c'est une ancienne application de formulaires web hébergée dans IIS. Dans ces applications, il n'y a pas de "principal". Je pourrais utiliser global.asax peut-être? - – gperrego

+0

Oui, global.asax est ce que j'essaierais. J'ai ajouté quelques détails à la réponse originale. –

+0

Donc, nous n'utiliserions pas une instruction using alors?le type Application_Start agit comme notre instruction using et nous mettons la variable directement dans le Start on? var pipeline = DiagnosticPipelineFactory.CreatePipeline ("eventFlowConfig.json"); Disposez ensuite de la variable Application_End. Essayer maintenant – gperrego