mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 07:35:27 +08:00 
			
		
		
		
	Monitoring (#219)
* feat: use Https://github.com/ButterflyAPM to monitor each API request monitoring metrics * feat: using DiagnosticSource and Butterfly.OpenTracing * refactor:refactor Ocelot tracing, merge code into OcelotDiagnosticListener * refactor: move OcelotHttpTracingHandler to Requester * fix: Requester\HttpClientBuilder.cs(10,14): error CS0234: The type or namespace name 'Tracing' does not exist in the namespace * feat: add test should_set_up_tracing * feat : Remove extraneous code * feat: remove unused DiagnosticSource diagnostic * fix : test UseTracing * add test should_call_scoped_data_repository_QosProviderError * add test should_return_any_errors * add test HttpClientHttpRequesterTest * it should keep it can not be deleted
This commit is contained in:
		@@ -17,6 +17,7 @@
 | 
			
		||||
    using Ocelot.Requester.QoS;
 | 
			
		||||
    using Ocelot.Configuration;
 | 
			
		||||
    using Microsoft.AspNetCore.Builder;
 | 
			
		||||
    using Ocelot.Errors;
 | 
			
		||||
 | 
			
		||||
    public class HttpRequestBuilderMiddlewareTests : ServerHostedMiddlewareTest
 | 
			
		||||
    {
 | 
			
		||||
@@ -51,18 +52,39 @@
 | 
			
		||||
                new ReRouteBuilder()
 | 
			
		||||
                    .WithRequestIdKey("LSRequestId")
 | 
			
		||||
                    .WithUpstreamHttpMethod(new List<string> { "Get" })
 | 
			
		||||
                    .WithHttpHandlerOptions(new HttpHandlerOptions(true, true))
 | 
			
		||||
                    .WithHttpHandlerOptions(new HttpHandlerOptions(true, true,false))
 | 
			
		||||
                    .Build());
 | 
			
		||||
 | 
			
		||||
            this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
 | 
			
		||||
                .And(x => x.GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(new NoQoSProvider())))
 | 
			
		||||
                .And(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
 | 
			
		||||
                .And(x => x.GivenTheRequestBuilderReturns(new Ocelot.Request.Request(new HttpRequestMessage(), true, new NoQoSProvider(), false, false)))
 | 
			
		||||
                .And(x => x.GivenTheRequestBuilderReturns(new Ocelot.Request.Request(new HttpRequestMessage(), true, new NoQoSProvider(), false, false,false)))
 | 
			
		||||
                .When(x => x.WhenICallTheMiddleware())
 | 
			
		||||
                .Then(x => x.ThenTheScopedDataRepositoryIsCalledCorrectly())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_call_scoped_data_repository_QosProviderError()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            var downstreamRoute = new DownstreamRoute(new List<PlaceholderNameAndValue>(),
 | 
			
		||||
                new ReRouteBuilder()
 | 
			
		||||
                    .WithRequestIdKey("LSRequestId")
 | 
			
		||||
                    .WithUpstreamHttpMethod(new List<string> { "Get" })
 | 
			
		||||
                    .WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
 | 
			
		||||
                    .Build());
 | 
			
		||||
 | 
			
		||||
            this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
 | 
			
		||||
                .And(x => x.GivenTheQosProviderHouseReturns(new ErrorResponse<IQoSProvider>(It.IsAny<Error>())))
 | 
			
		||||
                .And(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
 | 
			
		||||
                .And(x => x.GivenTheRequestBuilderReturns(new Ocelot.Request.Request(new HttpRequestMessage(), true, new NoQoSProvider(), false, false, false)))
 | 
			
		||||
                .When(x => x.WhenICallTheMiddleware())
 | 
			
		||||
                .Then(x => x.ThenTheScopedDataRepositoryQosProviderError())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        protected override void GivenTheTestServerServicesAreConfigured(IServiceCollection services)
 | 
			
		||||
        {
 | 
			
		||||
            services.AddSingleton<IOcelotLoggerFactory, AspDotNetLoggerFactory>();
 | 
			
		||||
@@ -109,7 +131,9 @@
 | 
			
		||||
                                    It.IsAny<bool>(),
 | 
			
		||||
                                    It.IsAny<IQoSProvider>(),
 | 
			
		||||
                                    It.IsAny<bool>(),
 | 
			
		||||
                                    It.IsAny<bool>()))
 | 
			
		||||
                                    It.IsAny<bool>(),
 | 
			
		||||
                                    It.IsAny<bool>()
 | 
			
		||||
                                    ))
 | 
			
		||||
                .ReturnsAsync(_request);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -118,5 +142,11 @@
 | 
			
		||||
            _scopedRepository
 | 
			
		||||
                .Verify(x => x.Add("Request", _request.Data), Times.Once());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheScopedDataRepositoryQosProviderError()
 | 
			
		||||
        {
 | 
			
		||||
            _scopedRepository
 | 
			
		||||
                .Verify(x => x.Add("OcelotMiddlewareError", true), Times.Once());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,79 +1,86 @@
 | 
			
		||||
namespace Ocelot.UnitTests.Request
 | 
			
		||||
{
 | 
			
		||||
    using System.Net.Http;
 | 
			
		||||
 | 
			
		||||
    using Ocelot.Request.Builder;
 | 
			
		||||
    using Ocelot.Requester.QoS;
 | 
			
		||||
    using Ocelot.Responses;
 | 
			
		||||
    using Shouldly;
 | 
			
		||||
    using TestStack.BDDfy;
 | 
			
		||||
    using Xunit;
 | 
			
		||||
 | 
			
		||||
    public class HttpRequestCreatorTests
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IRequestCreator _requestCreator;
 | 
			
		||||
        private readonly bool _isQos;
 | 
			
		||||
        private readonly IQoSProvider _qoSProvider;
 | 
			
		||||
        private readonly HttpRequestMessage _requestMessage;
 | 
			
		||||
        private readonly bool _useCookieContainer;
 | 
			
		||||
        private readonly bool _allowAutoRedirect;
 | 
			
		||||
 | 
			
		||||
        private Response<Ocelot.Request.Request> _response;
 | 
			
		||||
 | 
			
		||||
        public HttpRequestCreatorTests()
 | 
			
		||||
        {
 | 
			
		||||
            _requestCreator = new HttpRequestCreator();
 | 
			
		||||
            _isQos = true;
 | 
			
		||||
            _qoSProvider = new NoQoSProvider();
 | 
			
		||||
            _useCookieContainer = false;
 | 
			
		||||
            _allowAutoRedirect = false;
 | 
			
		||||
 | 
			
		||||
            _requestMessage = new HttpRequestMessage();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ShouldBuildRequest()
 | 
			
		||||
        {
 | 
			
		||||
            this.When(x => x.WhenIBuildARequest())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsTheRequestMessage())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsTheIsQos())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsTheQosProvider())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsUseCookieContainer())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsAllowAutoRedirect())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenIBuildARequest()
 | 
			
		||||
        {
 | 
			
		||||
            _response = _requestCreator.Build(_requestMessage,
 | 
			
		||||
                    _isQos, _qoSProvider, _useCookieContainer, _allowAutoRedirect)
 | 
			
		||||
                .GetAwaiter()
 | 
			
		||||
                .GetResult();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsTheRequestMessage()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.HttpRequestMessage.ShouldBe(_requestMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsTheIsQos()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.IsQos.ShouldBe(_isQos);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsTheQosProvider()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.QosProvider.ShouldBe(_qoSProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.UnitTests.Request
 | 
			
		||||
{
 | 
			
		||||
    using System.Net.Http;
 | 
			
		||||
 | 
			
		||||
    using Ocelot.Request.Builder;
 | 
			
		||||
    using Ocelot.Requester.QoS;
 | 
			
		||||
    using Ocelot.Responses;
 | 
			
		||||
    using Shouldly;
 | 
			
		||||
    using TestStack.BDDfy;
 | 
			
		||||
    using Xunit;
 | 
			
		||||
 | 
			
		||||
    public class HttpRequestCreatorTests
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IRequestCreator _requestCreator;
 | 
			
		||||
        private readonly bool _isQos;
 | 
			
		||||
        private readonly IQoSProvider _qoSProvider;
 | 
			
		||||
        private readonly HttpRequestMessage _requestMessage;
 | 
			
		||||
        private readonly bool _useCookieContainer;
 | 
			
		||||
        private readonly bool _allowAutoRedirect;
 | 
			
		||||
        private readonly bool _useTracing;
 | 
			
		||||
 | 
			
		||||
        private Response<Ocelot.Request.Request> _response;
 | 
			
		||||
 | 
			
		||||
        public HttpRequestCreatorTests()
 | 
			
		||||
        {
 | 
			
		||||
            _requestCreator = new HttpRequestCreator();
 | 
			
		||||
            _isQos = true;
 | 
			
		||||
            _qoSProvider = new NoQoSProvider();
 | 
			
		||||
            _useCookieContainer = false;
 | 
			
		||||
            _allowAutoRedirect = false;
 | 
			
		||||
            _useTracing = false;
 | 
			
		||||
            _requestMessage = new HttpRequestMessage();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ShouldBuildRequest()
 | 
			
		||||
        {
 | 
			
		||||
            this.When(x => x.WhenIBuildARequest())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsTheRequestMessage())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsTheIsQos())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsTheQosProvider())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsUseCookieContainer())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsUseTracing())
 | 
			
		||||
                .Then(x => x.ThenTheRequestContainsAllowAutoRedirect())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenIBuildARequest()
 | 
			
		||||
        {
 | 
			
		||||
            _response = _requestCreator.Build(_requestMessage,
 | 
			
		||||
                    _isQos, _qoSProvider, _useCookieContainer, _allowAutoRedirect, _useTracing)
 | 
			
		||||
                .GetAwaiter()
 | 
			
		||||
                .GetResult();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsTheRequestMessage()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.HttpRequestMessage.ShouldBe(_requestMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsTheIsQos()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.IsQos.ShouldBe(_isQos);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsTheQosProvider()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.QosProvider.ShouldBe(_qoSProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsUseCookieContainer()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.UseCookieContainer.ShouldBe(_useCookieContainer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsUseTracing()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.IsTracing.ShouldBe(_useTracing);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheRequestContainsAllowAutoRedirect()
 | 
			
		||||
        {
 | 
			
		||||
            _response.Data.AllowAutoRedirect.ShouldBe(_allowAutoRedirect);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user