public void ProcessEvent_Exception_NothingStarted()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            // No Exception
            obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request });
            var span = GetCurrentSpan(tracing.Tracer);

            Assert.Null(span);
#if NETCOREAPP3_1
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out var context));
#else
            Assert.DoesNotContain(request.Options, o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY);
#endif

            obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request, Exception = new Exception() });
            span = GetCurrentSpan(tracing.Tracer);
            Assert.Null(span);
#if NETCOREAPP3_1
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out context));
#else
            Assert.DoesNotContain(request.Options, o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY);
#endif
        }
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientCoreObserver(options, stats, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, null);

            var act = new Activity("Test");

            act.Start();
            observer.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, null);
            observer.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, null);
            act.Stop();
        }
        public void ProcessEvent_Exception_PreviousStarted()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request });

            var span = GetCurrentSpan(tracing.Tracer);

            Assert.NotNull(span);
#if NETCOREAPP3_1
            Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context));
            var contextSpan = context as TelemetrySpan;
#else
            var contextSpan = request.Options.FirstOrDefault(o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY).Value;
            Assert.NotNull(contextSpan);
#endif
            Assert.Equal(span, contextSpan);
            Assert.Equal("httpclient:/", span.ToSpanData().Name);

            var exception = new Exception("Help");
            obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request, Exception = exception });

            var response = GetHttpResponseMessage(HttpStatusCode.InternalServerError);
            obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request, Response = response, RequestTaskStatus = TaskStatus.RanToCompletion });
            Assert.True(span.HasEnded());
#if NETCOREAPP3_1
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out context));
#else
            Assert.DoesNotContain(request.Options, o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY);
#endif

            var spanData   = span.ToSpanData();
            var attributes = spanData.Attributes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
            Assert.Equal(SpanKind.Client, spanData.Kind);
            Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]);
            Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]);
            Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]);
            Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]);
            Assert.Equal("Header", attributes["http.request.TEST"]);
            Assert.Equal("Header", attributes["http.response.TEST"]);
            Assert.Equal((long)HttpStatusCode.InternalServerError, attributes[SpanAttributeConstants.HttpStatusCodeKey]);
            Assert.Equal(obs.GetExceptionMessage(exception), attributes[SpanAttributeConstants.ErrorKey]);
            Assert.Equal(obs.GetExceptionStackTrace(exception), attributes[SpanAttributeConstants.ErrorStackTrace]);
        }
        public void ProcessEvent_IgnoresUnknownEvent()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);

            obs.ProcessEvent(string.Empty, new { Request = GetHttpRequestMessage() });
        }
        public void ProcessEvent_IgnoresNulls()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);

            obs.ProcessEvent(null, null);
        }
Exemplo n.º 6
0
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new HttpClientCoreObserver(options, stats, tags, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, null);

            Activity act = new Activity("Test");

            act.Start();
            observer.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, null);
            observer.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, null);
            act.Stop();
        }
Exemplo n.º 7
0
        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());
        }
Exemplo n.º 8
0
        public void ProcessEvent_Exception_PreviousStarted()
        {
            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 = AsyncLocalContext.CurrentSpan as Span;

            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.Null(spanContext.Previous);
            Assert.Equal("httpclient:/", span.Name);

            var exception = new Exception("Help");

            obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request, Exception = exception });

            var response = GetHttpResponseMessage(HttpStatusCode.InternalServerError);

            obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request, Response = response, RequestTaskStatus = TaskStatus.RanToCompletion });
            Assert.True(span.HasEnded);
            Assert.Null(AsyncLocalContext.CurrentSpan);
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object ctx));

            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"]);
            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]);
        }
Exemplo n.º 9
0
        public void ProcessEvent_Exception_NothingStarted()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            // No Exception
            obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request });
            Span span = GetCurrentSpan(tracing.Tracer);

            Assert.Null(span);
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context));

            obs.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, new { Request = request, Exception = new Exception() });
            span = GetCurrentSpan(tracing.Tracer);
            Assert.Null(span);
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out context));
        }
Exemplo n.º 10
0
        public void ProcessEvent_Start()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request });

            var span = GetCurrentSpan(tracing.Tracer);

            Assert.NotNull(span);
#if NETCOREAPP3_1
            Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context));
            var contextSpan = context as TelemetrySpan;
#else
            var contextSpan = request.Options.FirstOrDefault(o => o.Key == HttpClientCoreObserver.SPANCONTEXT_KEY).Value;
            Assert.NotNull(contextSpan);
#endif

            Assert.NotNull(contextSpan);
            Assert.Equal(span, contextSpan);
            Assert.Equal("httpclient:/", span.ToSpanData().Name);

            Assert.True(request.Headers.Contains(B3Constants.XB3TraceId));
            Assert.True(request.Headers.Contains(B3Constants.XB3SpanId));
            Assert.False(request.Headers.Contains(B3Constants.XB3ParentSpanId));

            var spanId = request.Headers.GetValues(B3Constants.XB3SpanId).Single();
            Assert.Equal(span.Context.SpanId.ToHexString(), spanId);
            var spanData = span.ToSpanData();

            var traceId  = request.Headers.GetValues(B3Constants.XB3TraceId).Single();
            var expected = GetTraceId(opts, spanData.Context);
            Assert.Equal(expected, traceId);

            if (span.IsRecording)
            {
                Assert.True(request.Headers.Contains(B3Constants.XB3Sampled));
            }

            Assert.False(span.HasEnded());

            spanData = span.ToSpanData();
            var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value);
            Assert.Equal(SpanKind.Client, spanData.Kind);
            Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]);
            Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]);
            Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]);
            Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]);
            Assert.Equal("Header", attributes["http.request.TEST"]);
        }
Exemplo n.º 11
0
        public void ProcessEvent_Stop_NothingStarted()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request });
            var span = GetCurrentSpan(tracing.Tracer);

            Assert.Null(span);
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context));
        }
Exemplo n.º 12
0
        public void ProcessEvent_Stop_PreviousStarted()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientCoreObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request });

            var span = GetCurrentSpan(tracing.Tracer);

            Assert.NotNull(span);
            Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context));

            var contextSpan = context as TelemetrySpan;

            Assert.NotNull(contextSpan);
            Assert.Equal(span, contextSpan);
            Assert.Equal("httpclient:/", span.ToSpanData().Name);

            var response = GetHttpResponseMessage(HttpStatusCode.OK);

            obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request, Response = response, RequestTaskStatus = TaskStatus.RanToCompletion });
            Assert.True(span.HasEnded());
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object ctx));

            var spanData   = span.ToSpanData();
            var attributes = spanData.Attributes.ToDictionary(kv => kv.Key, kv => kv.Value);

            Assert.Equal(SpanKind.Client, spanData.Kind);
            Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]);
            Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]);
            Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]);
            Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]);
            Assert.Equal("Header", attributes["http.request.TEST"]);
            Assert.Equal("Header", attributes["http.response.TEST"]);
            Assert.Equal((long)HttpStatusCode.OK, attributes[SpanAttributeConstants.HttpStatusCodeKey]);
        }
Exemplo n.º 13
0
        public void ProcessEvent_Stop_PreviousStarted()
        {
            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);

            var response = GetHttpResponseMessage(HttpStatusCode.OK);

            obs.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, new { Request = request, Response = response, RequestTaskStatus = TaskStatus.RanToCompletion });
            Assert.True(span.HasEnded);
            Assert.False(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object ctx));

            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"]);
            Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.response.TEST"]);
            Assert.Equal(AttributeValue.LongAttributeValue((long)HttpStatusCode.OK), attributes[SpanAttributeConstants.HttpStatusCodeKey]);
        }
Exemplo n.º 14
0
        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"]);
        }