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"]); } }
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); }
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"]); } }