public void InjectTraceContext() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); // tracing.Tracer.SpanBuilder("MySpan").StartScopedSpan(out ISpan span); tracing.Tracer.StartActiveSpan("MySpan", out var span); obs.InjectTraceContext(request, null); Assert.True(request.Headers.Contains(B3Constants.XB3TraceId)); Assert.True(request.Headers.Contains(B3Constants.XB3SpanId)); Assert.False(request.Headers.Contains(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.GetValues(B3Constants.XB3SpanId).Single(); Assert.Equal(span.ToSpanData().Context.SpanId.ToHexString(), spanId); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.IsRecording) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } }
public void HandleExceptionEvent_RecordsStats() { var options = new MetricsOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new HttpClientCoreObserver(options, stats, tags, null); var req = GetHttpRequestMessage(); var resp = GetHttpResponseMessage(HttpStatusCode.InternalServerError); Activity act = new Activity("Test"); act.Start(); Thread.Sleep(1000); act.SetEndTime(DateTime.UtcNow); observer.HandleExceptionEvent(act, req); observer.HandleExceptionEvent(act, req); var reqData = stats.ViewManager.GetView(ViewName.Create("http.client.requests")); var aggData1 = reqData.SumWithTags() as IDistributionData; Assert.InRange(aggData1.Mean, 995.0, 1005.0); Assert.InRange(aggData1.Max, 995.0, 1005.0); reqData = stats.ViewManager.GetView(ViewName.Create("http.client.requests.count")); var aggData2 = reqData.SumWithTags() as ISumDataLong; Assert.Equal(2, aggData2.Sum); act.Stop(); }
public void InjectTraceContext() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); tracing.Tracer.SpanBuilder("MySpan").StartScopedSpan(out ISpan span); obs.InjectTraceContext(request, null); Assert.True(request.Headers.Contains(B3Constants.XB3TraceId)); Assert.True(request.Headers.Contains(B3Constants.XB3SpanId)); Assert.False(request.Headers.Contains(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.GetValues(B3Constants.XB3SpanId).Single(); Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } }
public void InjectTraceContext() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); var span = tracing.Tracer.SpanBuilder("MySpan").StartSpan() as Span; AsyncLocalContext.CurrentSpan = span; obs.InjectTraceContext(request, null); Assert.True(request.Headers.Contains(B3Format.X_B3_TRACE_ID)); Assert.True(request.Headers.Contains(B3Format.X_B3_SPAN_ID)); Assert.False(request.Headers.Contains(B3Format.X_B3_PARENT_SPAN_ID)); var spanId = request.Headers.GetValues(B3Format.X_B3_SPAN_ID).Single(); Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId); var traceId = request.Headers.GetValues(B3Format.X_B3_TRACE_ID).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.True(request.Headers.Contains(B3Format.X_B3_SAMPLED)); } }
public void HandleStopEvent_RecordsStats() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new HttpClientCoreObserver(options, stats, tags, null); var req = GetHttpRequestMessage(); var resp = GetHttpResponseMessage(HttpStatusCode.InternalServerError); Activity act = new Activity("Test"); act.Start(); Thread.Sleep(1000); act.SetEndTime(DateTime.UtcNow); observer.HandleStopEvent(act, req, resp, TaskStatus.RanToCompletion); observer.HandleStopEvent(act, req, resp, TaskStatus.RanToCompletion); var reqData = stats.ViewManager.GetView(ViewName.Create("http.client.request.time")); var aggData1 = MetricsHelpers.SumWithTags(reqData) as IDistributionData; Assert.True(aggData1.Mean >= 1000.00); Assert.True(aggData1.Max >= 1000.00); reqData = stats.ViewManager.GetView(ViewName.Create("http.client.request.count")); var aggData2 = MetricsHelpers.SumWithTags(reqData) as ISumDataLong; Assert.Equal(2, aggData2.Sum); act.Stop(); }
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_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_IgnoresMissingHttpRequestMessage() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); obs.ProcessEvent(string.Empty, new object()); }
public void ProcessEvent_IgnoresNulls() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); obs.ProcessEvent(null, null); }
public void Constructor_RegistersExpectedViews() { var options = new MetricsOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new HttpClientCoreObserver(options, stats, tags, null); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.client.requests"))); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.client.requests.count"))); }
public void ShouldIgnore_ReturnsExpected() { var opts = GetOptions(); var tracing = new OpenTelemetryTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); Assert.True(obs.ShouldIgnoreRequest("/api/v2/spans")); Assert.True(obs.ShouldIgnoreRequest("/v2/apps/foobar/permissions")); Assert.True(obs.ShouldIgnoreRequest("/v2/apps/barfoo/permissions")); Assert.False(obs.ShouldIgnoreRequest("/api/test")); Assert.False(obs.ShouldIgnoreRequest("/v2/apps")); }
public void ShouldIgnore_ReturnsExpected() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var obs = new HttpClientCoreObserver(options, stats, 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_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"]); }
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)); }
public void ShouldIgnore_ReturnsExpected() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var obs = new HttpClientCoreObserver(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_Start() { var opts = GetOptions(); OpenCensusTracing tracing = new OpenCensusTracing(opts, null); var obs = new HttpClientCoreObserver(opts, tracing); var request = GetHttpRequestMessage(); obs.ProcessEvent(HttpClientCoreObserver.START_EVENT, new { Request = request }); Span span = GetCurrentSpan(tracing.Tracer); Assert.NotNull(span); Assert.True(request.Properties.TryGetValue(HttpClientCoreObserver.SPANCONTEXT_KEY, out object context)); HttpClientTracingObserver.SpanContext spanContext = context as HttpClientTracingObserver.SpanContext; Assert.NotNull(spanContext); Assert.Equal(span, spanContext.Active); Assert.NotNull(spanContext.ActiveScope); Assert.Equal("httpclient:/", span.Name); Assert.True(request.Headers.Contains(B3Constants.XB3TraceId)); Assert.True(request.Headers.Contains(B3Constants.XB3SpanId)); Assert.False(request.Headers.Contains(B3Constants.XB3ParentSpanId)); var spanId = request.Headers.GetValues(B3Constants.XB3SpanId).Single(); Assert.Equal(span.Context.SpanId.ToLowerBase16(), spanId); var traceId = request.Headers.GetValues(B3Constants.XB3TraceId).Single(); var expected = GetTraceId(opts, span.Context); Assert.Equal(expected, traceId); if (span.Context.TraceOptions.IsSampled) { Assert.True(request.Headers.Contains(B3Constants.XB3Sampled)); } Assert.False(span.HasEnded); var spanData = span.ToSpanData(); var attributes = spanData.Attributes.AttributeMap; Assert.Equal(SpanKind.Client, span.Kind); Assert.Equal(AttributeValue.StringAttributeValue("http://localhost:5555/"), attributes[SpanAttributeConstants.HttpUrlKey]); Assert.Equal(AttributeValue.StringAttributeValue(HttpMethod.Get.ToString()), attributes[SpanAttributeConstants.HttpMethodKey]); Assert.Equal(AttributeValue.StringAttributeValue("localhost:5555"), attributes[SpanAttributeConstants.HttpHostKey]); Assert.Equal(AttributeValue.StringAttributeValue("/"), attributes[SpanAttributeConstants.HttpPathKey]); Assert.Equal(AttributeValue.StringAttributeValue("Header"), attributes["http.request.TEST"]); }
public void GetTagContext_ReturnsExpected() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new HttpClientCoreObserver(options, stats, null); var req = GetHttpRequestMessage(); var resp = GetHttpResponseMessage(HttpStatusCode.InternalServerError); var tagContext = observer.GetLabels(req, resp, TaskStatus.RanToCompletion); var tagValues = tagContext.ToList(); tagValues.Contains(KeyValuePair.Create("clientName", "localhost:5555")); tagValues.Contains(KeyValuePair.Create("uri", "/foo/bar")); tagValues.Contains(KeyValuePair.Create("status", "500")); tagValues.Contains(KeyValuePair.Create("method", "GET")); }
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_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(); }
public void GetTagContext_ReturnsExpected() { var options = new MetricsOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new HttpClientCoreObserver(options, stats, tags, null); var req = GetHttpRequestMessage(); var resp = GetHttpResponseMessage(HttpStatusCode.InternalServerError); var tagContext = observer.GetTagContext(req, resp, TaskStatus.RanToCompletion); 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"))); }
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]); }
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)); }
public void GetStatusCode_ReturnsExpected() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new HttpClientCoreObserver(options, stats, null); var message = GetHttpResponseMessage(HttpStatusCode.OK); var status = observer.GetStatusCode(message, default); Assert.Equal("200", status); status = observer.GetStatusCode(null, TaskStatus.Canceled); Assert.Equal("CLIENT_CANCELED", status); status = observer.GetStatusCode(null, TaskStatus.Faulted); Assert.Equal("CLIENT_FAULT", status); status = observer.GetStatusCode(null, TaskStatus.RanToCompletion); Assert.Equal("CLIENT_ERROR", status); }
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]); }
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]); }
public void HandleStopEvent_RecordsStats() { var options = new MetricsObserverOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new HttpClientCoreObserver(options, stats, null); var factory = stats.Factory; var processor = stats.Processor; var req = GetHttpRequestMessage(); var resp = GetHttpResponseMessage(HttpStatusCode.InternalServerError); var act = new Activity("Test"); act.Start(); Task.Delay(1000).Wait(); act.SetEndTime(DateTime.UtcNow); observer.HandleStopEvent(act, req, resp, TaskStatus.RanToCompletion); observer.HandleStopEvent(act, req, resp, TaskStatus.RanToCompletion); factory.CollectAllMetrics(); var timeSummary = processor.GetMetricByName <double>("http.client.request.time"); Assert.NotNull(timeSummary); var average = timeSummary.Sum / timeSummary.Count; Assert.InRange(average, 975.0, 1200.0); Assert.InRange(timeSummary.Max, 975.0, 1200.0); var countSummary = processor.GetMetricByName <long>("http.client.request.count"); Assert.Equal(2, countSummary.Count); act.Stop(); }