Exemple #1
0
        public void OnActivityStartInjectsW3CHeadersAndTracksLegacyId()
        {
            var listenerWithW3CHeaders = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new string[0],
                injectLegacyHeaders: false,
                injectW3CHeaders: true);

            this.configuration.TelemetryInitializers.Add(new W3COperationCorrelationTelemetryInitializer());
            using (listenerWithW3CHeaders)
            {
                var activity = new Activity("System.Net.Http.HttpRequestOut").SetParentId("foo").Start();

                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithW3CHeaders.OnActivityStart(requestMsg);

                // simulate Request-Id injection by .NET
                requestMsg.Headers.Add(RequestResponseHeaders.RequestIdHeader, activity.Id);

                listenerWithW3CHeaders.OnActivityStop(new HttpResponseMessage(HttpStatusCode.OK), requestMsg, TaskStatus.RanToCompletion);

                var telemetry = this.sentTelemetry.Single() as DependencyTelemetry;
                Assert.IsNotNull(telemetry);
                Assert.IsTrue(telemetry.Properties.ContainsKey(W3C.W3CConstants.LegacyRequestIdProperty));
                Assert.AreEqual(activity.Id, telemetry.Properties[W3C.W3CConstants.LegacyRequestIdProperty]);

                Assert.IsTrue(telemetry.Properties.ContainsKey(W3C.W3CConstants.LegacyRootIdProperty));
                Assert.AreEqual(activity.RootId, telemetry.Properties[W3C.W3CConstants.LegacyRootIdProperty]);
            }
        }
        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);
            }
        }
        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 #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 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 #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));
            }
        }
Exemple #7
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 #8
0
        public void OnActivityStartInjectsLegacyHeaders()
        {
            var listenerWithLegacyHeaders = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new[] { "excluded.host.com" },
                injectLegacyHeaders: true,
                injectW3CHeaders: false);

            using (listenerWithLegacyHeaders)
            {
                var activity = new Activity("System.Net.Http.HttpRequestOut");
                activity.AddBaggage("k", "v");
                activity.Start();

                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithLegacyHeaders.OnActivityStart(requestMsg);

                // Request-Id and Correlation-Context are injected by HttpClient
                // check only legacy headers here
                Assert.AreEqual(Activity.Current.RootId,
                                requestMsg.Headers.GetValues(RequestResponseHeaders.StandardRootIdHeader).Single());
                Assert.AreEqual(Activity.Current.Id,
                                requestMsg.Headers.GetValues(RequestResponseHeaders.StandardParentIdHeader).Single());
                Assert.AreEqual(this.testApplicationId1,
                                GetRequestContextKeyValue(requestMsg, RequestResponseHeaders.RequestContextCorrelationSourceKey));
            }
        }
Exemple #9
0
        public void NetCore30_OnActivityStartInjectsLegacyHeaders()
        {
            var listenerWithLegacyHeaders = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new[] { "excluded.host.com" },
                injectLegacyHeaders: true,
                injectRequestIdInW3CMode: true,
                HttpInstrumentationVersion.V3);

            using (listenerWithLegacyHeaders)
            {
                var activity = new Activity("System.Net.Http.HttpRequestOut");
                activity.AddBaggage("k", "v");
                activity.TraceStateString = "trace=state";
                activity.Start();

                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithLegacyHeaders.OnActivityStart(requestMsg);

                // Traceparent and tracestate and Correlation-Context are injected by HttpClient
                // check only legacy headers here
                Assert.AreEqual(activity.RootId,
                                requestMsg.Headers.GetValues(RequestResponseHeaders.StandardRootIdHeader).Single());
                Assert.AreEqual(activity.SpanId.ToHexString(), requestMsg.Headers.GetValues(RequestResponseHeaders.StandardParentIdHeader).Single());
                Assert.AreEqual(this.testApplicationId1, GetRequestContextKeyValue(requestMsg, RequestResponseHeaders.RequestContextCorrelationSourceKey));
            }
        }
Exemple #10
0
        public void OnActivityStartInjectsW3CHeaders()
        {
            var listenerWithW3CHeaders = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new[] { "excluded.host.com" },
                injectLegacyHeaders: false,
                injectW3CHeaders: true);

            this.configuration.TelemetryInitializers.Add(new W3COperationCorrelationTelemetryInitializer());

            using (listenerWithW3CHeaders)
            {
                var activity = new Activity("System.Net.Http.HttpRequestOut").SetParentId("|guid.").Start();

                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithW3CHeaders.OnActivityStart(requestMsg);

                // Request-Id and Correlation-Context are injected by HttpClient
                // check only W3C headers here
                Assert.AreEqual(this.testApplicationId1, GetRequestContextKeyValue(requestMsg, RequestResponseHeaders.RequestContextCorrelationSourceKey));
                Assert.AreEqual($"00-{activity.GetTraceId()}-{activity.GetSpanId()}-02", requestMsg.Headers.GetValues(W3C.W3CConstants.TraceParentHeader).Single());
                Assert.AreEqual($"{W3C.W3CConstants.AzureTracestateNamespace}={this.testApplicationId1}", requestMsg.Headers.GetValues(W3C.W3CConstants.TraceStateHeader).Single());
            }
        }
Exemple #11
0
        public void Initialize()
        {
            this.telemetryChannel = new StubTelemetryChannel
            {
                EndpointAddress = "https://endpointaddress",
                OnSend          = telemetry => this.sentTelemetry.Add(telemetry)
            };

            this.testInstrumentationKey1 = Guid.NewGuid().ToString();

            this.configuration = new TelemetryConfiguration
            {
                TelemetryChannel      = this.telemetryChannel,
                InstrumentationKey    = this.testInstrumentationKey1,
                ApplicationIdProvider = new MockApplicationIdProvider(this.testInstrumentationKey1, this.testApplicationId1)
            };

            this.configuration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
            this.configuration.TelemetryInitializers.Add(this.operationDetailsInitializer);

            this.listener = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new string[] { "excluded.host.com" },
                injectLegacyHeaders: false,
                injectW3CHeaders: false);
        }
Exemple #12
0
        public void OnStartActivityWithUriInExcludedDomainListW3COff()
        {
            Activity.DefaultIdFormat      = ActivityIdFormat.Hierarchical;
            Activity.ForceDefaultIdFormat = true;

            HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, "http://excluded.host.com/path/to/file.html");

            using (var listener = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new string[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: true,
                       HttpInstrumentationVersion.V2))
            {
                listener.OnActivityStart(requestMsg);
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.RequestContextHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.RequestIdHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.StandardParentIdHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.StandardRootIdHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(W3C.W3CConstants.TraceParentHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(W3C.W3CConstants.TraceStateHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.CorrelationContextHeader));
            }
        }
        public void Initialize()
        {
            this.instrumentationKey = Guid.NewGuid().ToString();

            this.telemetryChannel = new StubTelemetryChannel()
            {
                EndpointAddress = "https://endpointaddress",
                OnSend          = this.sentTelemetry.Add
            };

            this.mockCorrelationIdLookupHelper = new MockCorrelationIdLookupHelper(new Dictionary <string, string>()
            {
                [this.instrumentationKey] = MockAppId
            });

            var configuration = new TelemetryConfiguration
            {
                TelemetryChannel   = this.telemetryChannel,
                InstrumentationKey = this.instrumentationKey,
            };

            configuration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
            this.listener = new HttpCoreDiagnosticSourceListener(
                configuration,
                this.telemetryChannel.EndpointAddress,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new string[] { "excluded.host.com" },
                correlationIdLookupHelper: this.mockCorrelationIdLookupHelper);
        }
        /// <summary>
        /// Initialize method is called after all configuration properties have been loaded from the configuration.
        /// </summary>
        public void Initialize(TelemetryConfiguration configuration)
        {
            DependencyCollectorEventSource.Log.RemoteDependencyModuleVerbose("Initializing DependencyTrackingModule");

            // Temporary fix to make sure that we initialize module once.
            // It should be removed when configuration reading logic is moved to Web SDK.
            if (!this.isInitialized)
            {
                lock (this.lockObject)
                {
                    if (!this.isInitialized)
                    {
                        try
                        {
                            this.telemetryConfiguration = configuration;

#if !NETCORE
                            // Net40 only supports runtime instrumentation
                            // Net45 supports either but not both to avoid duplication
                            this.InitializeForRuntimeInstrumentationOrFramework();
#endif

                            // NET45 referencing .net core System.Net.Http supports diagnostic listener
                            this.httpCoreDiagnosticSourceListener = new HttpCoreDiagnosticSourceListener(
                                configuration,
                                this.EffectiveProfileQueryEndpoint,
                                this.SetComponentCorrelationHttpHeaders,
                                this.ExcludeComponentCorrelationHttpHeadersOnDomains,
                                null);

                            if (this.IncludeDiagnosticSourceActivities != null && this.IncludeDiagnosticSourceActivities.Count > 0)
                            {
                                this.telemetryDiagnosticSourceListener = new TelemetryDiagnosticSourceListener(configuration, this.IncludeDiagnosticSourceActivities);
                                this.telemetryDiagnosticSourceListener.RegisterHandler(EventHubsDiagnosticsEventHandler.DiagnosticSourceName, new EventHubsDiagnosticsEventHandler(configuration));
                                this.telemetryDiagnosticSourceListener.RegisterHandler(ServiceBusDiagnosticsEventHandler.DiagnosticSourceName, new ServiceBusDiagnosticsEventHandler(configuration));
                            }

                            this.sqlClientDiagnosticSourceListener = new SqlClientDiagnosticSourceListener(configuration);

                            DependencyCollectorEventSource.Log.RemoteDependencyModuleVerbose("Initializing DependencyTrackingModule completed successfully.");
                        }
                        catch (Exception exc)
                        {
                            string clrVersion;
#if NETCORE
                            clrVersion = System.Reflection.Assembly.GetEntryAssembly().GetCustomAttribute <TargetFrameworkAttribute>().FrameworkName;
#else
                            clrVersion = Environment.Version.ToString();
#endif
                            DependencyCollectorEventSource.Log.RemoteDependencyModuleError(exc.ToInvariantString(), clrVersion);
                        }

                        this.PrepareActivity();

                        this.isInitialized = true;
                    }
                }
            }
        }
Exemple #15
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
            }
        }
        /// <summary>
        /// Initialize method is called after all configuration properties have been loaded from the configuration.
        /// </summary>
        public void Initialize(TelemetryConfiguration configuration)
        {
            // Temporary fix to make sure that we initialize module once.
            // It should be removed when configuration reading logic is moved to Web SDK.
            if (!this.isInitialized)
            {
                lock (this.lockObject)
                {
                    if (!this.isInitialized)
                    {
                        try
                        {
                            this.telemetryConfiguration = configuration;

#if !NETCORE
                            // Net40 only supports runtime instrumentation
                            // Net45 supports either but not both to avoid duplication
                            this.InitializeForRuntimeInstrumentationOrFramework();
#endif

#if NET45 || NETCORE
                            // NET45 referencing .net core System.Net.Http supports diagnostic listener
                            this.httpCoreDiagnosticSourceListener = new HttpCoreDiagnosticSourceListener(
                                configuration,
                                this.EffectiveProfileQueryEndpoint,
                                this.SetComponentCorrelationHttpHeaders,
                                this.ExcludeComponentCorrelationHttpHeadersOnDomains,
                                null);
#endif
                        }
                        catch (Exception exc)
                        {
                            string clrVersion;
#if NETCORE
                            clrVersion = System.Reflection.Assembly.GetEntryAssembly().GetCustomAttribute <TargetFrameworkAttribute>().FrameworkName;
#else
                            clrVersion = Environment.Version.ToString();
#endif
                            DependencyCollectorEventSource.Log.RemoteDependencyModuleError(exc.ToInvariantString(), clrVersion);
                        }

#if !NET40
                        this.PrepareActivity();
#endif

                        this.isInitialized = true;
                    }
                }
            }
        }
Exemple #17
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 #18
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 #19
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 #20
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);
            }
        }
Exemple #21
0
        public void OnResponseWithResponseEventButNoMatchingRequest()
        {
            var responseMsg = new HttpResponseMessage
            {
                RequestMessage = 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.OnResponse(responseMsg, Guid.NewGuid());
                Assert.AreEqual(0, this.sentTelemetry.Count);
            }
        }
Exemple #22
0
        public void Initialize()
        {
            this.sentTelemetry   = new List <ITelemetry>();
            this.request         = null;
            this.response        = null;
            this.responseHeaders = null;

            this.telemetryChannel = new StubTelemetryChannel()
            {
                EndpointAddress = "https://endpointaddress",
                OnSend          = telemetry =>
                {
                    this.sentTelemetry.Add(telemetry);
                },
            };

            this.testInstrumentationKey1 = Guid.NewGuid().ToString();

            this.configuration = new TelemetryConfiguration
            {
                TelemetryChannel      = this.telemetryChannel,
                InstrumentationKey    = this.testInstrumentationKey1,
                ApplicationIdProvider = new MockApplicationIdProvider(this.testInstrumentationKey1, this.testApplicationId1)
            };

            this.configuration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
            this.configuration.TelemetryInitializers.Add(new StubTelemetryInitializer
            {
                OnInitialize = telemetry =>
                {
                    var depTelemetry = telemetry as DependencyTelemetry;
                    depTelemetry.TryGetOperationDetail(RemoteDependencyConstants.HttpRequestOperationDetailName, out this.request);
                    depTelemetry.TryGetOperationDetail(RemoteDependencyConstants.HttpResponseOperationDetailName, out this.response);
                    depTelemetry.TryGetOperationDetail(RemoteDependencyConstants.HttpResponseHeadersOperationDetailName, out this.responseHeaders);
                }
            });
            this.listener = new HttpCoreDiagnosticSourceListener(
                this.configuration,
                setComponentCorrelationHttpHeaders: true,
                correlationDomainExclusionList: new string[] { "excluded.host.com" },
                injectLegacyHeaders: false,
                injectW3CHeaders: false);
        }
Exemple #23
0
        public void OnActivityStartInjectsHeadersRequestIdOff()
        {
            using (var listenerWithoutRequestId = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: false,
                       HttpInstrumentationVersion.V2))
            {
                var activity = new Activity("System.Net.Http.HttpRequestOut");
                activity.Start();

                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithoutRequestId.OnActivityStart(requestMsg);

                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.RequestIdHeader));

                var traceparents = requestMsg.Headers.GetValues(W3C.W3CConstants.TraceParentHeader).ToArray();
                Assert.AreEqual(1, traceparents.Length);
                Assert.AreEqual(activity.Id, traceparents[0]);
            }
        }
Exemple #24
0
        public void NetCore30_OnActivityStartInjectsHeadersRequestIdOff()
        {
            using (var listenerWithoutRequestId = new HttpCoreDiagnosticSourceListener(
                       this.configuration,
                       setComponentCorrelationHttpHeaders: true,
                       correlationDomainExclusionList: new[] { "excluded.host.com" },
                       injectLegacyHeaders: false,
                       injectRequestIdInW3CMode: false,
                       HttpInstrumentationVersion.V3))
            {
                var activity = new Activity("System.Net.Http.HttpRequestOut");
                activity.AddBaggage("k", "v");
                activity.TraceStateString = "trace=state";
                activity.Start();

                HttpRequestMessage requestMsg = new HttpRequestMessage(HttpMethod.Post, RequestUrlWithScheme);
                listenerWithoutRequestId.OnActivityStart(requestMsg);

                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.RequestIdHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(W3C.W3CConstants.TraceParentHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(W3C.W3CConstants.TraceStateHeader));
                Assert.IsFalse(requestMsg.Headers.Contains(RequestResponseHeaders.CorrelationContextHeader));
            }
        }