Skip to content

Commit 43c477d

Browse files
Merge pull request #1725 from stripe/richardm-move-telemetry-to-livestriperesponsegetter
Move request telemetry to LiveStripeResponseGetter
2 parents fb0bb31 + c044fab commit 43c477d

File tree

4 files changed

+56
-39
lines changed

4 files changed

+56
-39
lines changed

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ tasks.withType(JavaCompile) {
5050
// com.stripe.param.AccountUpdateParams.Individual.Address] within this file.)
5151
// We should fix this by having autogen use the fully-qualified class to eliminate ambiguity.
5252
check("SameNameButDifferent", net.ltgt.gradle.errorprone.CheckSeverity.OFF)
53+
54+
// InlineMe (https://errorprone.info/docs/inlineme) seems neat, but in order to add these annotations
55+
// we would be imposing another dependency on `errorprone` to our users, not worth it.
56+
check("InlineMeSuggester", net.ltgt.gradle.errorprone.CheckSeverity.OFF)
5357
}
5458
}
5559

src/main/java/com/stripe/net/HttpClient.java

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import com.stripe.Stripe;
44
import com.stripe.exception.ApiConnectionException;
55
import com.stripe.exception.StripeException;
6-
import com.stripe.util.Stopwatch;
76
import java.net.ConnectException;
87
import java.net.SocketTimeoutException;
98
import java.time.Duration;
109
import java.util.HashMap;
1110
import java.util.Map;
12-
import java.util.Optional;
1311
import java.util.concurrent.ThreadLocalRandom;
1412

1513
/** Base abstract class for HTTP clients used to send requests to Stripe's API. */
@@ -20,8 +18,6 @@ public abstract class HttpClient {
2018
/** Minimum sleep time between tries to send HTTP requests after network failure. */
2119
public static final Duration minNetworkRetriesDelay = Duration.ofMillis(500);
2220

23-
private final RequestTelemetry requestTelemetry = new RequestTelemetry();
24-
2521
/** A value indicating whether the client should sleep between automatic request retries. */
2622
boolean networkRetriesSleep = true;
2723

@@ -53,47 +49,27 @@ private interface RequestSendFunction<R> {
5349
R apply(StripeRequest request) throws StripeException;
5450
}
5551

56-
private <T extends AbstractStripeResponse<?>> T sendWithTelemetry(
57-
StripeRequest request, RequestSendFunction<T> send) throws StripeException {
58-
Optional<String> telemetryHeaderValue = requestTelemetry.getHeaderValue(request.headers());
59-
if (telemetryHeaderValue.isPresent()) {
60-
request =
61-
request.withAdditionalHeader(RequestTelemetry.HEADER_NAME, telemetryHeaderValue.get());
62-
}
63-
64-
Stopwatch stopwatch = Stopwatch.startNew();
65-
66-
T response = send.apply(request);
67-
68-
stopwatch.stop();
69-
70-
requestTelemetry.maybeEnqueueMetrics(response, stopwatch.getElapsed());
71-
72-
return response;
73-
}
74-
7552
/**
76-
* Sends the given request to Stripe's API, handling telemetry if not disabled.
77-
*
7853
* @param request the request
7954
* @return the response
8055
* @throws StripeException If the request fails for any reason
56+
* @deprecated Use {@link #request(StripeRequest)} instead.
8157
*/
58+
@Deprecated
8259
public StripeResponse requestWithTelemetry(StripeRequest request) throws StripeException {
83-
return sendWithTelemetry(request, this::request);
60+
return this.request(request);
8461
}
8562

8663
/**
87-
* Sends the given request to Stripe's API, streaming the response, and handling telemetry if not
88-
* disabled.
89-
*
9064
* @param request the request
9165
* @return the response
9266
* @throws StripeException If the request fails for any reason
67+
* @deprecated Use {@link #requestStream(StripeRequest)} instead.
9368
*/
69+
@Deprecated
9470
public StripeResponseStream requestStreamWithTelemetry(StripeRequest request)
9571
throws StripeException {
96-
return sendWithTelemetry(request, this::requestStream);
72+
return this.requestStream(request);
9773
}
9874

9975
public <T extends AbstractStripeResponse<?>> T sendWithRetries(
@@ -142,7 +118,7 @@ public <T extends AbstractStripeResponse<?>> T sendWithRetries(
142118
* @throws StripeException If the request fails for any reason
143119
*/
144120
public StripeResponse requestWithRetries(StripeRequest request) throws StripeException {
145-
return sendWithRetries(request, (r) -> this.requestWithTelemetry(r));
121+
return sendWithRetries(request, (r) -> this.request(r));
146122
}
147123

148124
/**
@@ -155,7 +131,7 @@ public StripeResponse requestWithRetries(StripeRequest request) throws StripeExc
155131
*/
156132
public StripeResponseStream requestStreamWithRetries(StripeRequest request)
157133
throws StripeException {
158-
return sendWithRetries(request, (r) -> this.requestStreamWithTelemetry(r));
134+
return sendWithRetries(request, (r) -> this.requestStream(r));
159135
}
160136

161137
/**

src/main/java/com/stripe/net/LiveStripeResponseGetter.java

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,38 @@
1212
import com.stripe.exception.oauth.UnsupportedResponseTypeException;
1313
import com.stripe.model.*;
1414
import com.stripe.model.oauth.OAuthError;
15+
import com.stripe.util.Stopwatch;
1516
import java.io.IOException;
1617
import java.io.InputStream;
1718
import java.lang.reflect.Type;
1819
import java.util.Map;
20+
import java.util.Optional;
1921

2022
public class LiveStripeResponseGetter implements StripeResponseGetter {
2123
private final HttpClient httpClient;
2224
private final StripeResponseGetterOptions options;
2325

26+
private final RequestTelemetry requestTelemetry = new RequestTelemetry();
27+
28+
@FunctionalInterface
29+
private interface RequestSendFunction<R> {
30+
R apply(StripeRequest request) throws StripeException;
31+
}
32+
33+
private <T extends AbstractStripeResponse<?>> T sendWithTelemetry(
34+
StripeRequest request, RequestSendFunction<T> send) throws StripeException {
35+
36+
Stopwatch stopwatch = Stopwatch.startNew();
37+
38+
T response = send.apply(request);
39+
40+
stopwatch.stop();
41+
42+
requestTelemetry.maybeEnqueueMetrics(response, stopwatch.getElapsed());
43+
44+
return response;
45+
}
46+
2447
/**
2548
* Initializes a new instance of the {@link LiveStripeResponseGetter} class with default
2649
* parameters.
@@ -46,11 +69,18 @@ public LiveStripeResponseGetter(StripeResponseGetterOptions options, HttpClient
4669
private StripeRequest toStripeRequest(ApiRequest apiRequest) throws StripeException {
4770
String fullUrl = fullUrl(apiRequest);
4871

49-
return new StripeRequest(
50-
apiRequest.getMethod(),
51-
fullUrl,
52-
apiRequest.getParams(),
53-
RequestOptions.merge(this.options, apiRequest.getOptions()));
72+
Optional<String> telemetryHeaderValue = requestTelemetry.pollPayload();
73+
StripeRequest request =
74+
new StripeRequest(
75+
apiRequest.getMethod(),
76+
fullUrl,
77+
apiRequest.getParams(),
78+
RequestOptions.merge(this.options, apiRequest.getOptions()));
79+
if (telemetryHeaderValue.isPresent()) {
80+
request =
81+
request.withAdditionalHeader(RequestTelemetry.HEADER_NAME, telemetryHeaderValue.get());
82+
}
83+
return request;
5484
}
5585

5686
@Override
@@ -59,7 +89,7 @@ public <T extends StripeObjectInterface> T request(ApiRequest apiRequest, Type t
5989
throws StripeException {
6090

6191
StripeRequest request = toStripeRequest(apiRequest);
62-
StripeResponse response = httpClient.requestWithRetries(request);
92+
StripeResponse response = sendWithTelemetry(request, r -> httpClient.requestWithRetries(r));
6393

6494
int responseCode = response.code();
6595
String responseBody = response.body();
@@ -89,7 +119,8 @@ public <T extends StripeObjectInterface> T request(ApiRequest apiRequest, Type t
89119
@Override
90120
public InputStream requestStream(ApiRequest apiRequest) throws StripeException {
91121
StripeRequest request = toStripeRequest(apiRequest);
92-
StripeResponseStream responseStream = httpClient.requestStreamWithRetries(request);
122+
StripeResponseStream responseStream =
123+
sendWithTelemetry(request, r -> httpClient.requestStreamWithRetries(r));
93124

94125
int responseCode = responseStream.code();
95126

src/main/java/com/stripe/net/RequestTelemetry.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,18 @@ class RequestTelemetry {
2626
* metrics, or if telemetry is disabled, then the returned {@code Optional} is empty.
2727
*
2828
* @param headers the request headers
29+
* @deprecated Use {$ling {@link #pollPayload()} instead.
2930
*/
31+
@Deprecated
3032
public Optional<String> getHeaderValue(HttpHeaders headers) {
3133
if (headers.firstValue(HEADER_NAME).isPresent()) {
3234
return Optional.empty();
3335
}
3436

37+
return this.pollPayload();
38+
}
39+
40+
public Optional<String> pollPayload() {
3541
RequestMetrics requestMetrics = prevRequestMetrics.poll();
3642
if (requestMetrics == null) {
3743
return Optional.empty();

0 commit comments

Comments
 (0)