public void InjectTraceContext()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            var span = tracing.Tracer.SpanBuilder("MySpan").StartSpan() as Span;

            AsyncLocalContext.CurrentSpan = span;

            obs.InjectTraceContext(request, null);

            Assert.NotNull(request.Headers.Get(B3Format.X_B3_TRACE_ID));
            Assert.NotNull(request.Headers.Get(B3Format.X_B3_SPAN_ID));
            Assert.Null(request.Headers.Get(B3Format.X_B3_PARENT_SPAN_ID));

            var spanId = request.Headers.Get(B3Format.X_B3_SPAN_ID);

            Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId);

            var traceId  = request.Headers.Get(B3Format.X_B3_TRACE_ID);
            var expected = GetTraceId(opts, span.Context);

            Assert.Equal(expected, traceId);

            if (span.Context.TraceOptions.IsSampled)
            {
                Assert.NotNull(request.Headers.Get(B3Format.X_B3_SAMPLED));
            }
        }
コード例 #2
0
        public void HandleStopEvent_RecordsStats()
        {
            var options   = new MetricsObserverOptions();
            var stats     = new TestOpenTelemetryMetrics();
            var observer  = new HttpClientDesktopObserver(options, stats, null);
            var factory   = stats.Factory;
            var processor = stats.Processor;

            var req = GetHttpRequestMessage();

            Activity act = new Activity("Test");

            act.Start();
            Thread.Sleep(1000);
            act.SetEndTime(DateTime.UtcNow);

            observer.HandleStopEvent(act, req, HttpStatusCode.InternalServerError);
            observer.HandleStopEvent(act, req, HttpStatusCode.OK);

            factory.CollectAllMetrics();

            var requestTime = processor.GetMetricByName <double>("http.desktop.client.request.time");

            Assert.NotNull(requestTime);
            Assert.InRange(requestTime.Min, 950.0, 1500.0);
            Assert.InRange(requestTime.Max, 950.0, 1500.0);

            var requestCount = processor.GetMetricByName <long>("http.desktop.client.request.count");

            Assert.NotNull(requestCount);
            Assert.Equal(2, requestCount.Sum);

            act.Stop();
        }
コード例 #3
0
        public void InjectTraceContext()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            tracing.Tracer.SpanBuilder("MySpan").StartScopedSpan(out ISpan span);

            obs.InjectTraceContext(request, null);

            Assert.NotNull(request.Headers.Get(B3Constants.XB3TraceId));
            Assert.NotNull(request.Headers.Get(B3Constants.XB3SpanId));
            Assert.Null(request.Headers.Get(B3Constants.XB3ParentSpanId));

            var spanId = request.Headers.Get(B3Constants.XB3SpanId);

            Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId);

            var traceId  = request.Headers.Get(B3Constants.XB3TraceId);
            var expected = GetTraceId(opts, span.Context);

            Assert.Equal(expected, traceId);

            if (span.Context.TraceOptions.IsSampled)
            {
                Assert.NotNull(request.Headers.Get(B3Constants.XB3Sampled));
            }
        }
コード例 #4
0
        public void InjectTraceContext()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            tracing.Tracer.StartActiveSpan("MySpan", out var span);

            obs.InjectTraceContext(request, null);

            Assert.NotNull(request.Headers.Get(B3Constants.XB3TraceId));
            Assert.NotNull(request.Headers.Get(B3Constants.XB3SpanId));
            Assert.Null(request.Headers.Get(B3Constants.XB3ParentSpanId));

            var spanId = request.Headers.Get(B3Constants.XB3SpanId);

            Assert.Equal(span.ToSpanData().Context.SpanId.ToHexString(), spanId);

            var traceId  = request.Headers.Get(B3Constants.XB3TraceId);
            var expected = GetTraceId(opts, span.Context);

            Assert.Equal(expected, traceId);

            if (span.IsRecording)
            {
                Assert.NotNull(request.Headers.Get(B3Constants.XB3Sampled));
            }
        }
コード例 #5
0
        public void HandleStopEvent_RecordsStats()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new HttpClientDesktopObserver(options, stats, tags, null);

            var req = GetHttpRequestMessage();

            Activity act = new Activity("Test");

            act.Start();
            Thread.Sleep(1000);
            act.SetEndTime(DateTime.UtcNow);

            observer.HandleStopEvent(act, req, HttpStatusCode.InternalServerError);
            observer.HandleStopEvent(act, req, HttpStatusCode.OK);

            var reqData  = stats.ViewManager.GetView(ViewName.Create("http.desktop.client.request.time"));
            var aggData1 = MetricsHelpers.SumWithTags(reqData) as IDistributionData;

            Assert.InRange(aggData1.Mean, 990.0, 1025.0);
            Assert.InRange(aggData1.Max, 990.0, 1025.0);

            reqData = stats.ViewManager.GetView(ViewName.Create("http.desktop.client.request.count"));
            var aggData2 = MetricsHelpers.SumWithTags(reqData) as ISumDataLong;

            Assert.Equal(2, aggData2.Sum);

            act.Stop();
        }
コード例 #6
0
        public void ProcessEvent_IgnoresMissingHttpRequestMessage()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);

            obs.ProcessEvent(string.Empty, new object());
        }
        public void ProcessEvent_IgnoresNulls()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs = new HttpClientDesktopObserver(opts, tracing);

            obs.ProcessEvent(null, null);
        }
        public void ProcessEvent_IgnoresUnknownEvent()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs = new HttpClientDesktopObserver(opts, tracing);

            obs.ProcessEvent(string.Empty, new { Request = GetHttpRequestMessage() });
        }
コード例 #9
0
        public void Constructor_RegistersExpectedViews()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new HttpClientDesktopObserver(options, stats, tags, null);

            Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.desktop.client.request.time")));
            Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.desktop.client.request.count")));
        }
        public void ShouldIgnore_ReturnsExpected()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs = new HttpClientDesktopObserver(opts, tracing);

            Assert.True(obs.ShouldIgnoreRequest("/api/v2/spans"));
            Assert.True(obs.ShouldIgnoreRequest("/v2/apps/foobar/permissions"));
            Assert.True(obs.ShouldIgnoreRequest("/v2/apps/barfoo/permissions"));
            Assert.False(obs.ShouldIgnoreRequest("/api/test"));
            Assert.False(obs.ShouldIgnoreRequest("/v2/apps"));
        }
コード例 #11
0
        public void ShouldIgnore_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientDesktopObserver(options, stats, null);

            Assert.True(observer.ShouldIgnoreRequest("/api/v2/spans"));
            Assert.True(observer.ShouldIgnoreRequest("/v2/apps/foobar/permissions"));
            Assert.True(observer.ShouldIgnoreRequest("/v2/apps/barfoo/permissions"));
            Assert.False(observer.ShouldIgnoreRequest("/api/test"));
            Assert.False(observer.ShouldIgnoreRequest("/v2/apps"));
        }
コード例 #12
0
        public void ProcessEvent_StopEx_NothingStarted()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, new { Request = request, StatusCode = HttpStatusCode.OK, Headers = new WebHeaderCollection() });
            var span = GetCurrentSpan(tracing.Tracer);

            Assert.Null(span);
            Assert.False(obs.Pending.TryGetValue(request, out var context));
        }
コード例 #13
0
        public void ProcessEvent_Stop_NoRespose()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

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

            Assert.Null(span);
            Assert.False(obs.Pending.TryGetValue(request, out var context));
        }
コード例 #14
0
        public void ShouldIgnore_ReturnsExpected()
        {
            var options = new MetricsEndpointOptions();
            var stats   = new OpenCensusStats();
            var tags    = new OpenCensusTags();
            var obs     = new HttpClientDesktopObserver(options, stats, tags, null);

            Assert.True(obs.ShouldIgnoreRequest("/api/v2/spans"));
            Assert.True(obs.ShouldIgnoreRequest("/v2/apps/foobar/permissions"));
            Assert.True(obs.ShouldIgnoreRequest("/v2/apps/barfoo/permissions"));
            Assert.False(obs.ShouldIgnoreRequest("/api/test"));
            Assert.False(obs.ShouldIgnoreRequest("/v2/apps"));
        }
        public void ProcessEvent_StopEx_NothingStarted()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, new { Request = request, StatusCode = HttpStatusCode.OK, Headers = new WebHeaderCollection() });
            Span span = AsyncLocalContext.CurrentSpan as Span;

            Assert.Null(span);
            Assert.False(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext context));
        }
        public void ProcessEvent_Stop_NoRespose()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

            obs.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, new { Request = request });
            Span span = AsyncLocalContext.CurrentSpan as Span;

            Assert.Null(span);
            Assert.False(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext context));
        }
コード例 #17
0
        public void GetTagContext_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientDesktopObserver(options, stats, null);

            var req    = GetHttpRequestMessage();
            var labels = observer.GetLabels(req, HttpStatusCode.InternalServerError);

            labels.Contains(KeyValuePair.Create("clientName", "localhost:5555"));
            labels.Contains(KeyValuePair.Create("uri", "/foo/bar"));
            labels.Contains(KeyValuePair.Create("status", "500"));
            labels.Contains(KeyValuePair.Create("method", "GET"));
        }
        public void ProcessEvent_Start()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

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

            Span span = AsyncLocalContext.CurrentSpan as Span;

            Assert.NotNull(span);
            Assert.True(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext spanContext));
            Assert.NotNull(spanContext);
            Assert.Equal(span, spanContext.Active);
            Assert.Null(spanContext.Previous);
            Assert.Equal("httpclient:/", span.Name);

            Assert.NotNull(request.Headers.Get(B3Format.X_B3_TRACE_ID));
            Assert.NotNull(request.Headers.Get(B3Format.X_B3_SPAN_ID));
            Assert.Null(request.Headers.Get(B3Format.X_B3_PARENT_SPAN_ID));

            var spanId = request.Headers.Get(B3Format.X_B3_SPAN_ID);

            Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId);

            var traceId  = request.Headers.Get(B3Format.X_B3_TRACE_ID);
            var expected = GetTraceId(opts, span.Context);

            Assert.Equal(expected, traceId);

            if (span.Context.TraceOptions.IsSampled)
            {
                Assert.NotNull(request.Headers.Get(B3Format.X_B3_SAMPLED));
            }

            Assert.False(span.HasEnded);

            var spanData   = span.ToSpanData();
            var attributes = spanData.Attributes.AttributeMap;

            Assert.Equal(AttributeValue.StringAttributeValue(SpanAttributeConstants.ClientSpanKind), attributes[SpanAttributeConstants.SpanKindKey]);
            Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), attributes[SpanAttributeConstants.HttpUrlKey]);
            Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), attributes[SpanAttributeConstants.HttpMethodKey]);
            Assert.Equal(AttributeValue.StringAttributeValue("localhost"), attributes[SpanAttributeConstants.HttpHostKey]);
            Assert.Equal(AttributeValue.StringAttributeValue("/"), attributes[SpanAttributeConstants.HttpPathKey]);
            Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.request.TEST"]);
        }
コード例 #19
0
        public void GetTagContext_ReturnsExpected()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new HttpClientDesktopObserver(options, stats, tags, null);

            var req        = GetHttpRequestMessage();
            var tagContext = observer.GetTagContext(req, HttpStatusCode.InternalServerError);
            var tagValues  = tagContext.ToList();

            tagValues.Contains(Tag.Create(TagKey.Create("clientName"), TagValue.Create("localhost:5555")));
            tagValues.Contains(Tag.Create(TagKey.Create("uri"), TagValue.Create("/foo/bar")));
            tagValues.Contains(Tag.Create(TagKey.Create("status"), TagValue.Create("500")));
            tagValues.Contains(Tag.Create(TagKey.Create("method"), TagValue.Create("GET")));
        }
コード例 #20
0
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientDesktopObserver(options, stats, null);

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

            Activity act = new Activity("Test");

            act.Start();
            observer.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, null);
            observer.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, null);
            act.Stop();
        }
コード例 #21
0
        public void ProcessEvent_Start()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

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

            var span = GetCurrentSpan(tracing.Tracer);

            Assert.NotNull(span);
            Assert.True(obs.Pending.TryGetValue(request, out var pendingSpan));
            Assert.NotNull(pendingSpan);
            Assert.Equal(span, pendingSpan);
            Assert.Equal("httpclient:/", span.ToSpanData().Name);

            Assert.NotNull(request.Headers.Get(B3Constants.XB3TraceId));
            Assert.NotNull(request.Headers.Get(B3Constants.XB3SpanId));
            Assert.Null(request.Headers.Get(B3Constants.XB3ParentSpanId));

            var spanId = request.Headers.Get(B3Constants.XB3SpanId);

            Assert.Equal(span.Context.SpanId.ToHexString(), spanId);

            var traceId  = request.Headers.Get(B3Constants.XB3TraceId);
            var expected = GetTraceId(opts, span.Context);

            Assert.Equal(expected, traceId);

            if (span.IsRecording)
            {
                Assert.NotNull(request.Headers.Get(B3Constants.XB3Sampled));
            }

            Assert.False(span.HasEnded());

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

            Assert.Equal(SpanKind.Client, spanData.Kind);
            Assert.Equal("http://localhost:5555/", attributes[SpanAttributeConstants.HttpUrlKey]);
            Assert.Equal(HttpMethod.Get.ToString(), attributes[SpanAttributeConstants.HttpMethodKey]);
            Assert.Equal("localhost:5555", attributes[SpanAttributeConstants.HttpHostKey]);
            Assert.Equal("/", attributes[SpanAttributeConstants.HttpPathKey]);
            Assert.Equal("Header", attributes["http.request.TEST"]);
        }
コード例 #22
0
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsEndpointOptions();
            var stats    = new OpenCensusStats();
            var tags     = new OpenCensusTags();
            var observer = new HttpClientDesktopObserver(options, stats, tags, null);

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

            Activity act = new Activity("Test");

            act.Start();
            observer.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, null);
            observer.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, null);
            act.Stop();
        }
コード例 #23
0
        public void ProcessEvent_StopEx_PreviousStarted()
        {
            var opts    = GetOptions();
            var tracing = new OpenTelemetryTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

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

            var span = GetCurrentSpan(tracing.Tracer);

            Assert.NotNull(span);
            Assert.True(obs.Pending.TryGetValue(request, out var pendingSpan));
            Assert.NotNull(pendingSpan);
            Assert.Equal(span, pendingSpan);
            var spanData = span.ToSpanData();

            Assert.Equal("httpclient:/", spanData.Name);

            var respHeaders = new WebHeaderCollection
            {
                { "TEST", "Header" }
            };

            obs.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, new { Request = request, StatusCode = HttpStatusCode.OK, Headers = respHeaders });

            Assert.True(span.HasEnded());
            Assert.False(obs.Pending.TryGetValue(request, out var pendingSpan2));

            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]);
        }
        public void ProcessEvent_StopEx_PreviousStarted()
        {
            var opts = GetOptions();
            OpenCensusTracing tracing = new OpenCensusTracing(opts, null);
            var obs     = new HttpClientDesktopObserver(opts, tracing);
            var request = GetHttpRequestMessage();

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

            Span span = AsyncLocalContext.CurrentSpan as Span;

            Assert.NotNull(span);
            Assert.True(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext spanContext));
            Assert.NotNull(spanContext);
            Assert.Equal(span, spanContext.Active);
            Assert.Null(spanContext.Previous);
            Assert.Equal("httpclient:/", span.Name);

            var respHeaders = new WebHeaderCollection();

            respHeaders.Add("TEST", "Header");

            obs.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, new { Request = request, StatusCode = HttpStatusCode.OK, Headers = respHeaders });
            Assert.True(span.HasEnded);
            Assert.Null(AsyncLocalContext.CurrentSpan);
            Assert.False(obs.Pending.TryGetValue(request, out HttpClientTracingObserver.SpanContext 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.OK), attributes[SpanAttributeConstants.HttpStatusCodeKey]);
        }