Merge pull request #1293 from stripe/richardm-usage

Measure usage of .save
This commit is contained in:
Richard Marmorstein 2023-12-01 14:02:11 -08:00 committed by GitHub
commit db16cf65c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 27 deletions

View File

@ -5,7 +5,7 @@ update-version:
codegen-format: codegen-format:
bundle install --quiet bundle install --quiet
bundle exec rubocop -o /dev/null --auto-correct bundle exec rubocop -o /dev/null --autocorrect
ci-test: ci-test:
bundle install && bundle exec rake test bundle install && bundle exec rake test

View File

@ -291,10 +291,11 @@ Stripe.set_app_info('MyAwesomePlugin', version: '1.2.34', url: 'https://myawesom
This information is passed along when the library makes calls to the Stripe This information is passed along when the library makes calls to the Stripe
API. API.
### Request latency telemetry ### Telemetry
By default, the library sends request latency telemetry to Stripe. These By default, the library sends telemetry to Stripe regarding request latency and feature usage. These
numbers help Stripe improve the overall latency of its API for all users. numbers help Stripe improve the overall latency of its API for all users, and
improve popular features.
You can disable this behavior if you prefer: You can disable this behavior if you prefer:

View File

@ -5,14 +5,14 @@ module Stripe
module Request module Request
module ClassMethods module ClassMethods
def execute_resource_request(method, url, def execute_resource_request(method, url,
params = {}, opts = {}) params = {}, opts = {}, usage = [])
execute_resource_request_internal( execute_resource_request_internal(
:execute_request, method, url, params, opts :execute_request, method, url, params, opts, usage
) )
end end
def execute_resource_request_stream(method, url, def execute_resource_request_stream(method, url,
params = {}, opts = {}, params = {}, opts = {}, usage = [],
&read_body_chunk_block) &read_body_chunk_block)
execute_resource_request_internal( execute_resource_request_internal(
:execute_request_stream, :execute_request_stream,
@ -20,18 +20,19 @@ module Stripe
url, url,
params, params,
opts, opts,
usage,
&read_body_chunk_block &read_body_chunk_block
) )
end end
private def request_stripe_object(method:, path:, params:, opts: {}) private def request_stripe_object(method:, path:, params:, opts: {}, usage: [])
resp, opts = execute_resource_request(method, path, params, opts) resp, opts = execute_resource_request(method, path, params, opts, usage)
Util.convert_to_stripe_object_with_params(resp.data, params, opts) Util.convert_to_stripe_object_with_params(resp.data, params, opts)
end end
private def execute_resource_request_internal(client_request_method_sym, private def execute_resource_request_internal(client_request_method_sym,
method, url, method, url,
params, opts, params, opts, usage,
&read_body_chunk_block) &read_body_chunk_block)
params ||= {} params ||= {}
@ -53,7 +54,7 @@ module Stripe
client_request_method_sym, client_request_method_sym,
method, url, method, url,
api_base: api_base, api_key: api_key, api_base: api_base, api_key: api_key,
headers: headers, params: params, headers: headers, params: params, usage: usage,
&read_body_chunk_block &read_body_chunk_block
) )
@ -66,6 +67,7 @@ module Stripe
[resp, opts_to_persist] [resp, opts_to_persist]
end end
# TODO: (major)
# This method used to be called `request`, but it's such a short name # This method used to be called `request`, but it's such a short name
# that it eventually conflicted with the name of a field on an API # that it eventually conflicted with the name of a field on an API
# resource (specifically, `Event#request`), so it was renamed to # resource (specifically, `Event#request`), so it was renamed to
@ -111,9 +113,9 @@ module Stripe
end end
protected def execute_resource_request(method, url, protected def execute_resource_request(method, url,
params = {}, opts = {}) params = {}, opts = {}, usage = [])
opts = @opts.merge(Util.normalize_opts(opts)) opts = @opts.merge(Util.normalize_opts(opts))
self.class.execute_resource_request(method, url, params, opts) self.class.execute_resource_request(method, url, params, opts, usage)
end end
protected def execute_resource_request_stream(method, url, protected def execute_resource_request_stream(method, url,
@ -125,8 +127,8 @@ module Stripe
) )
end end
private def request_stripe_object(method:, path:, params:, opts: {}) private def request_stripe_object(method:, path:, params:, opts: {}, usage: [])
resp, opts = execute_resource_request(method, path, params, opts) resp, opts = execute_resource_request(method, path, params, opts, usage)
Util.convert_to_stripe_object_with_params(resp.data, params, opts) Util.convert_to_stripe_object_with_params(resp.data, params, opts)
end end

View File

@ -66,7 +66,7 @@ module Stripe
# generated a uri for this object with an identifier baked in # generated a uri for this object with an identifier baked in
values.delete(:id) values.delete(:id)
resp, opts = execute_resource_request(:post, save_url, values, opts) resp, opts = execute_resource_request(:post, save_url, values, opts, ["save"])
initialize_from(resp.data, opts) initialize_from(resp.data, opts)
end end
extend Gem::Deprecate extend Gem::Deprecate

View File

@ -209,9 +209,9 @@ module Stripe
end end
def execute_request(method, path, def execute_request(method, path,
api_base: nil, api_key: nil, headers: {}, params: {}) api_base: nil, api_key: nil, headers: {}, params: {}, usage: [])
http_resp, api_key = execute_request_internal( http_resp, api_key = execute_request_internal(
method, path, api_base, api_key, headers, params method, path, api_base, api_key, headers, params, usage
) )
begin begin
@ -240,7 +240,7 @@ module Stripe
# passed, then a StripeStreamResponse is returned containing an IO stream # passed, then a StripeStreamResponse is returned containing an IO stream
# with the response body. # with the response body.
def execute_request_stream(method, path, def execute_request_stream(method, path,
api_base: nil, api_key: nil, api_base: nil, api_key: nil, usage: [],
headers: {}, params: {}, headers: {}, params: {},
&read_body_chunk_block) &read_body_chunk_block)
unless block_given? unless block_given?
@ -249,7 +249,7 @@ module Stripe
end end
http_resp, api_key = execute_request_internal( http_resp, api_key = execute_request_internal(
method, path, api_base, api_key, headers, params, &read_body_chunk_block method, path, api_base, api_key, headers, params, usage, &read_body_chunk_block
) )
# When the read_body_chunk_block is given, we no longer have access to the # When the read_body_chunk_block is given, we no longer have access to the
@ -428,7 +428,7 @@ module Stripe
end end
private def execute_request_internal(method, path, private def execute_request_internal(method, path,
api_base, api_key, headers, params, api_base, api_key, headers, params, usage,
&read_body_chunk_block) &read_body_chunk_block)
raise ArgumentError, "method should be a symbol" \ raise ArgumentError, "method should be a symbol" \
unless method.is_a?(Symbol) unless method.is_a?(Symbol)
@ -490,7 +490,7 @@ module Stripe
end end
http_resp = http_resp =
execute_request_with_rescues(method, api_base, headers, context) do execute_request_with_rescues(method, api_base, headers, usage, context) do
self.class self.class
.default_connection_manager(config) .default_connection_manager(config)
.execute_request(method, url, .execute_request(method, url,
@ -560,7 +560,7 @@ module Stripe
http_status >= 400 http_status >= 400
end end
private def execute_request_with_rescues(method, api_base, headers, context) private def execute_request_with_rescues(method, api_base, headers, usage, context)
num_retries = 0 num_retries = 0
begin begin
@ -586,7 +586,7 @@ module Stripe
if config.enable_telemetry? && context.request_id if config.enable_telemetry? && context.request_id
request_duration_ms = (request_duration * 1000).to_i request_duration_ms = (request_duration * 1000).to_i
@last_request_metrics = @last_request_metrics =
StripeRequestMetrics.new(context.request_id, request_duration_ms) StripeRequestMetrics.new(context.request_id, request_duration_ms, usage: usage)
end end
# We rescue all exceptions from a request so that we have an easy spot to # We rescue all exceptions from a request so that we have an easy spot to
@ -1038,13 +1038,19 @@ module Stripe
# Request duration in milliseconds # Request duration in milliseconds
attr_accessor :request_duration_ms attr_accessor :request_duration_ms
def initialize(request_id, request_duration_ms) # list of names of tracked behaviors associated with this request
attr_accessor :usage
def initialize(request_id, request_duration_ms, usage: [])
self.request_id = request_id self.request_id = request_id
self.request_duration_ms = request_duration_ms self.request_duration_ms = request_duration_ms
self.usage = usage
end end
def payload def payload
{ request_id: request_id, request_duration_ms: request_duration_ms } ret = { request_id: request_id, request_duration_ms: request_duration_ms }
ret[:usage] = usage if !usage.nil? && !usage.empty?
ret
end end
end end
end end

View File

@ -1408,14 +1408,24 @@ module Stripe
false false
end.to_return(body: JSON.generate(object: "charge")) end.to_return(body: JSON.generate(object: "charge"))
Stripe::Charge.list cus = Stripe::Customer.new("cus_xyz")
cus.description = "hello"
cus.save
Stripe::Charge.list Stripe::Charge.list
assert(!trace_metrics_header.nil?) assert(!trace_metrics_header.nil?)
trace_payload = JSON.parse(trace_metrics_header) trace_payload = JSON.parse(trace_metrics_header)
assert(trace_payload["last_request_metrics"]["request_id"] == "req_123") assert(trace_payload["last_request_metrics"]["request_id"] == "req_123")
assert(!trace_payload["last_request_metrics"]["request_duration_ms"].nil?) assert(!trace_payload["last_request_metrics"]["request_duration_ms"].nil?)
assert(trace_payload["last_request_metrics"]["usage"] == ["save"])
Stripe::Charge.list
trace_payload = JSON.parse(trace_metrics_header)
assert(trace_payload["last_request_metrics"]["request_id"] == "req_123")
assert(!trace_payload["last_request_metrics"]["request_duration_ms"].nil?)
assert(trace_payload["last_request_metrics"]["usage"].nil?)
end end
end end