Наконец-то мы правильно настроили EventSource и ElasticSearch в нашем кластере сервисной фабрики. Теперь, когда у нас есть это, мы хотим добавить EventSources в наши веб-приложения, которые взаимодействуют с нашими приложениями Service Fabric, чтобы мы могли просматривать все события (журналы приложений) в одном месте и фильтровать/запрашивать через Kibana.
Наша проблема, по-видимому, связана с различиями между приложением Service Fabric, которое является исполняемым файлом, и веб-приложением .NET 4.6 (не .net CORE), которое не имеет состояния. В Service Fabric мы размещаем оператор using, который создает экземпляр конвейера в Program.cs, и устанавливаем бесконечный спящий режим.
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);
}
Как это сделать в веб-приложении? Это конвейерный код, который мы используем для реализации EventSource без ServiceFabric. Вот что мы используем:
using (var pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json"))
{
IEnumerable ie = System.Diagnostics.Tracing.EventSource.GetSources();
ServiceEventSource.Current.Message("initialize eventsource");
}
Мы можем видеть конвейер и отправлять события в ElasticSearch из оператора using, но не за его пределами. Итак, вопрос:
- как/где мы размещаем наш конвейер, используя инструкцию для веб-приложения?
- Нужно ли нам создавать и уничтожать конвейер каждый раз, когда мы регистрируемся, или есть способ повторно использовать этот конвейер для веб-событий без сохранения состояния? Казалось бы, это будет очень дорого и повредит производительности. Может быть, мы можем кэшировать конвейер?
Это суть, дайте мне знать, если вам нужны разъяснения. Я вижу много документации для клиентских приложений, но не так много для веб-приложений.
Спасибо, Грег
ОБНОВЛЕНИЕ С КОДОМ РЕШЕНИЯ
конвейер 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();
}