mirror of
https://github.com/stripe/stripe-ruby.git
synced 2025-10-18 00:01:04 -04:00
Merge pull request #1293 from stripe/richardm-usage
Measure usage of .save
This commit is contained in:
commit
db16cf65c4
2
Makefile
2
Makefile
@ -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
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user