public void ExtractTraceContext() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(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.ToLowerBase16()); Assert.Equal(SPAN_ID_BASE16, context.SpanId.ToLowerBase16()); 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.ToLowerBase16()); Assert.Equal(SPAN_ID_BASE16, context.SpanId.ToLowerBase16()); Assert.True(context.TraceOptions.IsSampled); }
public void ProcessEvent_Start() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); var spanContext = obs.Active; Assert.NotNull(spanContext); Assert.Equal(span, spanContext.Active); Assert.NotNull(spanContext.ActiveScope); Assert.Equal("http:/", span.Name); Assert.False(span.HasEnded); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.AttributeMap; Assert.Equal(SpanKind.Server, span.Kind); Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal(AttributeValue.StringAttributeValue("localhost:5555"), attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal(AttributeValue.StringAttributeValue("/"), attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.request.TEST"]); }
public void InjectTraceContext() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); tracing.Tracer.SpanBuilder("MySpan").StartScopedSpan(out ISpan 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.Context.SpanId.ToLowerBase16(), spanId); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } }
public void InjectTraceContext() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); var span = tracing.Tracer.SpanBuilder("MySpan").StartSpan() as Span; AsyncLocalContext.CurrentSpan = span; obs.InjectTraceContext(request, null); Assert.NotNull(request.Headers.Get(B3Format.X_B3_TRACE_ID)); Assert.NotNull(request.Headers.Get(B3Format.X_B3_SPAN_ID)); Assert.Null(request.Headers.Get(B3Format.X_B3_PARENT_SPAN_ID)); var spanId = request.Headers.Get(B3Format.X_B3_SPAN_ID); Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId); var traceId = request.Headers.Get(B3Format.X_B3_TRACE_ID); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.NotNull(request.Headers.Get(B3Format.X_B3_SAMPLED)); } }
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", }; ConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(appsettings); TracingOptions opts = new TracingOptions(null, builder.Build()); OpenCensusTracing tracing = new OpenCensusTracing(opts); var processor = new TracingLogProcessor(opts, tracing); var result = processor.Process("InputLogMessage"); Assert.Equal("InputLogMessage", result); }
public void ProcessEvent_IgnoresNulls() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); obs.ProcessEvent(null, null); }
public void ProcessEvent_IgnoresUnknownEvent() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); obs.ProcessEvent(string.Empty, new { HttpContext = GetHttpRequestMessage() }); }
public void ProcessEvent_IgnoresUnknownEvent() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); obs.ProcessEvent(string.Empty, new { viewContext = GetViewContext() }); }
public void ProcessEvent_IgnoresMissingHttpRequestMessage() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); obs.ProcessEvent(string.Empty, new object()); }
public void ProcessEvent_IgnoresNulls() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); obs.ProcessEvent(null, null); }
public void ProcessEvent_IgnoresUnknownEvent() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); obs.ProcessEvent(string.Empty, new { Request = GetHttpRequestMessage() }); }
public void ExtractSpanName() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(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 ExtractViewPath() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); var path = obs.ExtractViewPath(ctx); Assert.Equal(ctx.View.Path, path); }
public void ShouldIgnore_ReturnsExpected() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientDesktopObserver(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_Stop_NoArgs() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_BeforeAction_NoArgs() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcActionObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_BEFOREACTION_EVENT, new { }); Span span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_Stop_NothingStarted() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context)); }
public void ProcessEvent_Stop_NothingStarted() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { HttpContext = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_StopEx_NothingStarted() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(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() }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.False(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext context)); }
public void ProcessEvent_Stop_NoRespose() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, new { Request = request }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.False(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext context)); }
public void ProcessEvent_BeforeView_NoArgs() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); obs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_BEFOREVIEW_EVENT, new { }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.Null(obs.Active); }
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", }; ConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(appsettings); TracingOptions opts = new TracingOptions(null, builder.Build()); OpenCensusTracing tracing = new OpenCensusTracing(opts); var span = tracing.Tracer.SpanBuilder("spanName").StartSpan(); AsyncLocalContext.CurrentSpan = 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.ToLowerBase16(), result); Assert.Contains(span.Context.SpanId.ToLowerBase16(), result); Assert.Contains("foobar", result); var childSpan = tracing.Tracer.SpanBuilderWithExplicitParent("spanName2", span).StartSpan(); AsyncLocalContext.CurrentSpan = childSpan; result = processor.Process("InputLogMessage2"); Assert.Contains("InputLogMessage2", result); Assert.Contains("[", result); Assert.Contains("]", result); Assert.Contains(childSpan.Context.TraceId.ToLowerBase16(), result); Assert.Contains(childSpan.Context.SpanId.ToLowerBase16(), result); Assert.Contains(span.Context.SpanId.ToLowerBase16(), result); Assert.Contains("foobar", result); }
public void ProcessEvent_Start() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context)); HttpClientTracingObserver.SpanContext spanContext = context as HttpClientTracingObserver.SpanContext; Assert.NotNull(spanContext); Assert.Equal(span, spanContext.Active); Assert.NotNull(spanContext.ActiveScope); Assert.Equal("httpclient:/", span.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.ToLowerBase16(), spanId); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } Assert.False(span.HasEnded); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.AttributeMap; Assert.Equal(SpanKind.Client, span.Kind); Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal(AttributeValue.StringAttributeValue("localhost:5555"), attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal(AttributeValue.StringAttributeValue("/"), attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.request.TEST"]); }
public void ProcessEvent_Start() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientDesktopObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientDesktopObserver.START_EVENT, new { Request = request }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(span); Assert.True(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext spanContext)); Assert.NotNull(spanContext); Assert.Equal(span, spanContext.Active); Assert.Null(spanContext.Previous); Assert.Equal("httpclient:/", span.Name); Assert.NotNull(request.Headers.Get(B3Format.X_B3_TRACE_ID)); Assert.NotNull(request.Headers.Get(B3Format.X_B3_SPAN_ID)); Assert.Null(request.Headers.Get(B3Format.X_B3_PARENT_SPAN_ID)); var spanId = request.Headers.Get(B3Format.X_B3_SPAN_ID); Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId); var traceId = request.Headers.Get(B3Format.X_B3_TRACE_ID); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.NotNull(request.Headers.Get(B3Format.X_B3_SAMPLED)); } Assert.False(span.HasEnded); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.AttributeMap; Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ClientSpanKind), attributes[SpanAttributeConstants.SpanKindKey]); Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal(AttributeValue.StringAttributeValue("localhost"), attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal(AttributeValue.StringAttributeValue("/"), attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.request.TEST"]); }
public void ExtractResponseSize() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(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_AfterView_NoBeforeView() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); obs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_AFTERVIEW_EVENT, new { }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); var spanContext = obs.Active; Assert.Null(spanContext); }
public void ProcessEvent_AfterAction_NoBeforeAction() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcActionObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_AFTERACTION_EVENT, new { httpContext = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); var spanContext = obs.Active; Assert.Null(spanContext); }
public void ProcessEvent_BeforeView_NoCurrentSpan() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); obs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_BEFOREVIEW_EVENT, new { viewContext = ctx }); Span span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); var spanContext = obs.Active; Assert.Null(spanContext); }
public void ProcessEvent_Exception_PreviousStarted() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); var spanContext = obs.Active; Assert.NotNull(spanContext); Assert.Equal(span, spanContext.Active); Assert.NotNull(spanContext.ActiveScope); Assert.Equal("http:/", span.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); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.AttributeMap; Assert.Equal(SpanKind.Server, span.Kind); Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal(AttributeValue.StringAttributeValue("localhost:5555"), attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal(AttributeValue.StringAttributeValue("/"), attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.request.TEST"]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.response.TEST"]); Assert.Equal(AttributeValue.LongAttributeValue((long)HttpStatusCode.InternalServerError), attributes[SpanAttributeConstants.HttpStatusCodeKey]); Assert.Equal(AttributeValue.StringAttributeValue(obs.GetExceptionMessage(exception)), attributes[SpanAttributeConstants.ErrorKey]); Assert.Equal(AttributeValue.StringAttributeValue(obs.GetExceptionStackTrace(exception)), attributes[SpanAttributeConstants.ErrorStackTrace]); }
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 OpenCensusTracing(opts); tracing.Tracer.SpanBuilder("spanName").StartScopedSpan(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.ToLowerBase16(), result); Assert.Contains(span.Context.SpanId.ToLowerBase16(), result); Assert.Contains("foobar", result); tracing.Tracer.SpanBuilderWithExplicitParent("spanName2", span).StartScopedSpan(out var childSpan); result = processor.Process("InputLogMessage2"); Assert.Contains("InputLogMessage2", result); Assert.Contains("[", result); Assert.Contains("]", result); Assert.Contains(childSpan.Context.TraceId.ToLowerBase16(), result); Assert.Contains(childSpan.Context.SpanId.ToLowerBase16(), result); Assert.Contains(span.Context.SpanId.ToLowerBase16(), result); Assert.Contains("foobar", result); }