public void InjectTraceContext() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); // tracing.Tracer.SpanBuilder("MySpan").StartScopedSpan(out ISpan span); tracing.Tracer.StartActiveSpan("MySpan", out var span); obs.InjectTraceContext(request, null); Assert.True(request.Headers.Contains(B3Constants.XB3TraceId)); Assert.True(request.Headers.Contains(B3Constants.XB3SpanId)); Assert.False(request.Headers.Contains(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.GetValues(B3Constants.XB3SpanId).Single(); Assert.Equal(span.ToSpanData().Context.SpanId.ToHexString(), spanId); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.IsRecording) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } }
public void ProcessEvent_Exception_NothingStarted() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); // No Exception obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); #if NETCOREAPP3_1 Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out var context)); #else Assert.DoesNotContain(request.Options, o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY); #endif obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request, Exception = new Exception() }); span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); #if NETCOREAPP3_1 Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out context)); #else Assert.DoesNotContain(request.Options, o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY); #endif }
public void ProcessEvent_Start() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); Assert.Equal("http:/", span.ToSpanData().Name); Assert.False(span.HasEnded()); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Server, spanData.Kind); Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", attributes["http.request.TEST"]); }
public void InjectTraceContext() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); tracing.Tracer.StartActiveSpan("MySpan", out var span); obs.InjectTraceContext(request, null); Assert.NotNull(request.Headers.Get(B3Constants.XB3TraceId)); Assert.NotNull(request.Headers.Get(B3Constants.XB3SpanId)); Assert.Null(request.Headers.Get(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.Get(B3Constants.XB3SpanId); Assert.Equal(span.ToSpanData().Context.SpanId.ToHexString(), spanId); var traceId = request.Headers.Get(B3Constants.XB3TraceId); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.IsRecording) { Assert.NotNull(request.Headers.Get(B3Constants.XB3Sampled)); } }
public void BindsCorrectSampler() { var appsettings = new Dictionary <string, string>() { ["management:tracing:name"] = "foobar", ["management:tracing:ingressIgnorePattern"] = "pattern", ["management:tracing:egressIgnorePattern"] = "pattern", ["management:tracing:maxNumberOfAttributes"] = "100", ["management:tracing:maxNumberOfAnnotations"] = "100", ["management:tracing:maxNumberOfMessageEvents"] = "100", ["management:tracing:maxNumberOfLinks"] = "100", ["management:tracing:alwaysSample"] = "true", ["management:tracing:neverSample"] = "true", ["management:tracing:useShortTraceIds"] = "true", }; var builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(appsettings); var opts = new TracingOptions(null, builder.Build()); var tracing = new OpenTelemetryTracing(opts, builder => builder.SetSampler(new TestSampler())); Assert.Throws <TestSamplerException>( () => tracing.Tracer.StartActiveSpan("mySpan", out var span)); }
public void ExtractTraceContext() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); request.Request.Headers.Add(B3Constants.XB3TraceId, new StringValues(TRACE_ID_BASE16)); request.Request.Headers.Add(B3Constants.XB3SpanId, new StringValues(SPAN_ID_BASE16)); request.Request.Headers.Add(B3Constants.XB3Sampled, new StringValues("1")); var context = obs.ExtractTraceContext(request); Assert.Equal(TRACE_ID_BASE16, context.TraceId.ToHexString()); Assert.Equal(SPAN_ID_BASE16, context.SpanId.ToHexString()); Assert.True(context.TraceOptions.IsSampled()); request = GetHttpRequestMessage(); request.Request.Headers.Add(B3Constants.XB3TraceId, new StringValues(TRACE_ID_BASE16_EIGHT_BYTES)); request.Request.Headers.Add(B3Constants.XB3SpanId, new StringValues(SPAN_ID_BASE16)); request.Request.Headers.Add(B3Constants.XB3Sampled, new StringValues("1")); context = obs.ExtractTraceContext(request); Assert.Equal("0000000000000000" + TRACE_ID_BASE16_EIGHT_BYTES, context.TraceId.ToHexString()); Assert.Equal(SPAN_ID_BASE16, context.SpanId.ToHexString()); Assert.True(context.TraceOptions.IsSampled()); }
public void Process_NoCurrentSpan_DoesNothing() { var appsettings = new Dictionary <string, string>() { ["management:tracing:name"] = "foobar", ["management:tracing:ingressIgnorePattern"] = "pattern", ["management:tracing:egressIgnorePattern"] = "pattern", ["management:tracing:maxNumberOfAttributes"] = "100", ["management:tracing:maxNumberOfAnnotations"] = "100", ["management:tracing:maxNumberOfMessageEvents"] = "100", ["management:tracing:maxNumberOfLinks"] = "100", ["management:tracing:alwaysSample"] = "true", ["management:tracing:neverSample"] = "true", ["management:tracing:useShortTraceIds"] = "true", }; var builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(appsettings); var opts = new TracingOptions(null, builder.Build()); var tracing = new OpenTelemetryTracing(opts); var processor = new TracingLogProcessor(opts, tracing); var result = processor.Process("InputLogMessage"); Assert.Equal("InputLogMessage", result); }
public void ProcessEvent_IgnoresUnknownEvent() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); obs.ProcessEvent(string.Empty, new { Request = GetHttpRequestMessage() }); }
public void ProcessEvent_IgnoresMissingHttpRequestMessage() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); obs.ProcessEvent(string.Empty, new object()); }
public void ProcessEvent_IgnoresUnknownEvent() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); obs.ProcessEvent(string.Empty, new { viewContext = GetViewContext() }); }
public void ProcessEvent_IgnoresNulls() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); obs.ProcessEvent(null, null); }
public void BindsConfigurationCorrectly() { var appsettings = new Dictionary <string, string>() { ["management:tracing:name"] = "foobar", ["management:tracing:ingressIgnorePattern"] = "pattern", ["management:tracing:egressIgnorePattern"] = "pattern", ["management:tracing:maxNumberOfAttributes"] = "100", ["management:tracing:maxNumberOfAnnotations"] = "100", ["management:tracing:maxNumberOfMessageEvents"] = "100", ["management:tracing:maxNumberOfLinks"] = "100", ["management:tracing:alwaysSample"] = "true", ["management:tracing:neverSample"] = "true", ["management:tracing:useShortTraceIds"] = "true", }; var builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(appsettings); var opts = new TracingOptions(null, builder.Build()); var tracing = new OpenTelemetryTracing(opts); Assert.NotNull(tracing.Tracer); Assert.NotNull(tracing.TracerConfiguration); var p = tracing.TracerConfiguration; Assert.Equal(100, p.MaxNumberOfAttributes); Assert.Equal(100, p.MaxNumberOfLinks); Assert.Equal(100, p.MaxNumberOfEvents); appsettings = new Dictionary <string, string>() { ["management:tracing:name"] = "foobar", ["management:tracing:ingressIgnorePattern"] = "pattern", ["management:tracing:egressIgnorePattern"] = "pattern", ["management:tracing:maxNumberOfAttributes"] = "100", ["management:tracing:maxNumberOfAnnotations"] = "100", ["management:tracing:maxNumberOfMessageEvents"] = "100", ["management:tracing:maxNumberOfLinks"] = "100", ["management:tracing:alwaysSample"] = "true", ["management:tracing:useShortTraceIds"] = "true", }; builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(appsettings); opts = new TracingOptions(null, builder.Build()); tracing = new OpenTelemetryTracing(opts); Assert.NotNull(tracing.Tracer); Assert.NotNull(tracing.TracerConfiguration); p = tracing.TracerConfiguration; Assert.Equal(100, p.MaxNumberOfAttributes); Assert.Equal(100, p.MaxNumberOfLinks); Assert.Equal(100, p.MaxNumberOfEvents); Assert.IsType <AlwaysOnSampler>(tracing.ConfiguredSampler); }
public void ExtractViewPath() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); var path = obs.ExtractViewPath(ctx); Assert.Equal(ctx.View.Path, path); }
public void ExtractSpanName() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); var spanName = obs.ExtractSpanName(ctx); Assert.Equal("view:" + ctx.View.Path, spanName); }
public void ShouldIgnore_ReturnsExpected() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); Assert.True(obs.ShouldIgnoreRequest("/api/v2/spans")); Assert.True(obs.ShouldIgnoreRequest("/v2/apps/foobar/permissions")); Assert.True(obs.ShouldIgnoreRequest("/v2/apps/barfoo/permissions")); Assert.False(obs.ShouldIgnoreRequest("/api/test")); Assert.False(obs.ShouldIgnoreRequest("/v2/apps")); }
public void ProcessEvent_Start() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); #if NETCOREAPP3_1 Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context)); var contextSpan = context as TelemetrySpan; #else var contextSpan = request.Options.FirstOrDefault(o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY).Value; Assert.NotNull(contextSpan); #endif Assert.NotNull(contextSpan); Assert.Equal(span, contextSpan); Assert.Equal("httpclient:/", span.ToSpanData().Name); Assert.True(request.Headers.Contains(B3Constants.XB3TraceId)); Assert.True(request.Headers.Contains(B3Constants.XB3SpanId)); Assert.False(request.Headers.Contains(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.GetValues(B3Constants.XB3SpanId).Single(); Assert.Equal(span.Context.SpanId.ToHexString(), spanId); var spanData = span.ToSpanData(); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, spanData.Context); Assert.Equal(expected, traceId); if (span.IsRecording) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } Assert.False(span.HasEnded()); spanData = span.ToSpanData(); var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Client, spanData.Kind); Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", attributes["http.request.TEST"]); }
public void ProcessEvent_StopEx_NothingStarted() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, new { Request = request, StatusCode = HttpStatusCode.OK, Headers = new WebHeaderCollection() }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.False(obs.Pending.TryGetValue(request, out var context)); }
public void ProcessEvent_Stop_NoArgs() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_Stop_NoRespose() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, new { Request = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.False(obs.Pending.TryGetValue(request, out var context)); }
public void ProcessEvent_BeforeView_NoArgs() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); obs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_BEFOREVIEW_EVENT, new { }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_Stop_NothingStarted() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context)); }
public void ProcessEvent_BeforeAction_NoArgs() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcActionObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_BEFOREACTION_EVENT, new { }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_AfterView_NoBeforeView() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); obs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_AFTERVIEW_EVENT, new { }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); var spanContext = obs.Active; Assert.Null(spanContext); }
public void ExtractResponseSize() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); request.Response.Body.WriteByte(1); request.Response.Body.WriteByte(2); var result = obs.ExtractResponseSize(request); Assert.NotNull(result); Assert.Equal(2, result.Value); }
public void ProcessEvent_Exception_PreviousStarted() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); #if NETCOREAPP3_1 Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context)); var contextSpan = context as TelemetrySpan; #else var contextSpan = request.Options.FirstOrDefault(o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY).Value; Assert.NotNull(contextSpan); #endif Assert.Equal(span, contextSpan); Assert.Equal("httpclient:/", span.ToSpanData().Name); var exception = new Exception("Help"); obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request, Exception = exception }); var response = GetHttpResponseMessage(HttpStatusCode.InternalServerError); obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request, Response = response, RequestTaskStatus = TaskStatus.RanToCompletion }); Assert.True(span.HasEnded()); #if NETCOREAPP3_1 Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out context)); #else Assert.DoesNotContain(request.Options, o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY); #endif var spanData = span.ToSpanData(); var attributes = spanData.Attributes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); Assert.Equal(SpanKind.Client, spanData.Kind); Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", attributes["http.request.TEST"]); Assert.Equal("Header", attributes["http.response.TEST"]); Assert.Equal((long)HttpStatusCode.InternalServerError, attributes[SpanAttributeConstants.HttpStatusCodeKey]); Assert.Equal(obs.GetExceptionMessage(exception), attributes[SpanAttributeConstants.ErrorKey]); Assert.Equal(obs.GetExceptionStackTrace(exception), attributes[SpanAttributeConstants.ErrorStackTrace]); }
public void ProcessEvent_Start() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientDesktopObserver.START_EVENT, new { Request = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); Assert.True(obs.Pending.TryGetValue(request, out var pendingSpan)); Assert.NotNull(pendingSpan); Assert.Equal(span, pendingSpan); Assert.Equal("httpclient:/", span.ToSpanData().Name); Assert.NotNull(request.Headers.Get(B3Constants.XB3TraceId)); Assert.NotNull(request.Headers.Get(B3Constants.XB3SpanId)); Assert.Null(request.Headers.Get(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.Get(B3Constants.XB3SpanId); Assert.Equal(span.Context.SpanId.ToHexString(), spanId); var traceId = request.Headers.Get(B3Constants.XB3TraceId); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.IsRecording) { Assert.NotNull(request.Headers.Get(B3Constants.XB3Sampled)); } Assert.False(span.HasEnded()); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Client, spanData.Kind); Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", attributes["http.request.TEST"]); }
public void InitializedWithDefaults() { var builder = new ConfigurationBuilder(); var opts = new TracingOptions(null, builder.Build()); var tracing = new OpenTelemetryTracing(opts); Assert.NotNull(tracing.Tracer); Assert.NotNull(tracing.TracerConfiguration); var p = tracing.TracerConfiguration; Assert.Equal(32, p.MaxNumberOfAttributes); Assert.Equal(32, p.MaxNumberOfLinks); Assert.Equal(128, p.MaxNumberOfEvents); Assert.NotEqual(tracing.ConfiguredSampler, new AlwaysOnSampler()); Assert.NotEqual(tracing.ConfiguredSampler, new AlwaysOffSampler()); }
public void Process_CurrentSpan_ReturnsExpected() { var appsettings = new Dictionary <string, string>() { ["management:tracing:name"] = "foobar", ["management:tracing:ingressIgnorePattern"] = "pattern", ["management:tracing:egressIgnorePattern"] = "pattern", ["management:tracing:maxNumberOfAttributes"] = "100", ["management:tracing:maxNumberOfAnnotations"] = "100", ["management:tracing:maxNumberOfMessageEvents"] = "100", ["management:tracing:maxNumberOfLinks"] = "100", ["management:tracing:alwaysSample"] = "true", ["management:tracing:neverSample"] = "false", ["management:tracing:useShortTraceIds"] = "false", }; var config = TestHelpers.GetConfigurationFromDictionary(appsettings); var opts = new TracingOptions(new ApplicationInstanceInfo(config), config); var tracing = new OpenTelemetryTracing(opts); tracing.Tracer.StartActiveSpan("spanName", out var span); var processor = new TracingLogProcessor(opts, tracing); var result = processor.Process("InputLogMessage"); Assert.Contains("InputLogMessage", result); Assert.Contains("[", result); Assert.Contains("]", result); Assert.Contains(span.Context.TraceId.ToHexString(), result); Assert.Contains(span.Context.SpanId.ToHexString(), result); Assert.Contains("foobar", result); tracing.Tracer.StartActiveSpan("spanName2", span, out var childSpan); result = processor.Process("InputLogMessage2"); Assert.Contains("InputLogMessage2", result); Assert.Contains("[", result); Assert.Contains("]", result); Assert.Contains(childSpan.Context.TraceId.ToHexString(), result); Assert.Contains(childSpan.Context.SpanId.ToHexString(), result); // Assert.Contains(span.Context.SpanId.ToHexString(), result); TODO: ParentID not supported Assert.Contains("foobar", result); }
public void ProcessEvent_AfterAction_NoBeforeAction() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreMvcActionObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_AFTERACTION_EVENT, new { httpContext = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); var spanContext = obs.Active; Assert.Null(spanContext); }
public void ProcessEvent_Exception_PreviousStarted() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); var spanData = span.ToSpanData(); Assert.Equal("http:/", spanData.Name); var exception = new Exception("Help"); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_EXCEPTION_EVENT, new { httpContext = request, exception = exception }); request.Response.StatusCode = (int)HttpStatusCode.InternalServerError; obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { HttpContext = request }); Assert.True(span.HasEnded()); Assert.Null(GetCurrentSpan(tracing.Tracer)); Assert.Null(obs.Active); spanData = span.ToSpanData(); var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Server, spanData.Kind); Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", attributes["http.request.TEST"]); Assert.Equal("Header", attributes["http.response.TEST"]); Assert.Equal((long)HttpStatusCode.InternalServerError, attributes[SpanAttributeConstants.HttpStatusCodeKey]); Assert.Equal(obs.GetExceptionMessage(exception), attributes[SpanAttributeConstants.ErrorKey]); Assert.Equal(obs.GetExceptionStackTrace(exception), attributes[SpanAttributeConstants.ErrorStackTrace]); }