[NetCoreFact]         //see: https://github.com/elastic/apm-agent-dotnet/issues/516
        public void OnNextWithStart()
        {
            var logger = new TestLogger();
            var agent  = new ApmAgent(new TestAgentComponents(logger));

            StartTransaction(agent);
            var listener = HttpDiagnosticListener.New(agent);

            var request = new HttpRequestMessage(HttpMethod.Get, "https://elastic.co");

            //Simulate Start
            listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.HttpRequestOut.Start", new { Request = request }));
            ProcessingRequestsCount(listener).Should().Be(1);
            var span = GetSpanForRequest(listener, request);

            span.Context.Http.Url.Should().Be(request.RequestUri.ToString());
            span.Context.Http.Method.Should().Be(HttpMethod.Get.ToString());
            span.End();
            span.Context.Destination.Address.Should().Be(request.RequestUri.Host);
            span.Context.Destination.Port.Should().Be(UrlUtilsTests.DefaultHttpsPort);
        }
        public void OnErrorLog()
        {
            var logger   = new TestLogger();
            var agent    = new ApmAgent(new TestAgentComponents(logger));
            var listener = HttpDiagnosticListener.New(agent);

            const string exceptionMessage = "Oops, this went wrong";
            var          fakeException    = new Exception(exceptionMessage);

            listener.OnError(fakeException);

            logger.Lines.Should().NotBeEmpty();
            logger.Lines[0]
            .Should()
            .ContainAll(
                "HttpDiagnosticListener",
                "in OnError",
                ".cs:",
                exceptionMessage
                );
        }
Exemple #3
0
        [NetCoreFact]         //see: https://github.com/elastic/apm-agent-dotnet/issues/516
        public void CaptureErrorOnFailingHttpCall_DirectCall()
        {
            var(disposableListener, payloadSender, agent) = RegisterListenerAndStartTransaction();

            using (disposableListener)
            {
                var listener = HttpDiagnosticListener.New(agent);

                var request = new HttpRequestMessage(HttpMethod.Get, "https://elastic.co");

                //Simulate Start
                listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.HttpRequestOut.Start", new { Request = request }));

                const string exceptionMsg = "Sample exception msg";
                var          exception    = new Exception(exceptionMsg);
                //Simulate Exception
                listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.Exception", new { Request = request, Exception = exception }));

                payloadSender.Errors.Should().NotBeEmpty();
                payloadSender.FirstError.Exception.Message.Should().Be(exceptionMsg);
                payloadSender.FirstError.Exception.Type.Should().Be(typeof(Exception).FullName);
            }
        }
        public void OnNextWithStartAndStop()
        {
            var logger        = new TestLogger();
            var payloadSender = new MockPayloadSender();
            var agent         = new ApmAgent(new TestAgentComponents(logger, payloadSender: payloadSender));

            StartTransaction(agent);
            var listener = HttpDiagnosticListener.New(agent);

            var request  = new HttpRequestMessage(HttpMethod.Get, "https://elastic.co");
            var response = new HttpResponseMessage(HttpStatusCode.OK);

            //Simulate Start
            listener.OnNext(new KeyValuePair <string, object>(StartEventKey(listener), new { Request = request }));
            //Simulate Stop
            listener.OnNext(new KeyValuePair <string, object>(StopEventKey(listener), new { Request = request, Response = response }));
            ProcessingRequestsCount(listener).Should().Be(0);

            var firstSpan = payloadSender.FirstSpan;

            firstSpan.Should().NotBeNull();
            firstSpan.Context.Http.Url.Should().BeEquivalentTo(request.RequestUri.AbsoluteUri);
            firstSpan.Context.Http.Method.Should().Be(HttpMethod.Get.Method);
        }
        public void OnNextWithStartAndStopTwice()
        {
            var logger = new TestLogger(LogLevel.Warning);
            var agent  = new ApmAgent(new TestAgentComponents(logger));

            StartTransaction(agent);
            var listener = new HttpDiagnosticListener(agent);

            var request  = new HttpRequestMessage(HttpMethod.Get, "https://elastic.co");
            var response = new HttpResponseMessage(HttpStatusCode.OK);

            //Simulate Start
            listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.HttpRequestOut.Start", new { Request = request }));
            //Simulate Stop
            listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.HttpRequestOut.Stop", new { Request = request, Response = response }));
            //Simulate Stop again. This should not happen, still we test for this.
            listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.HttpRequestOut.Stop", new { Request = request, Response = response }));

            Assert.Equal(
                $"{LogLevel.Warning} {listener.Name}: Failed capturing request '{HttpMethod.Get} {request.RequestUri}' in System.Net.Http.HttpRequestOut.Stop. This Span will be skipped in case it wasn't captured before.",
                logger.Lines[0]);
            Assert.NotNull(TransactionContainer.Transactions.Value);
            Assert.Single(TransactionContainer.Transactions.Value.Spans);
        }
        public void CaptureErrorOnFailingHttpCall_DirectCall()
        {
            var payloadSender = new MockPayloadSender();
            var agent         = new ApmAgent(new TestAgentComponents(payloadSender: payloadSender));

            RegisterListenerAndStartTransaction(agent);

            var listener = new HttpDiagnosticListener(agent);

            var request = new HttpRequestMessage(HttpMethod.Get, "https://elastic.co");

            //Simulate Start
            listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.HttpRequestOut.Start", new { Request = request }));

            var exceptionMsg = "Sample exception msg";
            var exception    = new Exception(exceptionMsg);

            //Simulate Exception
            listener.OnNext(new KeyValuePair <string, object>("System.Net.Http.Exception", new { Request = request, Exception = exception }));

            Assert.NotEmpty(payloadSender.Errors);
            Assert.Equal(exceptionMsg, payloadSender.Errors[0].Errors[0].Exception.Message);
            Assert.Equal(typeof(Exception).FullName, payloadSender.Errors[0].Errors[0].Exception.Type);
        }