Created
March 12, 2017 02:05
-
-
Save debugthings/76a3845700d03a33ff55d7549655c81f to your computer and use it in GitHub Desktop.
Enable Application Insights on Migraged Azure Mobile Services applications
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| internal static class RequestTrackingConstants | |
| { | |
| /// <summary> | |
| /// Name of the HttpContext item containing RequestTelemetry object. | |
| /// </summary> | |
| internal const string RequestTelemetryItemName = "Microsoft.ApplicationInsights.RequestTelemetry"; | |
| internal const string EndRequestCallFlag = "Microsoft.ApplicationInsights.EndRequestCallFlag"; | |
| /// <summary> | |
| /// Type name for the transfer handler. This handler is used to enable extension(less) URI | |
| /// and it produces extra request, which should not be counted. | |
| /// </summary> | |
| internal const string TransferHandlerType = "System.Web.Handlers.TransferRequestHandler"; | |
| /// <summary> | |
| /// The name of the cookie which holds authenticated user context information. | |
| /// </summary> | |
| internal const string WebAuthenticatedUserCookieName = "ai_authUser"; | |
| } | |
| public class AppInsightsFilter : System.Web.Http.Filters.ActionFilterAttribute | |
| { | |
| private static TelemetryConfiguration ApplicationInsightsConfig = null; | |
| private RequestTrackingTelemetryModule requestModule; | |
| private ExceptionTrackingTelemetryModule exceptionModule; | |
| /// <summary> | |
| /// Indicates if module initialized successfully. | |
| /// </summary> | |
| private bool isEnabled = true; | |
| private static void CreateConfig(string iKey) | |
| { | |
| if (ApplicationInsightsConfig != null) | |
| { | |
| return; | |
| } | |
| TelemetryModules.Instance.Modules.Add(new DependencyTrackingTelemetryModule()); | |
| TelemetryModules.Instance.Modules.Add(new PerformanceCollectorModule()); | |
| TelemetryModules.Instance.Modules.Add(new QuickPulseTelemetryModule()); | |
| TelemetryModules.Instance.Modules.Add(new UnhandledExceptionTelemetryModule()); | |
| var reqTrackingModule = new RequestTrackingTelemetryModule(); | |
| reqTrackingModule.Handlers.Add("System.Web.Handlers.TransferRequestHandler"); | |
| reqTrackingModule.Handlers.Add("Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler"); | |
| reqTrackingModule.Handlers.Add("System.Web.StaticFileHandler"); | |
| reqTrackingModule.Handlers.Add("System.Web.Handlers.AssemblyResourceLoader"); | |
| reqTrackingModule.Handlers.Add("System.Web.Optimization.BundleHandler"); | |
| reqTrackingModule.Handlers.Add("System.Web.Script.Services.ScriptHandlerFactory"); | |
| reqTrackingModule.Handlers.Add("System.Web.Handlers.TraceHandler"); | |
| reqTrackingModule.Handlers.Add("System.Web.Services.Discovery.DiscoveryRequestHandler"); | |
| reqTrackingModule.Handlers.Add("System.Web.HttpDebugHandler"); | |
| TelemetryModules.Instance.Modules.Add(reqTrackingModule); | |
| TelemetryModules.Instance.Modules.Add(new ExceptionTrackingTelemetryModule()); | |
| ApplicationInsightsConfig = new TelemetryConfiguration(); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new HttpDependenciesParsingTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new AzureRoleEnvironmentTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new AzureWebAppRoleEnvironmentTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new BuildInfoConfigComponentVersionTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new WebTestTelemetryInitializer()); | |
| var syntheticAgentIntializer = new SyntheticUserAgentTelemetryInitializer(); | |
| syntheticAgentIntializer.Filters = "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"; | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(syntheticAgentIntializer); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new ClientIpHeaderTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new OperationNameTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new UserTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new AuthenticatedUserIdTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new AccountIdTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryInitializers.Add(new SessionTelemetryInitializer()); | |
| ApplicationInsightsConfig.TelemetryChannel = new ServerTelemetryChannel(); | |
| ApplicationInsightsConfig.TelemetryProcessorChainBuilder.Use((next) => | |
| { | |
| var qpproc = new QuickPulseTelemetryProcessor(next); | |
| qpproc.Initialize(ApplicationInsightsConfig); | |
| return qpproc; | |
| }); | |
| ApplicationInsightsConfig.TelemetryProcessorChainBuilder.Use((next) => | |
| { | |
| var qpproc = new AdaptiveSamplingTelemetryProcessor(next); | |
| qpproc.MaxTelemetryItemsPerSecond = 16000; // MAX value allowed | |
| return qpproc; | |
| }); | |
| foreach (var item in TelemetryModules.Instance.Modules) | |
| { | |
| item.Initialize(ApplicationInsightsConfig); | |
| } | |
| ApplicationInsightsConfig.InstrumentationKey = iKey; | |
| } | |
| public AppInsightsFilter(string iKey) | |
| { | |
| try | |
| { | |
| CreateConfig(iKey); | |
| foreach (var module in TelemetryModules.Instance.Modules) | |
| { | |
| if (module is RequestTrackingTelemetryModule) | |
| { | |
| this.requestModule = (RequestTrackingTelemetryModule)module; | |
| } | |
| else | |
| { | |
| if (module is ExceptionTrackingTelemetryModule) | |
| { | |
| this.exceptionModule = (ExceptionTrackingTelemetryModule)module; | |
| } | |
| } | |
| } | |
| } | |
| catch (Exception exc) | |
| { | |
| this.isEnabled = false; | |
| // TODO Log this exception | |
| // In the SDK we log this to our logger | |
| // This exception means that something went wrong when trying to access the TelemetryModules instance | |
| } | |
| } | |
| public override void OnActionExecuting(HttpActionContext actionContext) | |
| { | |
| if (this.isEnabled) | |
| { | |
| if (this.requestModule != null) | |
| { | |
| this.requestModule.OnBeginRequest(System.Web.HttpContext.Current); | |
| } | |
| } | |
| base.OnActionExecuting(actionContext); | |
| } | |
| public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) | |
| { | |
| if (this.isEnabled) | |
| { | |
| if (this.IsFirstRequest(System.Web.HttpContext.Current)) | |
| { | |
| if (this.exceptionModule != null) | |
| { | |
| this.exceptionModule.OnError(System.Web.HttpContext.Current); | |
| } | |
| if (this.requestModule != null) | |
| { | |
| this.requestModule.OnEndRequest(System.Web.HttpContext.Current); | |
| } | |
| } | |
| else | |
| { | |
| // Request was filtered out by the config file | |
| } | |
| } | |
| base.OnActionExecuted(actionExecutedContext); | |
| } | |
| private bool IsFirstRequest(System.Web.HttpContext application) | |
| { | |
| var firstRequest = true; | |
| try | |
| { | |
| if (application != null) | |
| { | |
| firstRequest = application.Items[RequestTrackingConstants.EndRequestCallFlag] == null; | |
| if (firstRequest) | |
| { | |
| application.Items.Add(RequestTrackingConstants.EndRequestCallFlag, true); | |
| } | |
| } | |
| } | |
| catch (Exception exc) | |
| { | |
| // TODO Do something with this exception | |
| // This means that | |
| } | |
| return firstRequest; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment