Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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"]);
        }
Exemplo n.º 3
0
        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"]);
        }
Exemplo n.º 5
0
        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();
        }
Exemplo n.º 6
0
        public void ProcessEvent_IgnoresNulls()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new AspNetCoreHostingObserver(opts, tracing);

            obs.ProcessEvent(null, null);
        }
Exemplo n.º 7
0
        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() });
        }
Exemplo n.º 8
0
        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")));
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 12
0
        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();
        }
Exemplo n.º 13
0
        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();
        }
Exemplo n.º 14
0
        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]);
        }
Exemplo n.º 17
0
        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"));
        }
Exemplo n.º 18
0
        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]);
        }
Exemplo n.º 19
0
        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"));
        }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
        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"]);
        }
Exemplo n.º 23
0
        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);
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
0
        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"));
        }
Exemplo n.º 26
0
        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);
        }
Exemplo n.º 27
0
        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")));
        }
Exemplo n.º 28
0
        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]);
        }
Exemplo n.º 30
0
        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]);
        }