From 0097ddd3e008a1b22a91535ea64a0658022e98d7 Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Sat, 13 Jul 2019 13:48:18 -0500 Subject: [PATCH] add IDisposable wrapper for TelemetryClient to let DI handle flush and pause https://github.com/Microsoft/ApplicationInsights-dotnet/issues/596#issuecomment-320371794 --- .../AgentTelemetryClient.cs | 31 +++++++++++++++++++ .../ServiceCollectionExtensions.cs | 8 +++-- .../ServiceCollectionExtensions.cs | 4 +-- src/FilterLists.Agent/Program.cs | 28 +---------------- 4 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 src/FilterLists.Agent/Infrastructure/ApplicationInsights/AgentTelemetryClient.cs diff --git a/src/FilterLists.Agent/Infrastructure/ApplicationInsights/AgentTelemetryClient.cs b/src/FilterLists.Agent/Infrastructure/ApplicationInsights/AgentTelemetryClient.cs new file mode 100644 index 000000000..2fc199ac7 --- /dev/null +++ b/src/FilterLists.Agent/Infrastructure/ApplicationInsights/AgentTelemetryClient.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading; +using Microsoft.ApplicationInsights; +using Microsoft.ApplicationInsights.Extensibility; + +namespace FilterLists.Agent.Infrastructure.ApplicationInsights +{ + public class AgentTelemetryClient : IDisposable + { + public AgentTelemetryClient(TelemetryConfiguration telemetryConfiguration) + { + TelemetryClient = new TelemetryClient(telemetryConfiguration); + } + + public TelemetryClient TelemetryClient { get; } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!disposing) + return; + TelemetryClient.Flush(); + Thread.Sleep(5000); + } + } +} \ No newline at end of file diff --git a/src/FilterLists.Agent/Infrastructure/ApplicationInsights/ServiceCollectionExtensions.cs b/src/FilterLists.Agent/Infrastructure/ApplicationInsights/ServiceCollectionExtensions.cs index 1a57050a2..ca4ee2cf1 100644 --- a/src/FilterLists.Agent/Infrastructure/ApplicationInsights/ServiceCollectionExtensions.cs +++ b/src/FilterLists.Agent/Infrastructure/ApplicationInsights/ServiceCollectionExtensions.cs @@ -1,5 +1,4 @@ using FilterLists.Agent.AppSettings; -using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -21,7 +20,12 @@ public static void AddApplicationInsights(this IServiceCollection services) services.AddSingleton(b => { var configuration = b.GetService(); - return new TelemetryClient(configuration); + return new AgentTelemetryClient(configuration); + }); + services.AddSingleton(b => + { + var telemetryConfiguration = b.GetService(); + return QuickPulseTelemetryModuleBuilder.Build(telemetryConfiguration); }); } } diff --git a/src/FilterLists.Agent/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs b/src/FilterLists.Agent/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs index fb07bd12d..55d25fea1 100644 --- a/src/FilterLists.Agent/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/FilterLists.Agent/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs @@ -8,7 +8,6 @@ using FilterLists.Agent.Infrastructure.Polly; using FilterLists.Agent.Infrastructure.Web; using MediatR; -using Microsoft.ApplicationInsights; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Serilog; @@ -59,7 +58,8 @@ private static void AddLogging(this IServiceCollection services) { services.AddLogging(b => { - var telemetryClient = b.Services.BuildServiceProvider().GetService(); + var telemetryClient = b.Services.BuildServiceProvider().GetService() + .TelemetryClient; b.AddSerilog(new LoggerConfiguration() .WriteTo.Console() .WriteTo.ApplicationInsights(telemetryClient, TelemetryConverter.Traces) diff --git a/src/FilterLists.Agent/Program.cs b/src/FilterLists.Agent/Program.cs index 68576e518..0644fdde5 100644 --- a/src/FilterLists.Agent/Program.cs +++ b/src/FilterLists.Agent/Program.cs @@ -1,15 +1,10 @@ using System; -using System.Threading; using System.Threading.Tasks; using CommandLine; using FilterLists.Agent.Features.Lists; using FilterLists.Agent.Features.Urls; -using FilterLists.Agent.Infrastructure.ApplicationInsights; using FilterLists.Agent.Infrastructure.DependencyInjection; using MediatR; -using Microsoft.ApplicationInsights; -using Microsoft.ApplicationInsights.Extensibility; -using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse; using Microsoft.Extensions.DependencyInjection; namespace FilterLists.Agent @@ -17,12 +12,10 @@ namespace FilterLists.Agent public static class Program { private static IServiceProvider _serviceProvider; - private static QuickPulseTelemetryModule _quickPulseTelemetryModule; public static async Task Main(string[] args) { - Setup(); - + _serviceProvider = ServiceProviderBuilder.Build(); var parser = _serviceProvider.GetService(); var mediator = _serviceProvider.GetService(); await parser.ParseArguments(args).MapResult(async o => @@ -34,25 +27,6 @@ await parser.ParseArguments(args).MapResult(async o => }, e => Task.FromResult(0) ); - - Teardown(); - } - - private static void Setup() - { - _serviceProvider = ServiceProviderBuilder.Build(); - - var telemetryConfiguration = _serviceProvider.GetService(); - _quickPulseTelemetryModule = QuickPulseTelemetryModuleBuilder.Build(telemetryConfiguration); - } - - private static void Teardown() - { - _quickPulseTelemetryModule.Dispose(); - - var telemetryClient = _serviceProvider.GetService(); - telemetryClient.Flush(); - Thread.Sleep(5000); } } } \ No newline at end of file