breakers 0.2.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9e6817087ef7b241395a0788e84a0ee14cfb476f
4
- data.tar.gz: 95130c9e75c4915a1b6d6fd88bcc8ee8ae7e1564
2
+ SHA256:
3
+ metadata.gz: eb4f99f9230a8a77ef80b47b9c06582f7e885f0f52f52998b1c92fa61070bb0b
4
+ data.tar.gz: 78ec47202acff0af6961a7be2f8735103360bc976df6e32df3ab94eb0de79533
5
5
  SHA512:
6
- metadata.gz: df1d03686061dea6bc19d266463d7d884e5d2610740b6381cdd25c90e48beace78d59f9f7590c275b696d7068d2156e04dd7b5ee6b5bb326d51150b966a27c96
7
- data.tar.gz: 44c580e0f38c489e474fbe8c88ab79a1b2ad0d259973964765c296f0a9e73b08519248a6c134d77e3462e8c1e5fa03060cb6c04288a6ce9abbb6ab802fc8cec2
6
+ metadata.gz: 158c40c57705a319eb1683f27f5fc58fe6da8786e59faf4d7ea05c5868333e55e1885eb8eaa005bb0564ad57931a18eddc12c0278a86ee2ef382820927392b87
7
+ data.tar.gz: d5551fdb570642bb96b0cce674efed1e470454542793d5696a15eace950ed7dd73acde565ff515d790b0157936cb9b3b70f758cf6de8dfc6403aa30e4c4c17c1
data/.rubocop.yml CHANGED
@@ -2,6 +2,8 @@ AllCops:
2
2
  TargetRubyVersion: 2.3
3
3
  Include:
4
4
  - 'Rakefile'
5
+ Exclude:
6
+ - Gemfile
5
7
 
6
8
  Metrics/LineLength:
7
9
  Max: 140
@@ -22,6 +24,9 @@ Metrics/ClassLength:
22
24
  Metrics/MethodLength:
23
25
  Max: 50
24
26
 
27
+ Metrics/BlockLength:
28
+ Max: 500
29
+
25
30
  Metrics/AbcSize:
26
31
  Max: 75
27
32
 
@@ -98,7 +103,7 @@ Style/GuardClause:
98
103
  Style/Next:
99
104
  Enabled: false
100
105
 
101
- Style/IndentArray:
106
+ Layout/IndentArray:
102
107
  EnforcedStyle: consistent
103
108
 
104
109
  # This forces you to change simple if/unless blocks to the conditional form like: `return 2 if badness`.
@@ -149,7 +154,7 @@ Style/WordArray:
149
154
 
150
155
  # Some people really like to put lines at the beginning and end of class bodies, while other people
151
156
  # really don't. It doesn't really seem to matter.
152
- Style/EmptyLinesAroundClassBody:
157
+ Layout/EmptyLinesAroundClassBody:
153
158
  Enabled: false
154
159
 
155
160
  # This forces you to put a comment like this at the top of every single file:
@@ -164,10 +169,10 @@ Style/Lambda:
164
169
  Enabled: false
165
170
 
166
171
  # Force indentation for milti-line expressions and method calls
167
- Style/MultilineOperationIndentation:
172
+ Layout/MultilineOperationIndentation:
168
173
  EnforcedStyle: indented
169
174
 
170
- Style/MultilineMethodCallIndentation:
175
+ Layout/MultilineMethodCallIndentation:
171
176
  EnforcedStyle: indented
172
177
 
173
178
  # This disallows the use of $1, $2 from regular expressions, which seems to make no sense whatsoever
@@ -198,7 +203,7 @@ Style/ZeroLengthPredicate:
198
203
  # ...
199
204
  # end
200
205
  Lint/EndAlignment:
201
- AlignWith: variable
206
+ EnforcedStyleAlignWith: variable
202
207
 
203
208
  # This cop will require you to replace or prefix method arguments that go unused with underscores. The problem
204
209
  # is that while seeming to solve no problem this could easily cause issues where someone editing the code to
data/breakers.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'breakers/version'
@@ -21,7 +22,7 @@ Gem::Specification.new do |spec|
21
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
23
  spec.require_paths = ['lib']
23
24
 
24
- spec.add_dependency 'faraday', ['>= 0.7.4', '< 0.10']
25
+ spec.add_dependency 'faraday', ['>= 0.7.4', '< 2.0']
25
26
  spec.add_dependency 'multi_json', '~> 1.0'
26
27
 
27
28
  spec.add_development_dependency 'bundler', '~> 1.0'
@@ -17,6 +17,7 @@ module Breakers
17
17
  # @option opts [Integer] :seconds_before_retry The number of seconds to wait after an outage begins before testing with a new request
18
18
  # @option opts [Integer] :error_threshold The percentage of errors over the last two minutes that indicates an outage
19
19
  # @option opts [Integer] :data_retention_seconds The number of seconds to retain success and error data in Redis
20
+ # @option opts [Proc] :exception_handler A proc taking an exception and returns true if it represents an error on the service
20
21
  def initialize(opts)
21
22
  @configuration = DEFAULT_OPTS.merge(opts)
22
23
  end
@@ -43,6 +44,13 @@ module Breakers
43
44
  @configuration[:seconds_before_retry]
44
45
  end
45
46
 
47
+ # Returns true if a given exception represents an error with the service
48
+ #
49
+ # @return [Boolean] is it an error?
50
+ def exception_represents_server_error?(exception)
51
+ @configuration[:exception_handler]&.call(exception)
52
+ end
53
+
46
54
  # Indicate that an error has occurred and potentially create an outage
47
55
  def add_error
48
56
  increment_key(key: errors_key)
@@ -35,6 +35,9 @@ module Breakers
35
35
  protected
36
36
 
37
37
  def outage_response(outage:, service:)
38
+ Breakers.client.plugins.each do |plugin|
39
+ plugin.on_skipped_request(service) if plugin.respond_to?(:on_skipped_request)
40
+ end
38
41
  if Breakers.outage_response[:type] == :status_code
39
42
  Faraday::Response.new.tap do |response|
40
43
  response.finish(
@@ -51,7 +54,7 @@ module Breakers
51
54
  def handle_request(service:, request_env:, current_outage: nil)
52
55
  start_time = Time.now
53
56
  return @app.call(request_env).on_complete do |response_env|
54
- response_env[:duration] = Time.now - start_time
57
+ response_env[:duration] = (Time.now - start_time) * 1000
55
58
  if response_env.status >= 500
56
59
  handle_error(
57
60
  service: service,
@@ -69,8 +72,17 @@ module Breakers
69
72
  end
70
73
  end
71
74
  end
75
+ rescue Faraday::TimeoutError, Faraday::ConnectionFailed => e
76
+ handle_error(
77
+ service: service,
78
+ request_env: request_env,
79
+ response_env: nil,
80
+ error: "#{e.class.name} - #{e.message}",
81
+ current_outage: current_outage
82
+ )
83
+ raise
72
84
  rescue => e
73
- unless e.is_a?(Breakers::OutageException)
85
+ if service.exception_represents_server_error?(e)
74
86
  handle_error(
75
87
  service: service,
76
88
  request_env: request_env,
@@ -1,3 +1,3 @@
1
1
  module Breakers
2
- VERSION = '0.2.2'.freeze
2
+ VERSION = '0.5.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breakers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aubrey Holland
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-28 00:00:00.000000000 Z
11
+ date: 2021-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 0.7.4
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '0.10'
22
+ version: '2.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 0.7.4
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '0.10'
32
+ version: '2.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: multi_json
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -200,7 +200,7 @@ homepage: https://github.com/department-of-veterans-affairs/breakers
200
200
  licenses:
201
201
  - CC0-1.0
202
202
  metadata: {}
203
- post_install_message:
203
+ post_install_message:
204
204
  rdoc_options: []
205
205
  require_paths:
206
206
  - lib
@@ -215,10 +215,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
215
  - !ruby/object:Gem::Version
216
216
  version: '0'
217
217
  requirements: []
218
- rubyforge_project:
219
- rubygems_version: 2.5.1
220
- signing_key:
218
+ rubygems_version: 3.0.8
219
+ signing_key:
221
220
  specification_version: 4
222
221
  summary: Handle outages to backend systems with a Faraday middleware
223
222
  test_files: []
224
- has_rdoc: