breakers 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/lib/breakers.rb +18 -0
- data/lib/breakers/outage_exception.rb +17 -0
- data/lib/breakers/uptime_middleware.rb +19 -13
- data/lib/breakers/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6eab277573c135bff307496a5ff60036e8e2d7e6
|
4
|
+
data.tar.gz: c1dfd133b1a41f3d9d6f10aede8cdce0265c43e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 869a21c2cd1296d8e98ae7f13dd80352f31af945491e8afc6f2d694c8d057873879c05933551035b2f071902b2a08b7164d2107b7a671507ce1831ec9dc9e098
|
7
|
+
data.tar.gz: 093725a48e5e68c0172cd5cfcfe9e1eb8ddff596501a26a055d27f322a1cba6db77c42296a55e7e309cbcc348414645fec630ea0d975e076c850f20d07047942
|
data/README.md
CHANGED
@@ -154,6 +154,15 @@ service.end_forced_outage!
|
|
154
154
|
Unlike with outages detected by the middleware, forced outages are not periodically tested to see if they have completed and must be
|
155
155
|
manually ended with a call to `end_forced_outage!`.
|
156
156
|
|
157
|
+
### Changing the Outage Response
|
158
|
+
|
159
|
+
By default, if you make a request against a service that is experiencing an outage a Breakers::OutageException will be raised. If you would
|
160
|
+
prefer to receive a response with a certain status code instead, you can change that with:
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
Breakers.outage_response = { type: :status_code, status_code: 503 }
|
164
|
+
```
|
165
|
+
|
157
166
|
### Redis Data Structure
|
158
167
|
|
159
168
|
Data is stored in Redis with the following structure:
|
data/lib/breakers.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'breakers/client'
|
2
2
|
require 'breakers/outage'
|
3
|
+
require 'breakers/outage_exception'
|
3
4
|
require 'breakers/service'
|
4
5
|
require 'breakers/uptime_middleware'
|
5
6
|
require 'breakers/version'
|
@@ -40,4 +41,21 @@ module Breakers
|
|
40
41
|
def self.redis_prefix
|
41
42
|
@redis_prefix || ''
|
42
43
|
end
|
44
|
+
|
45
|
+
# Configure the middleware's handling of outages. The default is to raise a Breakers::OutageException
|
46
|
+
# but you can also request that the response comes back with a configurable status code.
|
47
|
+
#
|
48
|
+
# @param [Hash] opts A hash of options
|
49
|
+
# @option opts [Symbol] :type Pass :exception to raise a Breakers::OutageException when an error occurs. Pass :status_code to respond.
|
50
|
+
# @option opts [Integer] :status_code If the type is :status_code, configure which code to return.
|
51
|
+
def self.outage_response=(opts)
|
52
|
+
@outage_response = { type: :exception }.merge(opts)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Query for the outage response configuration
|
56
|
+
#
|
57
|
+
# @return [Hash] configuration for the outage response, as defined in outage_response=
|
58
|
+
def self.outage_response
|
59
|
+
@outage_response || { type: :exception }
|
60
|
+
end
|
43
61
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Breakers
|
2
|
+
# The error that is raised when a request is made against a service that is
|
3
|
+
# experiencing an outage
|
4
|
+
class OutageException < StandardError
|
5
|
+
attr_reader :outage
|
6
|
+
attr_reader :service
|
7
|
+
|
8
|
+
def initialize(outage, service)
|
9
|
+
@outage = outage
|
10
|
+
@service = service
|
11
|
+
end
|
12
|
+
|
13
|
+
def message
|
14
|
+
"Outage detected on #{@service.name} beginning at #{@outage.start_time.to_i}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -31,12 +31,16 @@ module Breakers
|
|
31
31
|
protected
|
32
32
|
|
33
33
|
def outage_response(outage:, service:)
|
34
|
-
|
35
|
-
response
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
if Breakers.outage_response[:type] == :status_code
|
35
|
+
Faraday::Response.new.tap do |response|
|
36
|
+
response.finish(
|
37
|
+
status: Breakers.outage_response[:status_code],
|
38
|
+
body: "Outage detected on #{service.name} beginning at #{outage.start_time.to_i}",
|
39
|
+
response_headers: {}
|
40
|
+
)
|
41
|
+
end
|
42
|
+
else
|
43
|
+
raise Breakers::OutageException.new(outage, service)
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
@@ -60,13 +64,15 @@ module Breakers
|
|
60
64
|
end
|
61
65
|
end
|
62
66
|
rescue => e
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
67
|
+
unless e.is_a?(Breakers::OutageException)
|
68
|
+
handle_error(
|
69
|
+
service: service,
|
70
|
+
request_env: request_env,
|
71
|
+
response_env: nil,
|
72
|
+
error: "#{e.class.name} - #{e.message}",
|
73
|
+
current_outage: current_outage
|
74
|
+
)
|
75
|
+
end
|
70
76
|
raise
|
71
77
|
end
|
72
78
|
|
data/lib/breakers/version.rb
CHANGED
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aubrey Holland
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -192,6 +192,7 @@ files:
|
|
192
192
|
- lib/breakers.rb
|
193
193
|
- lib/breakers/client.rb
|
194
194
|
- lib/breakers/outage.rb
|
195
|
+
- lib/breakers/outage_exception.rb
|
195
196
|
- lib/breakers/service.rb
|
196
197
|
- lib/breakers/uptime_middleware.rb
|
197
198
|
- lib/breakers/version.rb
|