stripe 3.30.0 → 3.31.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: d25c4b43b8450a6e3cd10eaf3ceace0da2068f58c0820640fdd89a6d4a926a4f
4
- data.tar.gz: c61b1f9772ec914cffb1dd86232ea95e77c8ecdb74c9806aa7d0db3af0ca9060
2
+ SHA1:
3
+ metadata.gz: 52baaa63153c557126fa6561e14c544fc5fbbb40
4
+ data.tar.gz: 89e88d7e7730d54188f73270e354b4027ff3ca2e
5
5
  SHA512:
6
- metadata.gz: eebf86824a520894c505579ff7aba5d07767aec03bdca7ffe6c8e5ade709539af8c82e9c146cfe33a1814a426c294bec10666d6923b1248d4d6de20e2f12315e
7
- data.tar.gz: 52249b7edcb8e9a336819a0281ed38f7015162fa5062b6f5b2eb791e5936105baceb05e91f89780ea32d716ea12df92ed0e96ca336324c943024ab3747ee756a
6
+ metadata.gz: db6c1475916245fe94df52771b1a954a25653278e3af489310bbbdf598bf49f4b97db0f7a3dfd0665bc24979c006388c70490e6909678e0e3388a9c54172127a
7
+ data.tar.gz: 58930d60e01262bc61a80953784a6f6b8bab7224f97af80fc550a39982cd663b76b6cf4e99896915f74d1f68b561cb8b84e4ed0db264626e63d89d5f25a24215
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ Gemfile.lock
5
5
  tags
6
6
  /.bundle/
7
7
  coverage/
8
+ .idea/
@@ -18,7 +18,7 @@ Metrics/BlockLength:
18
18
  # Offense count: 8
19
19
  # Configuration parameters: CountComments.
20
20
  Metrics/ClassLength:
21
- Max: 626
21
+ Max: 659
22
22
 
23
23
  # Offense count: 11
24
24
  Metrics/CyclomaticComplexity:
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.31.0 - 2018-11-12
4
+ * [#696](https://github.com/stripe/stripe-ruby/pull/696) Add configurable telemetry to gather information on client-side request latency
5
+
3
6
  ## 3.30.0 - 2018-11-08
4
7
  * [#693](https://github.com/stripe/stripe-ruby/pull/693) Add new API endpoints for the `Invoice` resource.
5
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.30.0
1
+ 3.31.0
@@ -124,6 +124,8 @@ module Stripe
124
124
  @open_timeout = 30
125
125
  @read_timeout = 80
126
126
 
127
+ @enable_telemetry = false
128
+
127
129
  class << self
128
130
  attr_accessor :stripe_account, :api_key, :api_base, :verify_ssl_certs, :api_version, :client_id, :connect_base, :uploads_base,
129
131
  :open_timeout, :read_timeout
@@ -225,6 +227,14 @@ module Stripe
225
227
  @max_network_retries = val.to_i
226
228
  end
227
229
 
230
+ def self.enable_telemetry?
231
+ @enable_telemetry
232
+ end
233
+
234
+ def self.enable_telemetry=(val)
235
+ @enable_telemetry = val
236
+ end
237
+
228
238
  # Sets some basic information about the running application that's sent along
229
239
  # with API requests. Useful for plugin authors to identify their plugin when
230
240
  # communicating with Stripe.
@@ -12,6 +12,7 @@ module Stripe
12
12
  def initialize(conn = nil)
13
13
  self.conn = conn || self.class.default_conn
14
14
  @system_profiler = SystemProfiler.new
15
+ @last_request_metrics = nil
15
16
  end
16
17
 
17
18
  def self.active_client
@@ -113,7 +114,6 @@ module Stripe
113
114
 
114
115
  def execute_request(method, path,
115
116
  api_base: nil, api_key: nil, headers: {}, params: {})
116
-
117
117
  api_base ||= Stripe.api_base
118
118
  api_key ||= Stripe.api_key
119
119
 
@@ -218,6 +218,9 @@ module Stripe
218
218
  resp = yield
219
219
  context = context.dup_from_response(resp)
220
220
  log_response(context, request_start, resp.status, resp.body)
221
+ if Stripe.enable_telemetry?
222
+ @last_request_metrics = StripeRequestMetrics.new(context.request_id, Time.now - request_start)
223
+ end
221
224
 
222
225
  # We rescue all exceptions from a request so that we have an easy spot to
223
226
  # implement our retry logic across the board. We'll re-raise if it's a type
@@ -425,6 +428,10 @@ module Stripe
425
428
  "Content-Type" => "application/x-www-form-urlencoded",
426
429
  }
427
430
 
431
+ if Stripe.enable_telemetry? && !@last_request_metrics.nil?
432
+ headers["X-Stripe-Client-Telemetry"] = JSON.generate(last_request_metrics: @last_request_metrics.payload)
433
+ end
434
+
428
435
  # It is only safe to retry network failures on post and delete
429
436
  # requests if we add an Idempotency-Key header
430
437
  if %i[post delete].include?(method) && Stripe.max_network_retries > 0
@@ -594,5 +601,23 @@ module Stripe
594
601
  }.delete_if { |_k, v| v.nil? }
595
602
  end
596
603
  end
604
+
605
+ # StripeRequestMetrics tracks metadata to be reported to stripe for metrics collection
606
+ class StripeRequestMetrics
607
+ # The Stripe request ID of the response.
608
+ attr_accessor :request_id
609
+
610
+ # Request duration
611
+ attr_accessor :request_duration
612
+
613
+ def initialize(request_id, request_duration)
614
+ self.request_id = request_id
615
+ self.request_duration = request_duration
616
+ end
617
+
618
+ def payload
619
+ { request_id: request_id, request_duration: request_duration }
620
+ end
621
+ end
597
622
  end
598
623
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "3.30.0".freeze
4
+ VERSION = "3.31.0".freeze
5
5
  end
@@ -749,6 +749,51 @@ module Stripe
749
749
  end
750
750
  end
751
751
  end
752
+
753
+ context "#telemetry" do
754
+ teardown do
755
+ # make sure to always set telemetry back to false
756
+ # to not mutate global state
757
+ Stripe.enable_telemetry = false
758
+ end
759
+
760
+ should "not send metrics if enable trace flag is not set" do
761
+ Stripe.enable_telemetry = false
762
+
763
+ trace_metrics_header = nil
764
+ stub_request(:get, "#{Stripe.api_base}/v1/charges")
765
+ .with do |req|
766
+ trace_metrics_header = req.headers["X-Stripe-Client-Telemetry"]
767
+ false
768
+ end.to_return(body: JSON.generate(object: "charge"))
769
+
770
+ Stripe::Charge.list
771
+ assert(trace_metrics_header.nil?)
772
+
773
+ Stripe::Charge.list
774
+ assert(trace_metrics_header.nil?)
775
+ end
776
+
777
+ should "send metrics if enabled telemetry is true" do
778
+ Stripe.enable_telemetry = true
779
+
780
+ trace_metrics_header = nil
781
+ stub_request(:get, "#{Stripe.api_base}/v1/charges")
782
+ .with do |req|
783
+ trace_metrics_header = req.headers["X-Stripe-Client-Telemetry"]
784
+ false
785
+ end.to_return(body: JSON.generate(object: "charge"))
786
+
787
+ Stripe::Charge.list
788
+ Stripe::Charge.list
789
+
790
+ assert(!trace_metrics_header.nil?)
791
+
792
+ trace_payload = JSON.parse(trace_metrics_header)
793
+ assert(trace_payload["last_request_metrics"]["request_id"] == "req_123")
794
+ assert(!trace_payload["last_request_metrics"]["request_duration"].nil?)
795
+ end
796
+ end
752
797
  end
753
798
 
754
799
  class SystemProfilerTest < Test::Unit::TestCase
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.30.0
4
+ version: 3.31.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-09 00:00:00.000000000 Z
11
+ date: 2018-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -223,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
223
  version: '0'
224
224
  requirements: []
225
225
  rubyforge_project:
226
- rubygems_version: 2.7.8
226
+ rubygems_version: 2.6.14
227
227
  signing_key:
228
228
  specification_version: 4
229
229
  summary: Ruby bindings for the Stripe API