public async Task HttpOutCallsAreCollectedSuccesfullyAsync(HttpOutTestCase tc) { var serverLifeTime = TestServer.RunServer( (ctx) => { ctx.Response.StatusCode = tc.responseCode == 0 ? 200 : tc.responseCode; ctx.Response.OutputStream.Close(); }, out string host, out int port); var startEndHandler = new Mock <IStartEndHandler>(); var tracer = new Tracer(new RandomGenerator(), startEndHandler.Object, new TraceConfig(), null); tc.url = NormaizeValues(tc.url, host, port); using (serverLifeTime) { using (var dc = new DependenciesCollector(new DependenciesCollectorOptions(), tracer, Samplers.AlwaysSample)) { try { using (var c = new HttpClient()) { var request = new HttpRequestMessage { RequestUri = new Uri(tc.url), Method = new HttpMethod(tc.method), }; if (tc.headers != null) { foreach (var header in tc.headers) { request.Headers.Add(header.Key, header.Value); } } await c.SendAsync(request); } } catch (Exception) { //test case can intentiaonlly send request that will result in exception } } } Assert.Equal(2, startEndHandler.Invocations.Count); // begin and end was called var spanData = ((Span)startEndHandler.Invocations[1].Arguments[0]).ToSpanData(); Assert.Equal(tc.spanName, spanData.Name); Assert.Equal(tc.spanKind, spanData.Kind.ToString()); var d = new Dictionary <CanonicalCode, string>() { { CanonicalCode.Ok, "OK" }, { CanonicalCode.Cancelled, "CANCELLED" }, { CanonicalCode.Unknown, "UNKNOWN" }, { CanonicalCode.InvalidArgument, "INVALID_ARGUMENT" }, { CanonicalCode.DeadlineExceeded, "DEADLINE_EXCEEDED" }, { CanonicalCode.NotFound, "NOT_FOUND" }, { CanonicalCode.AlreadyExists, "ALREADY_EXISTS" }, { CanonicalCode.PermissionDenied, "PERMISSION_DENIED" }, { CanonicalCode.ResourceExhausted, "RESOURCE_EXHAUSTED" }, { CanonicalCode.FailedPrecondition, "FAILED_PRECONDITION" }, { CanonicalCode.Aborted, "ABORTED" }, { CanonicalCode.OutOfRange, "OUT_OF_RANGE" }, { CanonicalCode.Unimplemented, "UNIMPLEMENTED" }, { CanonicalCode.Internal, "INTERNAL" }, { CanonicalCode.Unavailable, "UNAVAILABLE" }, { CanonicalCode.DataLoss, "DATA_LOSS" }, { CanonicalCode.Unauthenticated, "UNAUTHENTICATED" }, }; Assert.Equal(tc.spanStatus, d[spanData.Status.CanonicalCode]); var normilizedAttributes = spanData.Attributes.AttributeMap.ToDictionary(x => x.Key, x => AttributeToSimpleString(x.Value)); tc.spanAttributes = tc.spanAttributes.ToDictionary(x => x.Key, x => NormaizeValues(x.Value, host, port)); Assert.Equal(tc.spanAttributes.ToHashSet(), normilizedAttributes.ToHashSet()); }
public async Task HttpOutCallsAreCollectedSuccessfullyAsync(HttpOutTestCase tc) { var serverLifeTime = TestServer.RunServer( (ctx) => { ctx.Response.StatusCode = tc.ResponseCode == 0 ? 200 : tc.ResponseCode; ctx.Response.OutputStream.Close(); }, out var host, out var port); var spanProcessor = new Mock <SpanProcessor>(); var tracer = TracerFactory.Create(b => b .AddProcessorPipeline(p => p.AddProcessor(_ => spanProcessor.Object))) .GetTracer(null); tc.Url = NormalizeValues(tc.Url, host, port); using (serverLifeTime) using (new HttpClientCollector(tracer, new HttpClientCollectorOptions() { SetHttpFlavor = tc.SetHttpFlavor })) { try { using (var c = new HttpClient()) { var request = new HttpRequestMessage { RequestUri = new Uri(tc.Url), Method = new HttpMethod(tc.Method), Version = new Version(2, 0), }; if (tc.Headers != null) { foreach (var header in tc.Headers) { request.Headers.Add(header.Key, header.Value); } } await c.SendAsync(request); } } catch (Exception) { //test case can intentionally send request that will result in exception } } Assert.Equal(2, spanProcessor.Invocations.Count); // begin and end was called var span = (SpanData)spanProcessor.Invocations[1].Arguments[0]; Assert.Equal(tc.SpanName, span.Name); Assert.Equal(tc.SpanKind, span.Kind.ToString()); var d = new Dictionary <CanonicalCode, string>() { { CanonicalCode.Ok, "OK" }, { CanonicalCode.Cancelled, "CANCELLED" }, { CanonicalCode.Unknown, "UNKNOWN" }, { CanonicalCode.InvalidArgument, "INVALID_ARGUMENT" }, { CanonicalCode.DeadlineExceeded, "DEADLINE_EXCEEDED" }, { CanonicalCode.NotFound, "NOT_FOUND" }, { CanonicalCode.AlreadyExists, "ALREADY_EXISTS" }, { CanonicalCode.PermissionDenied, "PERMISSION_DENIED" }, { CanonicalCode.ResourceExhausted, "RESOURCE_EXHAUSTED" }, { CanonicalCode.FailedPrecondition, "FAILED_PRECONDITION" }, { CanonicalCode.Aborted, "ABORTED" }, { CanonicalCode.OutOfRange, "OUT_OF_RANGE" }, { CanonicalCode.Unimplemented, "UNIMPLEMENTED" }, { CanonicalCode.Internal, "INTERNAL" }, { CanonicalCode.Unavailable, "UNAVAILABLE" }, { CanonicalCode.DataLoss, "DATA_LOSS" }, { CanonicalCode.Unauthenticated, "UNAUTHENTICATED" }, }; Assert.Equal(tc.SpanStatus, d[span.Status.CanonicalCode]); if (tc.SpanStatusHasDescription.HasValue) { Assert.Equal(tc.SpanStatusHasDescription.Value, !string.IsNullOrEmpty(span.Status.Description)); } var normalizedAttributes = span.Attributes.ToDictionary(x => x.Key, x => x.Value.ToString()); tc.SpanAttributes = tc.SpanAttributes.ToDictionary(x => x.Key, x => NormalizeValues(x.Value, host, port)); Assert.Equal(tc.SpanAttributes.ToHashSet(), normalizedAttributes.ToHashSet()); }