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_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]); }