From 3791cafde97b20ee91af84f483068d9986ffc242 Mon Sep 17 00:00:00 2001 From: Oskar Kapusta Date: Wed, 18 Sep 2019 14:06:45 +0200 Subject: [PATCH 1/2] Allow to set number of retries, timeouts --- lib/appoptics/metrics.rb | 3 ++- lib/appoptics/metrics/client.rb | 9 ++++++--- lib/appoptics/metrics/connection.rb | 23 +++++++++++++++++++---- spec/unit/metrics/connection_spec.rb | 17 +++++++++++++++++ spec/unit/metrics/queue_spec.rb | 16 ++++++++++------ 5 files changed, 54 insertions(+), 14 deletions(-) diff --git a/lib/appoptics/metrics.rb b/lib/appoptics/metrics.rb index 62066cd..8bfd622 100644 --- a/lib/appoptics/metrics.rb +++ b/lib/appoptics/metrics.rb @@ -78,7 +78,8 @@ module Metrics :get_snapshot, :get_source, :metrics, :persistence, :persistence=, :persister, :proxy, :proxy=, :sources, :submit, :update_metric, :update_metrics, - :update_source, :custom_headers= + :update_source, :custom_headers=, :client_timeout=, + :open_timeout=, :retry_count= # The AppOptics::Metrics::Client being used by module-level # access. diff --git a/lib/appoptics/metrics/client.rb b/lib/appoptics/metrics/client.rb index a096c0c..88f79cd 100644 --- a/lib/appoptics/metrics/client.rb +++ b/lib/appoptics/metrics/client.rb @@ -6,8 +6,8 @@ class Client def_delegator :annotator, :add, :annotate - attr_accessor :api_key, :proxy - attr_accessor :custom_headers + attr_accessor :api_key, :proxy, :custom_headers, :client_timeout, + :open_timeout, :retry_count # @example Have the gem build your identifier string # AppOptics::Metrics.agent_identifier 'flintstone', '0.5', 'fred' @@ -63,7 +63,10 @@ def connection # prevent successful creation if no credentials set raise CredentialsMissing unless (self.api_key) @connection ||= Connection.new(client: self, api_endpoint: api_endpoint, - adapter: faraday_adapter, proxy: self.proxy) + adapter: faraday_adapter, proxy: self.proxy, + client_timeout: client_timeout, + open_timeout: open_timeout, + retry_count: retry_count) end # Overrride user agent for this client's connections. If you diff --git a/lib/appoptics/metrics/connection.rb b/lib/appoptics/metrics/connection.rb index 66729a3..5f8e861 100644 --- a/lib/appoptics/metrics/connection.rb +++ b/lib/appoptics/metrics/connection.rb @@ -20,6 +20,9 @@ def initialize(options={}) @api_endpoint = options[:api_endpoint] @adapter = options[:adapter] @proxy = options[:proxy] + @open_timeout = options[:open_timeout] + @client_timeout = options[:client_timeout] + @retry_count = options[:retry_count] end # API endpoint that will be used for requests. @@ -32,10 +35,10 @@ def transport raise(NoClientProvided, "No client provided.") unless @client @transport ||= Faraday::Connection.new( url: api_endpoint + "/v1/", - request: {open_timeout: 20, timeout: 30}) do |f| + request: {open_timeout: open_timeout, timeout: client_timeout}) do |f| f.use AppOptics::Metrics::Middleware::RequestBody - f.use AppOptics::Metrics::Middleware::Retry + f.use AppOptics::Metrics::Middleware::Retry, retry_count f.use AppOptics::Metrics::Middleware::CountRequests f.use AppOptics::Metrics::Middleware::ExpectsStatus @@ -48,11 +51,11 @@ def transport transport.basic_auth @client.api_key, nil end end - + def custom_headers @client.custom_headers end - + def merge_custom_headers(transport) return if custom_headers.nil? custom_headers.each do |key, val| @@ -107,6 +110,18 @@ def transport_adapter end end + def open_timeout + @open_timeout || 20 + end + + def client_timeout + @client_timeout || 30 + end + + def retry_count + @retry_count || 3 + end + end end diff --git a/spec/unit/metrics/connection_spec.rb b/spec/unit/metrics/connection_spec.rb index d84a707..2301fd3 100644 --- a/spec/unit/metrics/connection_spec.rb +++ b/spec/unit/metrics/connection_spec.rb @@ -113,6 +113,23 @@ module Metrics expect(Middleware::CountRequests.total_requests).to eq(4) # did retries expect(status).to eq(502) # body is sent for retries end + + it "doesn't retry with num retries set to 0" do + Middleware::CountRequests.reset + status = 0 + begin + with_rackup('status.ru') do + client.retry_count = 0 + response = client.connection.transport.post do |req| + req.url 'retry_body' + req.body = '{"foo": "bar", "baz": "kaboom"}' + end + end + rescue Exception => error + status = error.response[:status].to_i + end + expect(status).to eq(502) # body is sent for retries + end end end end diff --git a/spec/unit/metrics/queue_spec.rb b/spec/unit/metrics/queue_spec.rb index a9761b4..36813cf 100644 --- a/spec/unit/metrics/queue_spec.rb +++ b/spec/unit/metrics/queue_spec.rb @@ -43,7 +43,7 @@ module Metrics it "raises exception" do expect { Queue.new( - tags: { hostname: "metrics-web-stg-1" } + tags: { hostname: "metrics-web-stg-1" }, source: anything ) }.to raise_error(InvalidParameters) end @@ -102,7 +102,11 @@ module Metrics context "with invalid arguments" do it "raises exception" do expect { - subject.add test: { tags: { hostname: "metrics-web-stg-1" }, value: 123 } + subject.add test: { + value: 123, + source: anything, + tags: { hostname: "metrics-web-stg-1" }, + } }.to raise_error(InvalidParameters) end end @@ -135,10 +139,10 @@ module Metrics subject.add disk_use: {value: 35.4, period: 2, description: 'current disk utilization', measure_time: measure_time, tags: { source: 'db2'}} - expected = {gauges: [{value: 35.4, name: 'disk_use', period: 2, - description: 'current disk utilization', measure_time: measure_time.to_i, - source: 'db2'}]} - expect(subject.queued).to equal_unordered(expected) + expected = {measurements: [{value: 35.4, name: 'disk_use', period: 2, + description: 'current disk utilization', time: measure_time.to_i, + tags: { source: 'db2'}}]} + expect(subject.queued).to eq(expected) end context "with a prefix set" do From b2ddb0a65efa5406893a207cc9d2aafd6571bcb3 Mon Sep 17 00:00:00 2001 From: Oskar Kapusta Date: Fri, 27 Sep 2019 11:45:27 +0200 Subject: [PATCH 2/2] Skip JRuby tests --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f24370d..5481e8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ rvm: - 2.2.6 - 2.3.3 - 2.4.0 - - jruby-19mode + # - jruby-19mode # - rbx - ruby-head