Search code examples
asp.net-mvcmemory-leaksout-of-memoryazure-application-insightstelemetry

OutOfMemoryException after adding Microsoft ApplicationInsights Telemetry


We have recently added telemetry to our website (we have been running one that is being added automagically by the Microsoft Azure portal), but now I have implemented page views and the whole mechanism with configuration file nugets and such.

Then after release, it ran for a couple of days and then blew up around midnight, (I know I should have lit a candle and got a Russian pope to bless the servers as evil forces obviously have been involved).

Exception:

Castle.MicroKernel.ComponentActivator.ComponentActivatorException:
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.Handlers.DefaultHandler.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.Handlers.AbstractHandler.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.DefaultKernel.ResolveComponent (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.DefaultKernel.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at xxx.yyy.Globals.WindsorControllerFactory.GetControllerInstance (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\1\s\source\yyy\Globals\WindsorControllerFactory.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 29)
   at System.Web.Mvc.DefaultControllerFactory.CreateController (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Web.Mvc.MvcHandler.ProcessRequestInit (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication+<>c__DisplayClass285_0.<ExecuteStepImpl>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep (Microsoft.AspNet.TelemetryCorrelation, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule.OnExecuteRequestStep (Microsoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\13\s\WEB\Src\Web\Web.Shared.Net\ApplicationInsightsHttpModule.csMicrosoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 164)
   at System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication.ExecuteStepImpl (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication.ExecuteStep (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
Inner exception System.Reflection.TargetInvocationException handled at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore:
   at System.RuntimeMethodHandle.InvokeMethod (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Reflection.RuntimeConstructorInfo.Invoke (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.FastCreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
Inner exception System.Threading.Tasks.TaskSchedulerException handled at System.RuntimeMethodHandle.InvokeMethod:
   at System.Threading.Tasks.Task.ScheduleAndStart (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Tasks.Task.InternalStartNew (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Tasks.TaskFactory.StartNew (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.ApplicationInsights.Channel.InMemoryTransmitter..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\13\s\BASE\src\Microsoft.ApplicationInsights\Channel\InMemoryTransmitter.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 45)
   at Microsoft.ApplicationInsights.Channel.InMemoryChannel..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\13\s\BASE\src\Microsoft.ApplicationInsights\Channel\InMemoryChannel.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 33)
   at Microsoft.ApplicationInsights.Extensibility.TelemetrySink..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\13\s\BASE\src\Microsoft.ApplicationInsights\Extensibility\TelemetrySink.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 45)
   at Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\13\s\BASE\src\Microsoft.ApplicationInsights\Extensibility\TelemetryConfiguration.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 95)
   at xxx.yyy.Controllers.BaseController..ctor (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\1\s\source\yyy\Controllers\BaseController.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 15)
   at xxx.yyy.Controllers.ExportController..ctor (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\1\s\source\yyy\Controllers\ExportController.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 24)
Inner exception System.OutOfMemoryException handled at System.Threading.Tasks.Task.ScheduleAndStart:
   at System.Threading.Thread.StartInternal (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Thread.Start (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Thread.Start (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Tasks.ThreadPoolTaskScheduler.QueueTask (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Tasks.Task.ScheduleAndStart (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)

Code:

 public class BaseController : Controller, IyyyController
 {
    private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));

 ...

 protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
        var user = ViewBag.CurrentUser = db.GetCurrentUser();
        SendApplicationInsightsTelemetry(filterContext, user);
    }

 private void SendApplicationInsightsTelemetry(ActionExecutingContext filterContext, User user)
    {
        try
        {
            PageViewTelemetry telemetrypageView = new PageViewTelemetry()
            {
                Name = filterContext?.HttpContext?.Request?.RawUrl,
                Url = filterContext?.HttpContext?.Request?.Url
            };

            if (filterContext.HttpContext.Session["Id"] == null)
                filterContext.HttpContext.Session["Id"] = Guid.NewGuid().ToString();

            telemetrypageView.Context.Session.Id = filterContext.HttpContext.Session["Id"].ToString();

            if (user != null)
            {
                telemetrypageView.Context.User.Id = user.zzz.ToString();
                telemetrypageView.Context.User.AccountId = user.ooo;
            }

            telemetry.TrackPageView(telemetrypageView);
        }
        catch (Exception e)
        {
            Trace.TraceError($"{nameof(SendApplicationInsightsTelemetry)}, {e.Message}");
        }
    }

The questionable bit is:

private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));

Could above bit of code have caused the memory leak or is it something more insidious?


Solution

  • The answer is maybe. TelemetryClient is not IDisposable but TelemetryConfiguration is, so:

    After replacing

    private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
    

    with

        private readonly TelemetryClient telemetry;
        private readonly Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration telemetryConfiguration;
    
        protected BaseController(ProjectPlanContext dbContext)
        {
            telemetryConfiguration = new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]);
            telemetry = new TelemetryClient(telemetryConfiguration);
        }
    
        protected override void Dispose(bool disposing)
        {
            telemetryConfiguration.Dispose();
            base.Dispose(disposing);
        }
    

    it never came back