public void UpdateRequestTelemetryFromRequestHandlesNulls()
        {
            var requestTelemetry = new RequestTelemetry();
            var request          = HttpModuleHelper.GetFakeHttpContext().Request;
            var appIdProvider    = GetMockAppIdProvider("currentAppId").Object;

            RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(null, request, appIdProvider);
            RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(requestTelemetry, null, appIdProvider);
        }
        public void UpdateRequestTelemetryFromRequestDoesntUpdateSourceIfAppIdProviderIsNull()
        {
            var requestTelemetry = new RequestTelemetry();

            var headers = new Dictionary <string, string>
            {
                { RequestResponseHeaders.RequestContextHeader, $"{RequestResponseHeaders.RequestContextCorrelationSourceKey}=sourceAppId" }
            };
            var context = HttpModuleHelper.GetFakeHttpContext(headers);

            RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(requestTelemetry, context.Request, applicationIdProvider: null);

            Assert.AreEqual(context.Request.Unvalidated.Url, requestTelemetry.Url);
            Assert.AreEqual(string.Empty, requestTelemetry.Source, "If appIdProvider is null, requestTelemetry.Source should not be set");
        }
        public void UpdateRequestTelemetryFromRequestDoesntSetSourceIfSame()
        {
            var requestTelemetry = new RequestTelemetry();

            var headers = new Dictionary <string, string>
            {
                { RequestResponseHeaders.RequestContextHeader, $"{RequestResponseHeaders.RequestContextCorrelationSourceKey}=currentAppId" }
            };
            var context = HttpModuleHelper.GetFakeHttpContext(headers);

            var appIdProvider = GetMockAppIdProvider("currentAppId");

            RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(requestTelemetry, context.Request, appIdProvider.Object);

            Assert.AreEqual(context.Request.Unvalidated.Url, requestTelemetry.Url);
            Assert.AreEqual(string.Empty, requestTelemetry.Source, "If Source and CurrentAppId match, the requestTelemetry.Source must be empty");
        }
        public void UpdateRequestTelemetryFromRequestUpdatesTelemetryItems()
        {
            var requestTelemetry = new RequestTelemetry();

            var headers = new Dictionary <string, string>
            {
                { RequestResponseHeaders.RequestContextHeader, $"{RequestResponseHeaders.RequestContextCorrelationSourceKey}=sourceAppId" }
            };
            var context = HttpModuleHelper.GetFakeHttpContext(headers);

            var appIdProvider = GetMockAppIdProvider("currentAppId");

            RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(requestTelemetry, context.Request, appIdProvider.Object);

            Assert.AreEqual(context.Request.Unvalidated.Url, requestTelemetry.Url);
            Assert.AreEqual("sourceAppId", requestTelemetry.Source);
        }
        public void UpdateRequestTelemetryFromRequestDoesntOverwriteIfAlreadyExists()
        {
            var requestTelemetry = new RequestTelemetry
            {
                Url    = new Uri("http://shouldPreserveUrl"),
                Source = "shouldPreserveSource"
            };

            var headers = new Dictionary <string, string>
            {
                { RequestResponseHeaders.RequestContextHeader, $"{RequestResponseHeaders.RequestContextCorrelationSourceKey}=sourceAppId" }
            };
            var context = HttpModuleHelper.GetFakeHttpContext(headers);

            var appIdProvider = GetMockAppIdProvider("currentAppId");

            RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(requestTelemetry, context.Request, appIdProvider.Object);

            Assert.AreEqual(new Uri("http://shouldPreserveUrl"), requestTelemetry.Url);
            Assert.AreEqual("shouldPreserveSource", requestTelemetry.Source);
        }
        /// <summary>
        /// Implements on end callback of http module.
        /// </summary>
        public void OnEndRequest(HttpContext context)
        {
            if (this.telemetryClient == null)
            {
                if (!this.initializationErrorReported)
                {
                    this.initializationErrorReported = true;
                    WebEventSource.Log.InitializeHasNotBeenCalledOnModuleYetError();
                }
                else
                {
                    WebEventSource.Log.InitializeHasNotBeenCalledOnModuleYetVerbose();
                }

                return;
            }

            if (!this.NeedProcessRequest(context))
            {
                return;
            }

            var requestTelemetry = context.ReadOrCreateRequestTelemetryPrivate();

            requestTelemetry.Stop();

            var success = true;

            if (string.IsNullOrEmpty(requestTelemetry.ResponseCode))
            {
                var statusCode = context.Response.StatusCode;
                requestTelemetry.ResponseCode = statusCode == 200 ? "200" : statusCode.ToString(CultureInfo.InvariantCulture);

                if (statusCode >= 400 && statusCode != 401)
                {
                    success = false;
                }
            }

            if (!requestTelemetry.Success.HasValue)
            {
                requestTelemetry.Success = success;
            }

            if (string.IsNullOrEmpty(requestTelemetry.Context.InstrumentationKey))
            {
                // Instrumentation key is probably empty, because the context has not yet had a chance to associate the requestTelemetry to the telemetry client yet.
                // and get they instrumentation key from all possible sources in the process. Let's do that now.
                this.telemetryClient.InitializeInstrumentationKey(requestTelemetry);
            }

            // Setting requestTelemetry.Url and requestTelemetry.Source can be deferred until after sampling
            if (this.DisableTrackingProperties == false)
            {
                RequestTrackingUtilities.UpdateRequestTelemetryFromRequest(requestTelemetry, context.Request, this.telemetryConfiguration?.ApplicationIdProvider);
            }

            if (this.childRequestTrackingSuppressionModule?.OnEndRequest_ShouldLog(context) ?? true)
            {
                this.telemetryClient.TrackRequest(requestTelemetry);
            }
            else
            {
                WebEventSource.Log.RequestTrackingTelemetryModuleRequestWasNotLoggedInformational();
            }
        }