Исключение OutOfMemoryException после добавления телеметрии Microsoft ApplicationInsights

#asp.net-mvc #memory-leaks #out-of-memory #azure-application-insights #telemetry

Вопрос:

Недавно мы добавили телеметрию на наш веб-сайт (мы запускали тот, который автоматически добавляется порталом Microsoft Azure), но теперь я реализовал просмотры страниц и весь механизм с помощью nugets файлов конфигурации и тому подобного.

Затем, после релиза, он работал пару дней, а затем взорвался около полуночи (я знаю, что должен был зажечь свечу и попросить русского папу благословить серверы, так как в этом явно были замешаны злые силы).

Исключение:

 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:a1ssourceyyyGlobalsWindsorControllerFactory.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_work13sWEBSrcWebWeb.Shared.NetApplicationInsightsHttpModule.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_work13sBASEsrcMicrosoft.ApplicationInsightsChannelInMemoryTransmitter.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_work13sBASEsrcMicrosoft.ApplicationInsightsChannelInMemoryChannel.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_work13sBASEsrcMicrosoft.ApplicationInsightsExtensibilityTelemetrySink.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_work13sBASEsrcMicrosoft.ApplicationInsightsExtensibilityTelemetryConfiguration.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:a1ssourceyyyControllersBaseController.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:a1ssourceyyyControllersExportController.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)
 

Код:

  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}");
        }
    }
 

Сомнительный момент заключается в том, что:

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

Мог ли приведенный выше фрагмент кода вызвать утечку памяти или это что-то более коварное?

Ответ №1:

Ответ может быть. TelemetryClient нет IDisposable TelemetryConfiguration , но есть, так что:

После замены

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

с

     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);
    }
 

это никогда не возвращалось