public void TestRequestWithNonW3CCompatibleRequestIdHeader()
        {
            IWebHostBuilder Config(IWebHostBuilder builder)
            {
                return(builder.ConfigureServices(services =>
                {
                    var aiOptions = new ApplicationInsightsServiceOptions();
                    // disable Dependency tracking (i.e. header injection)
                    aiOptions.EnableDependencyTrackingTelemetryModule = false;
                    services.AddApplicationInsightsTelemetry(aiOptions);
                }));
            }

            using (var server = new InProcessServer(assemblyName, this.output, Config))
            {
                const string RequestPath = "/api/values";

                var expectedRequestTelemetry = new RequestTelemetry();
                expectedRequestTelemetry.Name         = "GET Values/Get";
                expectedRequestTelemetry.ResponseCode = "200";
                expectedRequestTelemetry.Success      = true;
                expectedRequestTelemetry.Url          = new Uri(server.BaseHost + RequestPath);

                var headers = new Dictionary <string, string>
                {
                    // Request-ID Correlation Header
                    { "Request-Id", "|noncompatible.df07da90a5b27d93." },
                    { "Request-Context", "appId=value" },
                    { "Correlation-Context", "k1=v1,k2=v2" }
                };

                var actualRequest = this.ValidateRequestWithHeaders(server, RequestPath, headers, expectedRequestTelemetry);

                Assert.NotEqual("noncompatible", actualRequest.tags["ai.operation.id"]);
                Assert.Equal("|noncompatible.df07da90a5b27d93.", actualRequest.tags["ai.operation.parentId"]);
                Assert.Equal("noncompatible", actualRequest.data.baseData.properties["ai_legacyRootId"]);
                Assert.Equal("v1", actualRequest.data.baseData.properties["k1"]);
                Assert.Equal("v2", actualRequest.data.baseData.properties["k2"]);
            }
        }
        public void TestRequestWithNonW3CCompatibleNonHierrachicalRequestIdHeader()
        {
            IWebHostBuilder Config(IWebHostBuilder builder)
            {
                return(builder.ConfigureServices(services =>
                {
                    services.AddApplicationInsightsTelemetry();
                    // disable Dependency tracking (i.e. header injection)
                    services.Remove(services.FirstOrDefault(sd => sd.ImplementationType == typeof(DependencyTrackingTelemetryModule)));
                }));
            }

            using (var server = new InProcessServer(assemblyName, this.output, Config))
            {
                const string RequestPath = "/api/values";

                var expectedRequestTelemetry = new RequestTelemetry();
                expectedRequestTelemetry.Name         = "GET Values/Get";
                expectedRequestTelemetry.ResponseCode = "200";
                expectedRequestTelemetry.Success      = true;
                expectedRequestTelemetry.Url          = new Uri(server.BaseHost + RequestPath);

                var headers = new Dictionary <string, string>
                {
                    // Request-ID Correlation Header
                    { "Request-Id", "somerandomidnotinanyformat" },
                    { "Request-Context", "appId=value" },
                    { "Correlation-Context", "k1=v1,k2=v2" }
                };

                var actualRequest = this.ValidateRequestWithHeaders(server, RequestPath, headers, expectedRequestTelemetry);

                Assert.NotEqual("noncompatible", actualRequest.tags["ai.operation.id"]);
                Assert.Contains("somerandomidnotinanyformat", actualRequest.tags["ai.operation.parentId"]);
                Assert.Equal("somerandomidnotinanyformat", actualRequest.data.baseData.properties["ai_legacyRootId"]);
                Assert.Equal("v1", actualRequest.data.baseData.properties["k1"]);
                Assert.Equal("v2", actualRequest.data.baseData.properties["k2"]);
            }
        }
Exemple #3
0
        public void CorrelationInfoIsPropagatedToDependendedService()
        {
#if !NET451 // Correlation is not supported in NET451. It works with NET46 and .Net core.
            InProcessServer server;

            using (server = new InProcessServer(assemblyName, InProcessServer.UseApplicationInsights))
            {
                using (var httpClient = new HttpClient())
                {
                    var task = httpClient.GetAsync(server.BaseHost + "/");
                    task.Wait(TestTimeoutMs);
                }
            }

            var telemetries = server.BackChannel.Buffer;

            Assert.True(telemetries.Count >= 2);
            var requestTelemetry    = telemetries.OfType <RequestTelemetry>().Single();
            var dependencyTelemetry = telemetries.OfType <DependencyTelemetry>().Single();
            Assert.Equal(requestTelemetry.Context.Operation.Id, dependencyTelemetry.Context.Operation.Id);
            Assert.Equal(requestTelemetry.Context.Operation.ParentId, dependencyTelemetry.Id);
#endif
        }
        public void TestRequestWithNoCorrelationHeaders()
        {
            IWebHostBuilder Config(IWebHostBuilder builder)
            {
                return(builder.ConfigureServices(services =>
                {
                    var aiOptions = new ApplicationInsightsServiceOptions();
                    // disable Dependency tracking (i.e. header injection)
                    aiOptions.EnableDependencyTrackingTelemetryModule = false;
                    services.AddApplicationInsightsTelemetry(aiOptions);
                }));
            }

            using (var server = new InProcessServer(assemblyName, this.output, Config))
            {
                const string RequestPath = "/api/values/1";

                var expectedRequestTelemetry = new RequestTelemetry();
                expectedRequestTelemetry.Name         = "GET Values/Get [id]";
                expectedRequestTelemetry.ResponseCode = "200";
                expectedRequestTelemetry.Success      = true;
                expectedRequestTelemetry.Url          = new System.Uri(server.BaseHost + RequestPath);

                Dictionary <string, string> requestHeaders = new Dictionary <string, string>()
                {
                    // No Request-ID, No TraceParent
                    { "Request-Context", "appId=value" },
                };

                var item = this.ValidateBasicRequest(server, RequestPath, expectedRequestTelemetry);

                Assert.Equal(32, item.tags["ai.operation.id"].Length);
                Assert.True(Regex.Match(item.tags["ai.operation.id"], @"[a-z][0-9]").Success);

                Assert.False(item.tags.ContainsKey("ai.operation.parentId"));
            }
        }
        public void TestMixedTelemetryItemsReceived()
        {
            InProcessServer server;

            using (server = new InProcessServer(assemblyName, InProcessServer.UseApplicationInsights))
            {
                using (var httpClient = new HttpClient())
                {
                    var task = httpClient.GetAsync(server.BaseHost + "/Home/Contact");
                    task.Wait(TestTimeoutMs);
                }
            }
            var telemetries = server.BackChannel.Buffer;

            Assert.Contains(telemetries.OfType <DependencyTelemetry>(), t => t.Name == "GET /Home/Contact");
            Assert.True(telemetries.Count >= 4);
            Assert.Contains(telemetries.OfType <RequestTelemetry>(), t => t.Name == "GET Home/Contact");
            Assert.Contains(telemetries.OfType <EventTelemetry>(), t => t.Name == "GetContact");
            Assert.Contains(telemetries.OfType <MetricTelemetry>(),
                            t => t.Name == "ContactFile" && t.Value == 1);

            Assert.Contains(telemetries.OfType <TraceTelemetry>(),
                            t => t.Message == "Fetched contact details." && t.SeverityLevel == SeverityLevel.Information);
        }
Exemple #6
0
        public void TestIloggerDefaultsCanBeOverridenByUserForAllCategories()
        {
            void ConfigureServices(IServiceCollection services)
            {
                // ARRANGE
                // AddFilter to capture only Error. This is expected to override default behavior.
                services.AddLogging(builder => builder.AddFilter <Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>("", LogLevel.Error));
            }

            using (var server = new InProcessServer(assemblyName, this.output, null, ConfigureServices))
            {
                // Make request to this path, which sents one log of each severity  Error, Warning, Information, Trace
                this.ExecuteRequest(server.BaseHost + "/api/values/5");

                // AI is now expected to capture only Error
                var actual = server.Listener.ReceiveItemsOfType <TelemetryItem <MessageData> >(1, TestListenerTimeoutInMs);
                this.DebugTelemetryItems(actual);

                // Expect 1 item1.
                Assert.Single(actual);

                ValidateMessage(actual[0], new string[] { "error" });
            }
        }
        public void ActiveConfigurationIsNotCorruptedAfterWebHostIsDisposed()
        {
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                // https://github.com/dotnet/corefx/issues/25016
                // HttpListener on Linux/MacOS cannot be reused on the same port until connection
                // is closed on the OS level. So we run this test on windows only.
                return;
            }

            var activeConfig = TelemetryConfiguration.Active;

            using (var server = new InProcessServer(assemblyName, this.output))
            {
                this.ExecuteRequest(server.BaseHost + requestPath);

                // receive everything and clean up
                server.Listener.ReceiveItemsOfType <TelemetryItem <RequestData> >(1, TestListenerTimeoutInMs);
            }

            Assert.NotNull(activeConfig.TelemetryChannel);

            using (var listener = new TelemetryHttpListenerObservable(activeConfig.TelemetryChannel.EndpointAddress, this.output))
            {
                listener.Start();

                var telemetryClient = new TelemetryClient(activeConfig);
                telemetryClient.TrackTrace("some message after web host is disposed");

                var message = listener.ReceiveItemsOfType <TelemetryItem <MessageData> >(1, TestListenerTimeoutInMs);
                Assert.Single(message);

                this.output.WriteLine(((TelemetryItem <MessageData>)message.Single()).data.baseData.message);
                Assert.Equal("some message after web host is disposed", ((TelemetryItem <MessageData>)message.Single()).data.baseData.message);
            }
        }
        public void TestW3CEnabledW3CHeadersOnly()
        {
            using (var server = new InProcessServer(assemblyName, this.output, builder =>
            {
                return(builder.ConfigureServices(services =>
                {
                    services.AddApplicationInsightsTelemetry(o => o.RequestCollectionOptions.EnableW3CDistributedTracing = true);
                    var depCollectorSd = services.Single(sd =>
                                                         sd.ImplementationType == typeof(DependencyTrackingTelemetryModule));
                    services.Remove(depCollectorSd);
                }));
            }))
            {
                const string RequestPath = "/api/values";

                var expectedRequestTelemetry = new RequestTelemetry();
                expectedRequestTelemetry.Name         = "GET Values/Get";
                expectedRequestTelemetry.ResponseCode = "200";
                expectedRequestTelemetry.Success      = true;
                expectedRequestTelemetry.Url          = new Uri(server.BaseHost + RequestPath);

                var headers = new Dictionary <string, string>
                {
                    ["traceparent"]         = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
                    ["tracestate"]          = "some=state,az=cid-v1:xyz",
                    ["Correlation-Context"] = "k1=v1,k2=v2"
                };

                var actualRequest = this.ValidateRequestWithHeaders(server, RequestPath, headers, expectedRequestTelemetry);

                Assert.Equal("4bf92f3577b34da6a3ce929d0e0e4736", actualRequest.tags["ai.operation.id"]);
                Assert.StartsWith("|4bf92f3577b34da6a3ce929d0e0e4736.00f067aa0ba902b7.", actualRequest.tags["ai.operation.parentId"]);
                Assert.Equal("v1", actualRequest.data.baseData.properties["k1"]);
                Assert.Equal("v2", actualRequest.data.baseData.properties["k2"]);
            }
        }