Ejemplo n.º 1
0
        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());
        }