From a40f200c0aaf530a2a240c3d71f6c6c13df7fdcc Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Thu, 29 Aug 2019 11:25:06 -0700 Subject: [PATCH] Add EnableTelemetry flag --- .../Public/StripeConfiguration.cs | 23 ++++++++++++++- .../Public/SystemNetHttpClient.cs | 19 +++++++++++-- src/StripeTests/Functional/TelemetryTest.cs | 28 +++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/Stripe.net/Infrastructure/Public/StripeConfiguration.cs b/src/Stripe.net/Infrastructure/Public/StripeConfiguration.cs index 7f426b85fa..ffd6b5d44f 100644 --- a/src/Stripe.net/Infrastructure/Public/StripeConfiguration.cs +++ b/src/Stripe.net/Infrastructure/Public/StripeConfiguration.cs @@ -20,6 +20,8 @@ public static class StripeConfiguration private static string clientId; + private static bool enableTelemetry = true; + private static int maxNetworkRetries; private static IStripeClient stripeClient; @@ -129,6 +131,24 @@ public static int MaxNetworkRetries } } + /// + /// Gets or sets the flag enabling request latency telemetry. Enabled by default. + /// + public static bool EnableTelemetry + { + get => enableTelemetry; + + set + { + if (value != enableTelemetry) + { + StripeClient = null; + } + + enableTelemetry = value; + } + } + /// /// Gets or sets a custom for sending requests to Stripe's /// API. You can use this to use a custom message handler, set proxy parameters, etc. @@ -239,7 +259,8 @@ private static StripeClient BuildDefaultStripeClient() var httpClient = new SystemNetHttpClient( httpClient: null, maxNetworkRetries: MaxNetworkRetries, - appInfo: AppInfo); + appInfo: AppInfo, + enableTelemetry: EnableTelemetry); return new StripeClient(ApiKey, ClientId, httpClient: httpClient); } } diff --git a/src/Stripe.net/Infrastructure/Public/SystemNetHttpClient.cs b/src/Stripe.net/Infrastructure/Public/SystemNetHttpClient.cs index 4d97042a90..2afba60213 100644 --- a/src/Stripe.net/Infrastructure/Public/SystemNetHttpClient.cs +++ b/src/Stripe.net/Infrastructure/Public/SystemNetHttpClient.cs @@ -25,6 +25,8 @@ public class SystemNetHttpClient : IHttpClient private readonly AppInfo appInfo; + private readonly bool enableTelemetry; + private readonly RequestTelemetry requestTelemetry = new RequestTelemetry(); private readonly object randLock = new object(); @@ -50,10 +52,14 @@ public class SystemNetHttpClient : IHttpClient /// Information about the "app" which this integration belongs to. This should be reserved /// for plugins that wish to identify themselves with Stripe. /// + /// + /// Whether to enable request latency telemetry or not. + /// public SystemNetHttpClient( System.Net.Http.HttpClient httpClient = null, int maxNetworkRetries = 0, - AppInfo appInfo = null) + AppInfo appInfo = null, + bool enableTelemetry = true) { #if NET45 // With .NET Framework 4.5, it's necessary to manually enable support for TLS 1.2. @@ -64,6 +70,7 @@ public SystemNetHttpClient( this.httpClient = httpClient ?? BuildDefaultSystemNetHttpClient(); this.maxNetworkRetries = maxNetworkRetries; this.appInfo = appInfo; + this.enableTelemetry = enableTelemetry; this.stripeClientUserAgentString = this.BuildStripeClientUserAgentString(); this.userAgentString = this.BuildUserAgentString(); @@ -118,7 +125,10 @@ public async Task MakeRequestAsync( HttpResponseMessage response = null; int retry = 0; - this.requestTelemetry.MaybeAddTelemetryHeader(request.StripeHeaders); + if (this.enableTelemetry) + { + this.requestTelemetry.MaybeAddTelemetryHeader(request.StripeHeaders); + } while (true) { @@ -165,7 +175,10 @@ public async Task MakeRequestAsync( throw requestException; } - this.requestTelemetry.MaybeEnqueueMetrics(response, duration); + if (this.enableTelemetry) + { + this.requestTelemetry.MaybeEnqueueMetrics(response, duration); + } var reader = new StreamReader( await response.Content.ReadAsStreamAsync().ConfigureAwait(false)); diff --git a/src/StripeTests/Functional/TelemetryTest.cs b/src/StripeTests/Functional/TelemetryTest.cs index 1920430490..d1775d0070 100644 --- a/src/StripeTests/Functional/TelemetryTest.cs +++ b/src/StripeTests/Functional/TelemetryTest.cs @@ -111,6 +111,34 @@ public async Task TelemetryWorksWithConcurrentRequests() ItExpr.IsAny()); } + [Fact] + public void NoTelemetryWhenDisabled() + { + var mockHandler = new Mock { CallBase = true }; + var httpClient = new SystemNetHttpClient( + new System.Net.Http.HttpClient(mockHandler.Object), + enableTelemetry: false); + var stripeClient = new StripeClient("sk_test_123", httpClient: httpClient); + + mockHandler.Reset(); + var fakeServer = FakeServer.ForMockHandler(mockHandler); + fakeServer.Delay = TimeSpan.FromMilliseconds(20); + + var service = new BalanceService(stripeClient); + service.Get(); + fakeServer.Delay = TimeSpan.FromMilliseconds(40); + service.Get(); + service.Get(); + + mockHandler.Protected() + .Verify( + "SendAsync", + Times.Exactly(3), + ItExpr.Is(m => + !m.Headers.Contains("X-Stripe-Client-Telemetry")), + ItExpr.IsAny()); + } + private static bool TelemetryHeaderMatcher( HttpHeaders headers, Func requestIdMatcher,