Exemple #1
0
        public void VerifyOnRequestWithDuplicateRequestCreatesValidTelemetry()
        {
            Guid loggingRequestId = Guid.NewGuid();

            var requestMsg = new HttpRequestMessage(HttpMethod.Get, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                // first request, expected to fail
                listener.OnRequest(requestMsg, loggingRequestId);

                // second request (BEFORE HANDLING FIRST RESPONSE), expected to pass
                listener.OnRequest(requestMsg, loggingRequestId);

                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out _));
                Assert.AreEqual(0, this.sentTelemetry.Count);

                // first request fails
                HttpResponseMessage responseMsg1 = new HttpResponseMessage(HttpStatusCode.NotFound)
                {
                    RequestMessage = requestMsg
                };

                listener.OnResponse(responseMsg1, loggingRequestId);
                Assert.IsFalse(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out _));
                Assert.AreEqual(1, this.sentTelemetry.Count);
                Assert.AreEqual(false,
                                ((DependencyTelemetry)this.sentTelemetry.Last()).Success); // first request fails

                Assert.Inconclusive();

                // THE FOLLOWING ASSERTS ARE EXPECTED TO PASS, BUT CURRENTLY FAIL DUE TO A KNOWN ISSUE: #724
                // Because two identical requests were sent, whichever completes first will remove the request from pending telemetry.

                // second request is success
                HttpResponseMessage responseMsg2 = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    RequestMessage = requestMsg
                };

                listener.OnResponse(responseMsg2, loggingRequestId);
                Assert.IsFalse(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out _));
                Assert.AreEqual(2, this.sentTelemetry.Count);
                Assert.AreEqual(true,
                                ((DependencyTelemetry)this.sentTelemetry.Last()).Success); // second request is success
            }
        }
        public void OnRequestInjectsLegacyHeaders()
        {
            var listenerWithLegacyHeaders = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new[] { "excluded.host.com" },
                injectLegacyHeaders: true,
                injectW3CHeaders: false);

            using (listenerWithLegacyHeaders)
            {
                Guid loggingRequestId      = Guid.NewGuid();
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithLegacyHeaders.OnRequest(request, loggingRequestId);

                IOperationHolder <DependencyTelemetry> dependency;
                Assert.IsTrue(
                    listenerWithLegacyHeaders.PendingDependencyTelemetry.TryGetValue(request, out dependency));
                Assert.AreEqual(0, this.sentTelemetry.Count);

                var legacyRootIdHeader = GetRequestHeaderValues(request, RequestResponseHeaders.StandardRootIdHeader)
                                         .Single();
                var legacyParentIdHeader =
                    GetRequestHeaderValues(request, RequestResponseHeaders.StandardParentIdHeader).Single();
                var requestIdHeader = GetRequestHeaderValues(request, RequestResponseHeaders.RequestIdHeader).Single();
                Assert.AreEqual(dependency.Telemetry.Id, legacyParentIdHeader);
                Assert.AreEqual(dependency.Telemetry.Context.Operation.Id, legacyRootIdHeader);
                Assert.AreEqual(dependency.Telemetry.Id, requestIdHeader);
            }
        }
Exemple #3
0
        public void OnRequestWithRequestEvent()
        {
            Guid loggingRequestId         = Guid.NewGuid();
            HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, loggingRequestId);

                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out var dependency));

                DependencyTelemetry telemetry = dependency.Telemetry;
                Assert.AreEqual("POST /", telemetry.Name);
                Assert.AreEqual(RequestUrl, telemetry.Target);
                Assert.AreEqual(RemoteDependencyConstants.HTTP, telemetry.Type);
                Assert.AreEqual(RequestUrlWithScheme, telemetry.Data);
                Assert.AreEqual(string.Empty, telemetry.ResultCode);
                Assert.AreEqual(true, telemetry.Success);

                Assert.AreEqual(this.testApplicationId1,
                                GetRequestContextKeyValue(requestMsg, RequestResponseHeaders.RequestContextCorrelationSourceKey));

                var requestIdHeader =
                    GetRequestHeaderValues(requestMsg, RequestResponseHeaders.RequestIdHeader).Single();
                Assert.IsFalse(string.IsNullOrEmpty(requestIdHeader));
                Assert.AreEqual(0, this.sentTelemetry.Count);
            }
        }
Exemple #4
0
        public void OnRequestDoesNotInjectLegacyHeaders()
        {
            Guid loggingRequestId         = Guid.NewGuid();
            HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, loggingRequestId);

                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out var dependency));
                Assert.AreEqual(0, this.sentTelemetry.Count);

                var requestIdHeader =
                    GetRequestHeaderValues(requestMsg, RequestResponseHeaders.RequestIdHeader).Single();
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.StandardRootIdHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.StandardParentIdHeader));
                Assert.AreEqual($"|{dependency.Telemetry.Context.Operation.Id}.{dependency.Telemetry.Id}.", requestIdHeader);
            }
        }
Exemple #5
0
        public void OnRequestInjectsLegacyHeadersW3COff()
        {
            Activity.DefaultIdFormat      = ActivityIdFormat.Hierarchical;
            Activity.ForceDefaultIdFormat = true;

            var listenerWithLegacyHeaders = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new[] { "excluded.host.com" },
                injectLegacyHeaders: true,
                injectRequestIdInW3CMode: true,
                HttpInstrumentationVersion.V1);

            using (listenerWithLegacyHeaders)
            {
                Guid loggingRequestId         = Guid.NewGuid();
                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithLegacyHeaders.OnRequest(requestMsg, loggingRequestId);

                Assert.IsTrue(
                    listenerWithLegacyHeaders.PendingDependencyTelemetry.TryGetValue(requestMsg, out var dependency));
                Assert.AreEqual(0, this.sentTelemetry.Count);

                var legacyRootIdHeader = GetRequestHeaderValues(requestMsg, RequestResponseHeaders.StandardRootIdHeader)
                                         .Single();
                var legacyParentIdHeader =
                    GetRequestHeaderValues(requestMsg, RequestResponseHeaders.StandardParentIdHeader).Single();
                var requestIdHeader = GetRequestHeaderValues(requestMsg, RequestResponseHeaders.RequestIdHeader).Single();

                Assert.AreEqual(dependency.Telemetry.Id, legacyParentIdHeader);
                Assert.AreEqual(dependency.Telemetry.Context.Operation.Id, legacyRootIdHeader);
                Assert.AreEqual(dependency.Telemetry.Id, requestIdHeader);
            }
        }
Exemple #6
0
        public void OnRequestWithUriInExcludedDomainList()
        {
            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                Guid loggingRequestId         = Guid.NewGuid();
                HttpRequestMessage requestMsg =
                    new HttpRequestMessage(HttpMethod.Post, "http://excluded.host.com/path/to/file.html");
                listener.OnRequest(requestMsg, loggingRequestId);

                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out _));
                Assert.AreEqual(0, this.sentTelemetry.Count);

                Assert.IsNull(HttpHeadersUtilities.GetRequestContextKeyValue(requestMsg.Headers,
                                                                             RequestResponseHeaders.RequestContextCorrelationSourceKey));
                Assert.IsNull(HttpHeadersUtilities.GetRequestContextKeyValue(requestMsg.Headers,
                                                                             RequestResponseHeaders.RequestIdHeader));
                Assert.IsNull(HttpHeadersUtilities.GetRequestContextKeyValue(requestMsg.Headers,
                                                                             RequestResponseHeaders.StandardParentIdHeader));
                Assert.IsNull(HttpHeadersUtilities.GetRequestContextKeyValue(requestMsg.Headers,
                                                                             RequestResponseHeaders.StandardRootIdHeader));
            }
        }
        public void OnResponseWithParentActivity()
        {
            var parentActivity = new Activity("incoming_request");

            parentActivity.AddBaggage("k1", "v1");
            parentActivity.AddBaggage("k2", "v2");
            parentActivity.Start();
            parentActivity.TraceStateString = "state=some";

            Guid loggingRequestId         = Guid.NewGuid();
            HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, loggingRequestId);
                Assert.IsNotNull(Activity.Current);

                var requestId   = requestMsg.Headers.GetValues(RequestResponseHeaders.RequestIdHeader).Single();
                var traceparent = requestMsg.Headers.GetValues("traceparent").Single();
                var tracestate  = requestMsg.Headers.GetValues("tracestate").Single();

                Assert.AreEqual($"|{Activity.Current.TraceId.ToHexString()}.{Activity.Current.SpanId.ToHexString()}.",
                                requestId);
                Assert.AreEqual(Activity.Current.Id, traceparent);
                Assert.AreEqual("state=some", tracestate);

                var correlationContextHeader =
                    requestMsg.Headers.GetValues(RequestResponseHeaders.CorrelationContextHeader).ToArray();
                Assert.AreEqual(2, correlationContextHeader.Length);
                Assert.IsTrue(correlationContextHeader.Contains("k1=v1"));
                Assert.IsTrue(correlationContextHeader.Contains("k2=v2"));

                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out var dependency));

                DependencyTelemetry telemetry = dependency.Telemetry;

                HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    RequestMessage = requestMsg
                };

                listener.OnResponse(responseMsg, loggingRequestId);
                Assert.AreEqual(parentActivity, Activity.Current);
                Assert.AreEqual(requestId, telemetry.Id);
                Assert.AreEqual(parentActivity.RootId, telemetry.Context.Operation.Id);
                Assert.AreEqual($"|{parentActivity.TraceId.ToHexString()}.{parentActivity.SpanId.ToHexString()}.", telemetry.Context.Operation.ParentId);
                Assert.AreEqual("state=some", telemetry.Properties["tracestate"]);

                // Check the operation details
                this.operationDetailsInitializer.ValidateOperationDetailsCore(telemetry);
            }

            parentActivity.Stop();
        }
Exemple #8
0
        public void VerifyOnRequestWithSameDoesNotThrowException()
        {
            var loggingRequestId = Guid.NewGuid();

            var requestMsg = new HttpRequestMessage(HttpMethod.Get, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, loggingRequestId);
                listener.OnRequest(requestMsg, loggingRequestId);
            }
        }
Exemple #9
0
        public void OnResponseWithSuccessfulResponseEventWithMatchingRequestAndNoTargetInstrumentationKeyHasHeader()
        {
            Guid loggingRequestId         = Guid.NewGuid();
            HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, loggingRequestId);

                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out var dependency));

                Assert.AreEqual(0, this.sentTelemetry.Count);

                DependencyTelemetry telemetry = dependency.Telemetry;
                Assert.AreEqual(string.Empty, telemetry.ResultCode);
                Assert.AreEqual(true, telemetry.Success);

                HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    RequestMessage = requestMsg
                };

                listener.OnResponse(responseMsg, loggingRequestId);
                Assert.IsFalse(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out dependency));
                Assert.AreEqual(1, this.sentTelemetry.Count);
                Assert.AreSame(telemetry, this.sentTelemetry.Single());

                Assert.AreEqual(RemoteDependencyConstants.HTTP, telemetry.Type);
                Assert.AreEqual(RequestUrl, telemetry.Target);
                Assert.AreEqual(HttpOkResultCode, telemetry.ResultCode);
                Assert.AreEqual(true, telemetry.Success);

                string expectedVersion =
                    SdkVersionHelper.GetExpectedSdkVersion(typeof(DependencyTrackingTelemetryModule),
                                                           prefix: "rdddsc:");
                Assert.AreEqual(expectedVersion, telemetry.Context.GetInternalContext().SdkVersion);

                // Check the operation details
                this.operationDetailsInitializer.ValidateOperationDetailsCore(telemetry);
            }
        }
Exemple #10
0
        public void OnRequestWithRequestEventWithNoRequestUri()
        {
            var requestMsg = new HttpRequestMessage();

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, Guid.NewGuid());

                Assert.IsFalse(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out _));
                Assert.AreEqual(0, this.sentTelemetry.Count);
            }
        }
Exemple #11
0
        public void OnResponseWithFailedResponseEventWithMatchingRequestAndDifferentTargetInstrumentationKeyHashHeader()
        {
            Guid loggingRequestId         = Guid.NewGuid();
            HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V1))
            {
                listener.OnRequest(requestMsg, loggingRequestId);
                Assert.IsTrue(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out var dependency));
                Assert.AreEqual(0, this.sentTelemetry.Count);

                DependencyTelemetry telemetry = dependency.Telemetry;
                Assert.AreEqual(string.Empty, telemetry.ResultCode);
                Assert.AreEqual(true, telemetry.Success);

                HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound)
                {
                    RequestMessage = requestMsg
                };

                string targetApplicationId = this.testApplicationId2;
                HttpHeadersUtilities.SetRequestContextKeyValue(responseMsg.Headers,
                                                               RequestResponseHeaders.RequestContextCorrelationTargetKey, targetApplicationId);

                listener.OnResponse(responseMsg, loggingRequestId);
                Assert.IsFalse(listener.PendingDependencyTelemetry.TryGetValue(requestMsg, out dependency));
                Assert.AreEqual(1, this.sentTelemetry.Count);
                Assert.AreSame(telemetry, this.sentTelemetry.Single());

                Assert.AreEqual(RemoteDependencyConstants.AI, telemetry.Type);
                Assert.AreEqual(GetApplicationInsightsTarget(targetApplicationId), telemetry.Target);
                Assert.AreEqual(NotFoundResultCode, telemetry.ResultCode);
                Assert.AreEqual(false, telemetry.Success);

                // Check the operation details
                this.operationDetailsInitializer.ValidateOperationDetailsCore(telemetry);
            }
        }