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(B3Format.X_B3_TRACE_ID, new StringValues(TRACE_ID_BASE16)); request.Request.Headers.Add(B3Format.X_B3_SPAN_ID, new StringValues(SPAN_ID_BASE16)); request.Request.Headers.Add(B3Format.X_B3_SAMPLED, 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(B3Format.X_B3_TRACE_ID, new StringValues(TRACE_ID_BASE16_EIGHT_BYTES)); request.Request.Headers.Add(B3Format.X_B3_SPAN_ID, new StringValues(SPAN_ID_BASE16)); request.Request.Headers.Add(B3Format.X_B3_SAMPLED, 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(); 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 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 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 HandleStopEvent_RecordsStats() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new AspNetCoreHostingObserver(options, stats, tags, null); var context = GetHttpRequestMessage(); var exceptionHandlerFeature = new ExceptionHandlerFeature() { Error = new ArgumentNullException() }; context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature); context.Response.StatusCode = 500; Activity act = new Activity("Test"); act.Start(); Thread.Sleep(1000); act.SetEndTime(DateTime.UtcNow); observer.HandleStopEvent(act, context); observer.HandleStopEvent(act, context); var reqData = stats.ViewManager.GetView(ViewName.Create("http.server.request.time")); var aggData1 = reqData.SumWithTags() as IDistributionData; Assert.Equal(2, aggData1.Count); Assert.True(aggData1.Mean > 1000.00); Assert.True(aggData1.Max > 1000.00); act.Stop(); }
public void ProcessEvent_IgnoresNulls() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); obs.ProcessEvent(null, null); }
public void ProcessEvent_IgnoresUnknownEvent() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); obs.ProcessEvent(string.Empty, new { HttpContext = GetHttpRequestMessage() }); }
public void Constructor_RegistersExpectedViews() { var options = new MetricsOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new AspNetCoreHostingObserver(options, stats, tags, null); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.server.requests"))); }
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_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_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_IgnoresNulls() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new AspNetCoreHostingObserver(options, stats, null); observer.ProcessEvent("foobar", null); observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null); var act = new Activity("Test"); act.Start(); observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null); act.Stop(); }
public void ProcessEvent_IgnoresNulls() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new AspNetCoreHostingObserver(options, stats, tags, null); observer.ProcessEvent("foobar", null); observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null); Activity act = new Activity("Test"); act.Start(); observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null); act.Stop(); }
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(); 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 ProcessEvent_BeforeAction() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var hostobs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); hostobs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); Span hostspan = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(hostspan); var hostSpanContext = hostobs.Active; Assert.NotNull(hostSpanContext); Assert.Equal(hostspan, hostSpanContext.Active); Assert.Null(hostSpanContext.Previous); var actionobs = new AspNetCoreMvcActionObserver(opts, tracing); var descriptor = GetActionDescriptor(); actionobs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_BEFOREACTION_EVENT, new { httpContext = request, actionDescriptor = descriptor }); Span actionspan = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(actionspan); Assert.NotEqual(hostspan, actionspan); var actionSpanContext = actionobs.Active; Assert.NotNull(actionSpanContext); Assert.Equal(actionspan, actionSpanContext.Active); Assert.Equal(actionspan.ParentSpanId, hostspan.Context.SpanId); Assert.NotNull(actionSpanContext.Previous); Assert.Equal(hostspan, actionSpanContext.Previous); Assert.Equal("action:" + descriptor.ControllerName + "/" + descriptor.ActionName, actionspan.Name); var actionSpanData = actionspan.ToSpanData(); var actionAttributes = actionSpanData.Attributes.AttributeMap; Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ServerSpanKind), actionAttributes[SpanAttributeConstants.SpanKindKey]); Assert.Equal(AttributeValue.StringAttributeValue(descriptor.ControllerTypeInfo.FullName), actionAttributes[SpanAttributeConstants.MvcControllerClass]); Assert.Equal(AttributeValue.StringAttributeValue(descriptor.MethodInfo.ToString()), actionAttributes[SpanAttributeConstants.MvcControllerMethod]); }
public void ShouldIgnore_ReturnsExpected() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); Assert.True(obs.ShouldIgnoreRequest("/cloudfoundryapplication/info")); Assert.True(obs.ShouldIgnoreRequest("/cloudfoundryapplication/health")); Assert.True(obs.ShouldIgnoreRequest("/foo/bar/image.png")); Assert.True(obs.ShouldIgnoreRequest("/foo/bar/image.gif")); Assert.True(obs.ShouldIgnoreRequest("/favicon.ico")); Assert.True(obs.ShouldIgnoreRequest("/foo.js")); Assert.True(obs.ShouldIgnoreRequest("/foo.css")); Assert.True(obs.ShouldIgnoreRequest("/javascript/foo.js")); Assert.True(obs.ShouldIgnoreRequest("/css/foo.css")); Assert.True(obs.ShouldIgnoreRequest("/foo.html")); Assert.True(obs.ShouldIgnoreRequest("/html/foo.html")); Assert.False(obs.ShouldIgnoreRequest("/api/test")); Assert.False(obs.ShouldIgnoreRequest("/v2/apps")); }
public void ProcessEvent_BeforeAction() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var hostobs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); hostobs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); var hostspan = GetCurrentSpan(tracing.Tracer); Assert.NotNull(hostspan); var hostSpanContext = hostobs.Active; Assert.NotNull(hostSpanContext); Assert.Equal(hostspan, hostSpanContext); var actionobs = new AspNetCoreMvcActionObserver(opts, tracing); var descriptor = GetActionDescriptor(); actionobs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_BEFOREACTION_EVENT, new { httpContext = request, actionDescriptor = descriptor }); var actionspan = GetCurrentSpan(tracing.Tracer); Assert.NotNull(actionspan); Assert.NotEqual(hostspan, actionspan); var actionSpanContext = actionobs.Active; Assert.NotNull(actionSpanContext); Assert.Equal(actionspan, actionSpanContext); // Assert.Equal(actionspan.ParentSpanId, hostspan.Context.SpanId); Assert.Equal("action:" + descriptor.ControllerName + "/" + descriptor.ActionName, actionspan.ToSpanData().Name); var actionSpanData = actionspan.ToSpanData(); var actionAttributes = actionSpanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Server, actionSpanData.Kind); Assert.Equal(descriptor.ControllerTypeInfo.FullName, actionAttributes[SpanAttributeConstants.MvcControllerClass]); Assert.Equal(descriptor.MethodInfo.ToString(), actionAttributes[SpanAttributeConstants.MvcControllerMethod]); }
public void ShouldIgnore_ReturnsExpected() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var obs = new AspNetCoreHostingObserver(options, stats, tags, null); Assert.True(obs.ShouldIgnoreRequest("/cloudfoundryapplication/info")); Assert.True(obs.ShouldIgnoreRequest("/cloudfoundryapplication/health")); Assert.True(obs.ShouldIgnoreRequest("/foo/bar/image.png")); Assert.True(obs.ShouldIgnoreRequest("/foo/bar/image.gif")); Assert.True(obs.ShouldIgnoreRequest("/favicon.ico")); Assert.True(obs.ShouldIgnoreRequest("/foo.js")); Assert.True(obs.ShouldIgnoreRequest("/foo.css")); Assert.True(obs.ShouldIgnoreRequest("/javascript/foo.js")); Assert.True(obs.ShouldIgnoreRequest("/css/foo.css")); Assert.True(obs.ShouldIgnoreRequest("/foo.html")); Assert.True(obs.ShouldIgnoreRequest("/html/foo.html")); Assert.False(obs.ShouldIgnoreRequest("/api/test")); Assert.False(obs.ShouldIgnoreRequest("/v2/apps")); }
public void GetException_ReturnsExpected() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new AspNetCoreHostingObserver(options, stats, null); var context = GetHttpRequestMessage(); var exception = observer.GetException(context); Assert.Equal("None", exception); context = GetHttpRequestMessage(); var exceptionHandlerFeature = new ExceptionHandlerFeature() { Error = new ArgumentNullException() }; context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature); exception = observer.GetException(context); Assert.Equal("ArgumentNullException", exception); }
public void ProcessEvent_Stop_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 = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(span); var spanContext = obs.Active; Assert.NotNull(spanContext); Assert.Equal(span, spanContext.Active); Assert.Null(spanContext.Previous); Assert.Equal("http:/", span.Name); request.Response.StatusCode = (int)HttpStatusCode.OK; obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { HttpContext = request }); Assert.True(span.HasEnded); Assert.Null(AsyncLocalContext.CurrentSpan); Assert.Null(obs.Active); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.AttributeMap; Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ServerSpanKind), 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: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.OK), attributes[SpanAttributeConstants.HttpStatusCodeKey]); }
public void ParentSpanContinuedFromContext() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage("GET", "/foo"); 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")); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); var span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); var contextSpan = obs.Active; Assert.NotNull(contextSpan); Assert.Equal(span, contextSpan); Assert.Equal("http:/foo", span.ToSpanData().Name); Assert.False(span.HasEnded()); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SPAN_ID_BASE16, spanData.ParentSpanId.ToHexString()); Assert.Equal(TRACE_ID_BASE16, spanData.Context.TraceId.ToHexString()); Assert.Equal(SpanKind.Server, spanData.Kind); Assert.Equal("http://localhost:5555/foo", attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/foo", attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", attributes["http.request.TEST"]); }
public void ProcessEvent_Exception_NothingStarted() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_EXCEPTION_EVENT, new { httpContext = request, exception = new Exception() }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); obs.ProcessEvent(AspNetCoreHostingObserver.DIAG_HANDLEDEXCEPTION_EVENT, new { httpContext = request, exception = new Exception() }); span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); obs.ProcessEvent(AspNetCoreHostingObserver.DIAG_UNHANDLEDEXCEPTION_EVENT, new { httpContext = request, exception = new Exception() }); span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void ProcessEvent_Exception_NoArgs() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); // Null context, Exception obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_EXCEPTION_EVENT, new { }); var span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); obs.ProcessEvent(AspNetCoreHostingObserver.DIAG_HANDLEDEXCEPTION_EVENT, new { }); span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); obs.ProcessEvent(AspNetCoreHostingObserver.DIAG_UNHANDLEDEXCEPTION_EVENT, new { }); span = GetCurrentSpan(tracing.Tracer); Assert.Null(span); Assert.Null(obs.Active); }
public void GetLabelSets_ReturnsExpected() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new AspNetCoreHostingObserver(options, stats, null); var context = GetHttpRequestMessage(); var exceptionHandlerFeature = new ExceptionHandlerFeature() { Error = new ArgumentNullException() }; context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature); context.Response.StatusCode = 404; var tagContext = observer.GetLabelSets(context); var tagValues = tagContext.ToList(); tagValues.Contains(KeyValuePair.Create("exception", "ArgumentNullException")); tagValues.Contains(KeyValuePair.Create("uri", "/foobar")); tagValues.Contains(KeyValuePair.Create("status", "404")); tagValues.Contains(KeyValuePair.Create("method", "GET")); }
public void ProcessEvent_Exception_NoArgs() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new AspNetCoreHostingObserver(opts, tracing); // Null context, Exception obs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_EXCEPTION_EVENT, new { }); Span span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.Null(obs.Active); obs.ProcessEvent(AspNetCoreHostingObserver.DIAG_HANDLEDEXCEPTION_EVENT, new { }); span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.Null(obs.Active); obs.ProcessEvent(AspNetCoreHostingObserver.DIAG_UNHANDLEDEXCEPTION_EVENT, new { }); span = AsyncLocalContext.CurrentSpan as Span; Assert.Null(span); Assert.Null(obs.Active); }
public void GetTagContext_ReturnsExpected() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new AspNetCoreHostingObserver(options, stats, tags, null); var context = GetHttpRequestMessage(); var exceptionHandlerFeature = new ExceptionHandlerFeature() { Error = new ArgumentNullException() }; context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature); context.Response.StatusCode = 404; var tagContext = observer.GetTagContext(context); var tagValues = tagContext.ToList(); tagValues.Contains(Tag.Create(TagKey.Create("exception"), TagValue.Create("ArgumentNullException"))); tagValues.Contains(Tag.Create(TagKey.Create("uri"), TagValue.Create("/foobar"))); tagValues.Contains(Tag.Create(TagKey.Create("status"), TagValue.Create("404"))); tagValues.Contains(Tag.Create(TagKey.Create("method"), TagValue.Create("GET"))); }
public void HandleStopEvent_RecordsStats() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new AspNetCoreHostingObserver(options, stats, null); var factory = stats.Factory; var processor = stats.Processor; var context = GetHttpRequestMessage(); var exceptionHandlerFeature = new ExceptionHandlerFeature() { Error = new ArgumentNullException() }; context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature); context.Response.StatusCode = 500; var act = new Activity("Test"); act.Start(); Thread.Sleep(1000); act.SetEndTime(DateTime.UtcNow); observer.HandleStopEvent(act, context); observer.HandleStopEvent(act, context); factory.CollectAllMetrics(); var requestTime = processor.GetMetricByName <double>("http.server.requests.seconds"); Assert.NotNull(requestTime); Assert.Equal(2, requestTime.Count); Assert.True(requestTime.Sum / 2 > 1); Assert.True(requestTime.Max > 1); act.Stop(); }
public void ProcessEvent_AfterView() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var hostobs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); hostobs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); Span hostSpan = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(hostSpan); var hostspanContext = hostobs.Active; Assert.NotNull(hostspanContext); Assert.Equal(hostSpan, hostspanContext.Active); Assert.Null(hostspanContext.Previous); var actionobs = new AspNetCoreMvcActionObserver(opts, tracing); var descriptor = GetActionDescriptor(); actionobs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_BEFOREACTION_EVENT, new { httpContext = request, actionDescriptor = descriptor }); Span actionSpan = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(actionSpan); Assert.NotEqual(hostSpan, actionSpan); var actionspanContext = actionobs.Active; Assert.NotNull(actionspanContext); Assert.Equal(actionSpan, actionspanContext.Active); Assert.Equal(actionSpan.ParentSpanId, hostSpan.Context.SpanId); Assert.NotNull(actionspanContext.Previous); Assert.Equal(hostSpan, actionspanContext.Previous); Assert.Equal("action:" + descriptor.ControllerName + "/" + descriptor.ActionName, actionSpan.Name); var viewobs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); viewobs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_BEFOREVIEW_EVENT, new { viewContext = ctx }); Span viewSpan = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(viewSpan); Assert.NotEqual(hostSpan, viewSpan); Assert.NotEqual(actionSpan, viewSpan); var viewSpanContext = viewobs.Active; Assert.NotNull(viewSpanContext); Assert.Equal(viewSpan, viewSpanContext.Active); Assert.Equal(actionSpan.Context.SpanId, viewSpan.ParentSpanId); Assert.NotNull(viewSpanContext.Previous); Assert.Equal(actionSpan, viewSpanContext.Previous); Assert.Equal("view:" + ctx.View.Path, viewSpan.Name); viewobs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_AFTERVIEW_EVENT, new { }); Assert.True(viewSpan.HasEnded); Assert.NotNull(AsyncLocalContext.CurrentSpan); Assert.Null(viewobs.Active); var viewSpanData = viewSpan.ToSpanData(); var viewAttributes = viewSpanData.Attributes.AttributeMap; Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ServerSpanKind), viewAttributes[SpanAttributeConstants.SpanKindKey]); Assert.Equal(AttributeValue.StringAttributeValue(ctx.View.Path), viewAttributes[SpanAttributeConstants.MvcViewFilePath]); actionobs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_AFTERACTION_EVENT, new { httpContext = request }); Span spanAfter = AsyncLocalContext.CurrentSpan as Span; Assert.NotNull(spanAfter); Assert.Equal(hostSpan, spanAfter); var actionSpanContextAfter = actionobs.Active; Assert.Null(actionSpanContextAfter); Assert.True(actionSpan.HasEnded); var actionSpanData = actionSpan.ToSpanData(); var actionAttributes = actionSpanData.Attributes.AttributeMap; Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ServerSpanKind), actionAttributes[SpanAttributeConstants.SpanKindKey]); Assert.Equal(AttributeValue.StringAttributeValue(descriptor.ControllerTypeInfo.FullName), actionAttributes[SpanAttributeConstants.MvcControllerClass]); Assert.Equal(AttributeValue.StringAttributeValue(descriptor.MethodInfo.ToString()), actionAttributes[SpanAttributeConstants.MvcControllerMethod]); hostobs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { HttpContext = request }); Assert.True(hostSpan.HasEnded); Assert.Null(AsyncLocalContext.CurrentSpan); Assert.Null(hostobs.Active); var hostSpanData = hostSpan.ToSpanData(); var hostAttributes = hostSpanData.Attributes.AttributeMap; Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ServerSpanKind), hostAttributes[SpanAttributeConstants.SpanKindKey]); Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), hostAttributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), hostAttributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal(AttributeValue.StringAttributeValue("localhost:5555"), hostAttributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal(AttributeValue.StringAttributeValue("/"), hostAttributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), hostAttributes["http.request.TEST"]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), hostAttributes["http.response.TEST"]); Assert.Equal(AttributeValue.LongAttributeValue((long)HttpStatusCode.OK), hostAttributes[SpanAttributeConstants.HttpStatusCodeKey]); }
public void ProcessEvent_AfterView() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var hostobs = new AspNetCoreHostingObserver(opts, tracing); var request = GetHttpRequestMessage(); hostobs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_START_EVENT, new { HttpContext = request }); var hostSpan = GetCurrentSpan(tracing.Tracer); Assert.NotNull(hostSpan); var hostspanContext = hostobs.Active; Assert.NotNull(hostspanContext); Assert.Equal(hostSpan, hostspanContext); var actionobs = new AspNetCoreMvcActionObserver(opts, tracing); var descriptor = GetActionDescriptor(); actionobs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_BEFOREACTION_EVENT, new { httpContext = request, actionDescriptor = descriptor }); var actionSpan = GetCurrentSpan(tracing.Tracer); Assert.NotNull(actionSpan); Assert.NotEqual(hostSpan, actionSpan); var actionspanContext = actionobs.Active; Assert.NotNull(actionspanContext); Assert.Equal(actionSpan, actionspanContext); // Assert.Equal(actionSpan.ParentSpanId, hostSpan.Context.SpanId); Assert.Equal("action:" + descriptor.ControllerName + "/" + descriptor.ActionName, actionSpan.ToSpanData().Name); var viewobs = new AspNetCoreMvcViewObserver(opts, tracing); var ctx = GetViewContext(); viewobs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_BEFOREVIEW_EVENT, new { viewContext = ctx }); var viewSpan = GetCurrentSpan(tracing.Tracer); Assert.NotNull(viewSpan); Assert.NotEqual(hostSpan, viewSpan); Assert.NotEqual(actionSpan, viewSpan); var viewSpanContext = viewobs.Active; Assert.NotNull(viewSpanContext); Assert.Equal(viewSpan, viewSpanContext); // Assert.Equal(actionSpan.Context.SpanId, viewSpan.ParentSpanId); TODO: Fix this Assert.Equal("view:" + ctx.View.Path, viewSpan.ToSpanData().Name); viewobs.ProcessEvent(AspNetCoreMvcViewObserver.MVC_AFTERVIEW_EVENT, new { }); Assert.True(viewSpan.HasEnded()); Assert.NotNull(GetCurrentSpan(tracing.Tracer)); Assert.Null(viewobs.Active); var viewSpanData = viewSpan.ToSpanData(); var viewAttributes = viewSpanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Server, viewSpanData.Kind); Assert.Equal(ctx.View.Path, viewAttributes[SpanAttributeConstants.MvcViewFilePath]); actionobs.ProcessEvent(AspNetCoreMvcActionObserver.MVC_AFTERACTION_EVENT, new { httpContext = request }); var spanAfter = GetCurrentSpan(tracing.Tracer); Assert.NotNull(spanAfter); Assert.Equal(hostSpan, spanAfter); var actionSpanContextAfter = actionobs.Active; Assert.Null(actionSpanContextAfter); Assert.True(actionSpan.HasEnded()); var actionSpanData = actionSpan.ToSpanData(); var actionAttributes = actionSpanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Server, actionSpanData.Kind); Assert.Equal(descriptor.ControllerTypeInfo.FullName, actionAttributes[SpanAttributeConstants.MvcControllerClass]); Assert.Equal(descriptor.MethodInfo.ToString(), actionAttributes[SpanAttributeConstants.MvcControllerMethod]); hostobs.ProcessEvent(AspNetCoreHostingObserver.HOSTING_STOP_EVENT, new { HttpContext = request }); Assert.True(hostSpan.HasEnded()); Assert.Null(GetCurrentSpan(tracing.Tracer)); Assert.Null(hostobs.Active); var hostSpanData = hostSpan.ToSpanData(); var hostAttributes = hostSpanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value); Assert.Equal(SpanKind.Server, hostSpanData.Kind); Assert.Equal("http://localhost:5555/", hostAttributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(HttpMethod.Get.ToString(), hostAttributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal("localhost:5555", hostAttributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal("/", hostAttributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal("Header", hostAttributes["http.request.TEST"]); Assert.Equal("Header", hostAttributes["http.response.TEST"]); Assert.Equal((long)HttpStatusCode.OK, hostAttributes[SpanAttributeConstants.HttpStatusCodeKey]); }