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:
- 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();
}
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
Oui, global.asax est ce que j'essaierais. J'ai ajouté quelques détails à la réponse originale. –
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