Configure Azure Application Insights Manually in MVC

Kailash Chandra Behera | Thursday, June 02, 2022

Introduction

In my previous blog Configure Azure Application Insights Automatically in MVC, we demonstration to add Azure app insights automatically in MVC applicaton. Here in this blog will demonstrate to add Azure Application insights manually in MVC project.

Getting Started

Application Insights in azure is a feature Azure Monitor that delivers a comprehensive solution for collecting, analysing, and acting on telemetry from your cloud and on-premises environments. This information helps you understand how your applications are performing and proactively identify issues affecting them and the resources they depend on.

Addin Application Insights to project in manually steps are bit longer than automatic, basically are two ways to configure azure app insights that are manually and automatically. Here we will discuss or demonstrates how to configur manually. Before continues make sure that you have the following things mentioned below.

  1. Visual Studio 2019 with ASP.NET with web development and Azure development
  2. Azure account
  3. Application insights workspace-based resource.

Here we will demonstrate how to add Azure application Insights to a template-based ASP.NET web app. Assumes that you're using a web app based on the standard MVC web app template for the ASP.NET Framework.

  1. Add the following NuGet packages and their dependencies to your project:
    1. Microsoft.ApplicationInsights.WindowsServer
    2. Microsoft.ApplicationInsights.Web
    3. Microsoft.AspNet.TelemetryCorrelation
  2. In some cases, the ApplicationInsights.config file is created for you automatically. If the file is already present, skip to step 4.
  3. If it's not created automatically, you'll need to create it yourself. In the root directory of an ASP.NET application, create a new file called ApplicationInsights.config.
  4. Copy the following XML configuration into your newly created file:
  5.  <?xml version="1.0" encoding="utf-8"?>  
     <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">  
      <TelemetryInitializers>  
       <Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector" />  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer" />  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer" />  
       <Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web">  
        <!-- Extended list of bots:  
           search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client-->  
        <Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters>  
       </Add>  
       <Add Type="Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.AzureAppServiceRoleNameFromHostNameHeaderInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web" />  
      </TelemetryInitializers>  
      <TelemetryModules>  
       <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">  
        <ExcludeComponentCorrelationHttpHeadersOnDomains>  
         <!--   
         Requests to the following hostnames will not be modified by adding correlation headers.       
         Add entries here to exclude additional hostnames.  
         NOTE: this configuration will be lost upon NuGet upgrade.  
         -->  
         <Add>core.windows.net</Add>  
         <Add>core.chinacloudapi.cn</Add>  
         <Add>core.cloudapi.de</Add>  
         <Add>core.usgovcloudapi.net</Add>  
        </ExcludeComponentCorrelationHttpHeadersOnDomains>  
        <IncludeDiagnosticSourceActivities>  
         <Add>Microsoft.Azure.EventHubs</Add>  
         <Add>Microsoft.Azure.ServiceBus</Add>  
        </IncludeDiagnosticSourceActivities>  
       </Add>  
       <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">  
        <!--  
        Use the following syntax here to collect additional performance counters:  
        <Counters>  
         <Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" />  
         ...  
        </Counters>  
        PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName  
        NOTE: performance counters configuration will be lost upon NuGet upgrade.  
        The following placeholders are supported as InstanceName:  
         ??APP_WIN32_PROC?? - instance name of the application process for Win32 counters.  
         ??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.  
         ??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.  
        -->  
       </Add>  
       <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector" />  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.AppServicesHeartbeatTelemetryModule, Microsoft.AI.WindowsServer" />  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureInstanceMetadataTelemetryModule, Microsoft.AI.WindowsServer">  
        <!--  
        Remove individual fields collected here by adding them to the ApplicationInsighs.HeartbeatProvider   
        with the following syntax:  
        <Add Type="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights">  
         <ExcludedHeartbeatProperties>  
          <Add>osType</Add>  
          <Add>location</Add>  
          <Add>name</Add>  
          <Add>offer</Add>  
          <Add>platformFaultDomain</Add>  
          <Add>platformUpdateDomain</Add>  
          <Add>publisher</Add>  
          <Add>sku</Add>  
          <Add>version</Add>  
          <Add>vmId</Add>  
          <Add>vmSize</Add>  
          <Add>subscriptionId</Add>  
          <Add>resourceGroupName</Add>  
          <Add>placementGroupId</Add>  
          <Add>tags</Add>  
          <Add>vmScaleSetName</Add>  
         </ExcludedHeartbeatProperties>  
        </Add>  
        NOTE: exclusions will be lost upon upgrade.  
        -->  
       </Add>  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer" />  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer" />  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer">  
        <!--</Add>  
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer">-->  
       </Add>  
       <Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web">  
        <Handlers>  
         <!--   
         Add entries here to filter out additional handlers:   
         NOTE: handler configuration will be lost upon NuGet upgrade.  
         -->  
         <Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add>  
         <Add>System.Web.StaticFileHandler</Add>  
         <Add>System.Web.Handlers.AssemblyResourceLoader</Add>  
         <Add>System.Web.Optimization.BundleHandler</Add>  
         <Add>System.Web.Script.Services.ScriptHandlerFactory</Add>  
         <Add>System.Web.Handlers.TraceHandler</Add>  
         <Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add>  
         <Add>System.Web.HttpDebugHandler</Add>  
        </Handlers>  
       </Add>  
       <Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web" />  
       <Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web" />  
      </TelemetryModules>  
      <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />  
      <TelemetrySinks>  
       <Add Name="default">  
        <TelemetryProcessors>  
         <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector" />  
         <Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights" />  
         <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">  
          <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>  
          <ExcludedTypes>Trace</ExcludedTypes>  
         </Add>  
         <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">  
          <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>  
          <IncludedTypes>Event</IncludedTypes>  
         </Add>  
         <!--  
          Adjust the include and exclude examples to specify the desired semicolon-delimited types. (Dependency, Event, Exception, PageView, Request, Trace)  
         -->  
        </TelemetryProcessors>  
        <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel" />  
       </Add>  
      </TelemetrySinks>  
      <!--   
       Learn more about Application Insights configuration with ApplicationInsights.config here:   
       http://go.microsoft.com/fwlink/?LinkID=513840  
      -->  
      <ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>  
     </ApplicationInsights>  
    
  6. Before the closing tag, add the connection string for your Application Insights resource. You can find your connection string on the overview pane of the newly created Application Insights resource.
  7.  <ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>  
    
  8. At the same level of your project as the ApplicationInsights.config file, create a folder called ErrorHandler with a new C# file called AiHandleErrorAttribute.cs. The contents of the file will look like this:
  9.  using System;  
     using System.Web.Mvc;  
     using Microsoft.ApplicationInsights;  
     namespace WebApplication10.ErrorHandler 
     {  
       [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]   
       public class AiHandleErrorAttribute : HandleErrorAttribute  
       {  
         public override void OnException(ExceptionContext filterContext)  
         {  
           if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)  
           {  
             //If customError is Off, then AI HTTPModule will report the exception  
             if (filterContext.HttpContext.IsCustomErrorEnabled)  
             {    
               var ai = new TelemetryClient();  
               ai.TrackException(filterContext.Exception);  
             }   
           }  
           base.OnException(filterContext);  
         }  
       }  
     }  
    
  10. In the App_Start folder, open the FilterConfig.cs file and change it to match the sample:
  11.  using System.Web;  
     using System.Web.Mvc;  
     namespace WebApplication10 //Namespace will vary based on project name  
     {  
       public class FilterConfig  
       {  
         public static void RegisterGlobalFilters(GlobalFilterCollection filters)  
         {  
           filters.Add(new ErrorHandler.AiHandleErrorAttribute());  
         }  
       }  
     }  
    
  12. If Web.config is already updated, skip this step. Otherwise, update the file as follows:
  13.  <?xml version="1.0" encoding="utf-8"?>  
     <!--  
      For more information on how to configure your ASP.NET application, please visit  
      https://go.microsoft.com/fwlink/?LinkId=301880  
      -->  
     <configuration>  
      <appSettings>  
       <add key="webpages:Version" value="3.0.0.0" />  
       <add key="webpages:Enabled" value="false" />  
       <add key="ClientValidationEnabled" value="true" />  
       <add key="UnobtrusiveJavaScriptEnabled" value="true" />  
      </appSettings>  
      <system.web>  
       <compilation debug="true" targetFramework="4.7.2" />  
       <httpRuntime targetFramework="4.7.2" />  
       <!-- Code added for Application Insights start -->  
       <httpModules>  
        <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" />  
        <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />  
       </httpModules>  
       <!-- Code added for Application Insights end -->  
      </system.web>  
      <runtime>  
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
        <dependentAssembly>  
         <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" />  
         <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />  
        </dependentAssembly>  
        <dependentAssembly>  
         <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />  
         <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />  
        </dependentAssembly>  
        <dependentAssembly>  
         <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />  
         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />  
        </dependentAssembly>  
        <dependentAssembly>  
         <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />  
         <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />  
        </dependentAssembly>  
        <dependentAssembly>  
         <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />  
         <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />  
        </dependentAssembly>  
        <dependentAssembly>  
         <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />  
         <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />  
        </dependentAssembly>  
        <dependentAssembly>  
         <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />  
         <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0" />  
        </dependentAssembly>  
        <!-- Code added for Application Insights start -->  
        <dependentAssembly>  
         <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />  
         <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />  
        </dependentAssembly>  
        <!-- Code added for Application Insights end -->  
       </assemblyBinding>  
      </runtime>  
      <system.codedom>  
       <compilers>  
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />  
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />  
       </compilers>  
      </system.codedom>  
      <system.webServer>  
       <validation validateIntegratedModeConfiguration="false" />  
       <!-- Code added for Application Insights start -->  
       <modules>  
        <remove name="TelemetryCorrelationHttpModule" />  
        <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="managedHandler" />  
        <remove name="ApplicationInsightsWebTracking" />  
        <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />  
       </modules>  
       <!-- Code added for Application Insights end -->  
      </system.webServer>  
     </configuration>  
    

You have now successfully configured server-side application monitoring. If you run your web app, you'll see telemetry begin to appear in Application Insights.

Summary

Here we demonstrated how to configure app insights in MVC application, I hope you enjoyed it a lot.

Thanks


No comments: