Skip to content

Commit

Permalink
Merge pull request #1721 from stripe/richardm-stripe-client-usage
Browse files Browse the repository at this point in the history
Report usage of `stripe_client`
  • Loading branch information
richardm-stripe authored Jan 17, 2024
2 parents 43c477d + 7d87cb6 commit 8052cc8
Show file tree
Hide file tree
Showing 141 changed files with 656 additions and 43 deletions.
33 changes: 31 additions & 2 deletions src/main/java/com/stripe/net/ApiRequest.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,49 @@
package com.stripe.net;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import lombok.Getter;

@Getter
public class ApiRequest extends BaseApiRequest {
private Map<String, Object> params;

private ApiRequest(
BaseAddress baseAddress,
ApiResource.RequestMethod method,
String path,
RequestOptions options,
ApiMode apiMode,
List<String> usage,
Map<String, Object> params) {
super(baseAddress, method, path, options, apiMode, usage);
this.params = params;
}

public ApiRequest(
BaseAddress baseAddress,
ApiResource.RequestMethod method,
String path,
Map<String, Object> params,
RequestOptions options,
ApiMode apiMode) {
super(baseAddress, method, path, options, apiMode);
this.params = params;
this(baseAddress, method, path, options, apiMode, null, params);
}

public ApiRequest addUsage(String usage) {
List<String> newUsage = new ArrayList<>();
if (this.getUsage() != null) {
newUsage.addAll(this.getUsage());
}
newUsage.add(usage);
return new ApiRequest(
this.getBaseAddress(),
this.getMethod(),
this.getPath(),
this.getOptions(),
this.getApiMode(),
newUsage,
this.getParams());
}
}
32 changes: 14 additions & 18 deletions src/main/java/com/stripe/net/BaseApiRequest.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
package com.stripe.net;

import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@AllArgsConstructor(access = AccessLevel.PROTECTED)
class BaseApiRequest {
private BaseAddress baseAddress;
private ApiResource.RequestMethod method;
private String path;
private RequestOptions options;
private ApiMode apiMode;
private final BaseAddress baseAddress;
private final ApiResource.RequestMethod method;
private final String path;
private final RequestOptions options;
private final ApiMode apiMode;

@Setter private List<String> usage;
// TODO (major): Remove setter and make final
private List<String> usage;

public BaseApiRequest(
BaseAddress baseAddress,
ApiResource.RequestMethod method,
String path,
RequestOptions options,
ApiMode apiMode) {
this.baseAddress = baseAddress;
this.method = method;
this.path = path;
this.options = options;
this.apiMode = apiMode;
/** @deprecated Use {@link com.stripe.net.ApiRequest#addUsage(String)} instead. */
@Deprecated
public void setUsage(List<String> usage) {
this.usage = usage;
}
}
1 change: 0 additions & 1 deletion src/main/java/com/stripe/net/HttpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ public StripeResponseStream requestStream(StripeRequest request) throws StripeEx
private interface RequestSendFunction<R> {
R apply(StripeRequest request) throws StripeException;
}

/**
* @param request the request
* @return the response
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/com/stripe/net/LiveStripeResponseGetter.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Optional;

Expand All @@ -31,15 +32,16 @@ private interface RequestSendFunction<R> {
}

private <T extends AbstractStripeResponse<?>> T sendWithTelemetry(
StripeRequest request, RequestSendFunction<T> send) throws StripeException {
StripeRequest request, List<String> usage, RequestSendFunction<T> send)
throws StripeException {

Stopwatch stopwatch = Stopwatch.startNew();

T response = send.apply(request);

stopwatch.stop();

requestTelemetry.maybeEnqueueMetrics(response, stopwatch.getElapsed());
requestTelemetry.maybeEnqueueMetrics(response, stopwatch.getElapsed(), usage);

return response;
}
Expand Down Expand Up @@ -89,7 +91,8 @@ public <T extends StripeObjectInterface> T request(ApiRequest apiRequest, Type t
throws StripeException {

StripeRequest request = toStripeRequest(apiRequest);
StripeResponse response = sendWithTelemetry(request, r -> httpClient.requestWithRetries(r));
StripeResponse response =
sendWithTelemetry(request, apiRequest.getUsage(), r -> httpClient.requestWithRetries(r));

int responseCode = response.code();
String responseBody = response.body();
Expand Down Expand Up @@ -120,7 +123,8 @@ public <T extends StripeObjectInterface> T request(ApiRequest apiRequest, Type t
public InputStream requestStream(ApiRequest apiRequest) throws StripeException {
StripeRequest request = toStripeRequest(apiRequest);
StripeResponseStream responseStream =
sendWithTelemetry(request, r -> httpClient.requestStreamWithRetries(r));
sendWithTelemetry(
request, apiRequest.getUsage(), r -> httpClient.requestStreamWithRetries(r));

int responseCode = responseStream.code();

Expand Down
24 changes: 22 additions & 2 deletions src/main/java/com/stripe/net/RequestTelemetry.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.google.gson.annotations.SerializedName;
import com.stripe.Stripe;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentLinkedQueue;
import lombok.Data;
Expand Down Expand Up @@ -51,14 +53,25 @@ public Optional<String> pollPayload() {
return Optional.of(gson.toJson(payload));
}

// TODO (major) remove this overload
/**
* @deprecated use {@link #maybeEnqueueMetrics(AbstractStripeResponse, Duration, List)} instead.
*/
@Deprecated
public void maybeEnqueueMetrics(AbstractStripeResponse<?> response, Duration duration) {
maybeEnqueueMetrics(response, duration, new ArrayList<String>());
}

/**
* If telemetry is enabled and the queue is not full, then enqueue a new metrics item; otherwise,
* do nothing.
*
* @param response the Stripe response
* @param duration the request duration
* @param usage a list of tracked features used by the corresponding request
*/
public void maybeEnqueueMetrics(AbstractStripeResponse<?> response, Duration duration) {
public void maybeEnqueueMetrics(
AbstractStripeResponse<?> response, Duration duration, List<String> usage) {
if (!Stripe.enableTelemetry) {
return;
}
Expand All @@ -71,7 +84,11 @@ public void maybeEnqueueMetrics(AbstractStripeResponse<?> response, Duration dur
return;
}

RequestMetrics metrics = new RequestMetrics(response.requestId(), duration.toMillis());
if (usage != null && usage.size() == 0) {
usage = null;
}

RequestMetrics metrics = new RequestMetrics(response.requestId(), duration.toMillis(), usage);
prevRequestMetrics.add(metrics);
}

Expand All @@ -88,5 +105,8 @@ private static class RequestMetrics {

@SerializedName("request_duration_ms")
private final long requestDurationMs;

@SerializedName("usage")
private final List<String> usage;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@

/** Controls how the request is sent by {@link StripeResponseGetter} */
public abstract class StripeResponseGetterOptions {

// When adding setting here keep them in sync with settings in RequestOptions and
// When adding settings here keep them in sync with settings in RequestOptions and
// in the RequestOptions.merge method
public abstract String getApiKey();

Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/stripe/service/AccountLinkService.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public AccountLink create(AccountLinkCreateParams params, RequestOptions options
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, AccountLink.class);
}
}
7 changes: 7 additions & 0 deletions src/main/java/com/stripe/service/AccountService.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public Account delete(String account, RequestOptions options) throws StripeExcep
ApiRequest request =
new ApiRequest(
BaseAddress.API, ApiResource.RequestMethod.DELETE, path, null, options, ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Account.class);
}
/** Retrieves the details of an account. */
Expand All @@ -81,6 +82,7 @@ public Account retrieve(String account, AccountRetrieveParams params, RequestOpt
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Account.class);
}
/**
Expand Down Expand Up @@ -163,6 +165,7 @@ public Account update(String account, AccountUpdateParams params, RequestOptions
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Account.class);
}
/** Retrieves the details of an account. */
Expand All @@ -189,6 +192,7 @@ public Account retrieveCurrent(AccountRetrieveCurrentParams params, RequestOptio
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Account.class);
}
/**
Expand Down Expand Up @@ -231,6 +235,7 @@ public StripeCollection<Account> list(AccountListParams params, RequestOptions o
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter()
.request(request, new TypeToken<StripeCollection<Account>>() {}.getType());
}
Expand Down Expand Up @@ -293,6 +298,7 @@ public Account create(AccountCreateParams params, RequestOptions options) throws
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Account.class);
}
/**
Expand Down Expand Up @@ -323,6 +329,7 @@ public Account reject(String account, AccountRejectParams params, RequestOptions
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Account.class);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public AccountSession create(AccountSessionCreateParams params, RequestOptions o
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, AccountSession.class);
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/stripe/service/ApplePayDomainService.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public ApplePayDomain delete(String domain, RequestOptions options) throws Strip
ApiRequest request =
new ApiRequest(
BaseAddress.API, ApiResource.RequestMethod.DELETE, path, null, options, ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, ApplePayDomain.class);
}
/** Retrieve an apple pay domain. */
Expand Down Expand Up @@ -60,6 +61,7 @@ public ApplePayDomain retrieve(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, ApplePayDomain.class);
}
/** List apple pay domains. */
Expand Down Expand Up @@ -87,6 +89,7 @@ public StripeCollection<ApplePayDomain> list(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter()
.request(request, new TypeToken<StripeCollection<ApplePayDomain>>() {}.getType());
}
Expand All @@ -106,6 +109,7 @@ public ApplePayDomain create(ApplePayDomainCreateParams params, RequestOptions o
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, ApplePayDomain.class);
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/stripe/service/ApplicationFeeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public StripeCollection<ApplicationFee> list(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter()
.request(request, new TypeToken<StripeCollection<ApplicationFee>>() {}.getType());
}
Expand Down Expand Up @@ -99,6 +100,7 @@ public ApplicationFee retrieve(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, ApplicationFee.class);
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/stripe/service/BalanceService.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public Balance retrieve(BalanceRetrieveParams params, RequestOptions options)
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Balance.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ public StripeCollection<BalanceTransaction> list(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter()
.request(request, new TypeToken<StripeCollection<BalanceTransaction>>() {}.getType());
}
Expand Down Expand Up @@ -119,6 +120,7 @@ public BalanceTransaction retrieve(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, BalanceTransaction.class);
}
}
1 change: 1 addition & 0 deletions src/main/java/com/stripe/service/BankAccountService.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public BankAccount verify(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, BankAccount.class);
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/stripe/service/CapabilityService.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public StripeCollection<Capability> list(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter()
.request(request, new TypeToken<StripeCollection<Capability>>() {}.getType());
}
Expand Down Expand Up @@ -93,6 +94,7 @@ public Capability retrieve(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Capability.class);
}
/**
Expand Down Expand Up @@ -137,6 +139,7 @@ public Capability update(
ApiRequestParams.paramsToMap(params),
options,
ApiMode.V1);
request = request.addUsage("stripe_client");
return getResponseGetter().request(request, Capability.class);
}
}
Loading

0 comments on commit 8052cc8

Please sign in to comment.