resilient 0.4.0.beta2 → 0.4.0.beta3
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 +4 -4
- data/lib/resilient/circuit_breaker.rb +16 -30
- data/lib/resilient/circuit_breaker/properties.rb +12 -0
- data/lib/resilient/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17c72fc869fd44e4732ac9f438a8303489ca6bed
|
4
|
+
data.tar.gz: 1dcf39dc5da88e0a4d2c62d9d506118e2d807773
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc8a77ebfedd6e9e46d1d12055c989583c1bf9274b646d3d6df4cd85f5095a8c9de72af980fbcdc0e9556c141095a47e71defaf84540ffefbb245b17484eb40a
|
7
|
+
data.tar.gz: 93efab2978a8e1562d835af261a362172ec708a1f211d22faf0bf78acea3f89d2f2020b4ecf45a760ae90a57c2d4ec81da360026afa67abbcdaa9530582f9be3
|
@@ -2,20 +2,23 @@ require "resilient/key"
|
|
2
2
|
require "resilient/circuit_breaker/metrics"
|
3
3
|
require "resilient/circuit_breaker/properties"
|
4
4
|
require "resilient/circuit_breaker/registry"
|
5
|
+
require "forwardable"
|
5
6
|
|
6
7
|
module Resilient
|
7
8
|
class CircuitBreaker
|
9
|
+
extend Forwardable
|
10
|
+
|
8
11
|
# Public: Returns an instance of circuit breaker based on key and registry.
|
9
12
|
# Default registry is used if none is provided. If key does not exist, it is
|
10
13
|
# registered. If key does exist, it returns registered instance instead of
|
11
14
|
# allocating a new instance in order to ensure that state/metrics are the
|
12
15
|
# same per key.
|
13
16
|
#
|
14
|
-
# See #initialize for docs on key
|
15
|
-
def self.get(key, properties = nil,
|
17
|
+
# See #initialize for docs on key and properties.
|
18
|
+
def self.get(key, properties = nil, registry = nil)
|
16
19
|
key = Key.wrap(key)
|
17
20
|
(registry || Registry.default).fetch(key) {
|
18
|
-
new(key, properties
|
21
|
+
new(key, properties)
|
19
22
|
}
|
20
23
|
end
|
21
24
|
|
@@ -26,10 +29,11 @@ module Resilient
|
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
32
|
+
def_delegator :@properties, :metrics
|
33
|
+
|
29
34
|
attr_reader :key
|
30
35
|
attr_reader :open
|
31
36
|
attr_reader :opened_or_last_checked_at_epoch
|
32
|
-
attr_reader :metrics
|
33
37
|
attr_reader :properties
|
34
38
|
|
35
39
|
# Private: Builds new instance of a CircuitBreaker.
|
@@ -41,32 +45,14 @@ module Resilient
|
|
41
45
|
# circuit breaker should behave. Optional. Defaults to new
|
42
46
|
# Resilient::CircuitBreaker::Properties instance.
|
43
47
|
#
|
44
|
-
# metrics - The object that stores successes and failures. Optional.
|
45
|
-
# Defaults to new Resilient::CircuitBreaker::Metrics instance
|
46
|
-
# based on window size and bucket size properties.
|
47
|
-
#
|
48
48
|
# Returns CircuitBreaker instance.
|
49
|
-
def initialize(key, properties = nil
|
49
|
+
def initialize(key, properties = nil)
|
50
50
|
raise ArgumentError, "key argument is required" if key.nil?
|
51
51
|
|
52
52
|
@key = Key.wrap(key)
|
53
|
+
@properties = Properties.wrap(properties)
|
53
54
|
@open = false
|
54
55
|
@opened_or_last_checked_at_epoch = 0
|
55
|
-
|
56
|
-
@properties = if properties
|
57
|
-
Properties.wrap(properties)
|
58
|
-
else
|
59
|
-
Properties.new
|
60
|
-
end
|
61
|
-
|
62
|
-
@metrics = if metrics
|
63
|
-
metrics
|
64
|
-
else
|
65
|
-
Metrics.new({
|
66
|
-
window_size_in_seconds: @properties.window_size_in_seconds,
|
67
|
-
bucket_size_in_seconds: @properties.bucket_size_in_seconds,
|
68
|
-
})
|
69
|
-
end
|
70
56
|
end
|
71
57
|
|
72
58
|
def allow_request?
|
@@ -95,7 +81,7 @@ module Resilient
|
|
95
81
|
payload[:closed_the_circuit] = true
|
96
82
|
close_circuit
|
97
83
|
else
|
98
|
-
|
84
|
+
metrics.success
|
99
85
|
end
|
100
86
|
nil
|
101
87
|
}
|
@@ -103,7 +89,7 @@ module Resilient
|
|
103
89
|
|
104
90
|
def failure
|
105
91
|
instrument("resilient.circuit_breaker.failure", key: @key) { |payload|
|
106
|
-
|
92
|
+
metrics.failure
|
107
93
|
nil
|
108
94
|
}
|
109
95
|
end
|
@@ -112,7 +98,7 @@ module Resilient
|
|
112
98
|
instrument("resilient.circuit_breaker.reset", key: @key) { |payload|
|
113
99
|
@open = false
|
114
100
|
@opened_or_last_checked_at_epoch = 0
|
115
|
-
|
101
|
+
metrics.reset
|
116
102
|
nil
|
117
103
|
}
|
118
104
|
end
|
@@ -127,15 +113,15 @@ module Resilient
|
|
127
113
|
def close_circuit
|
128
114
|
@open = false
|
129
115
|
@opened_or_last_checked_at_epoch = 0
|
130
|
-
|
116
|
+
metrics.reset
|
131
117
|
end
|
132
118
|
|
133
119
|
def under_request_volume_threshold?
|
134
|
-
|
120
|
+
metrics.requests < @properties.request_volume_threshold
|
135
121
|
end
|
136
122
|
|
137
123
|
def under_error_threshold_percentage?
|
138
|
-
|
124
|
+
metrics.error_percentage < @properties.error_threshold_percentage
|
139
125
|
end
|
140
126
|
|
141
127
|
def open?
|
@@ -12,6 +12,8 @@ module Resilient
|
|
12
12
|
hash_or_instance
|
13
13
|
when Hash
|
14
14
|
new(hash_or_instance)
|
15
|
+
when NilClass
|
16
|
+
new
|
15
17
|
else
|
16
18
|
raise TypeError, "properties must be Hash or Resilient::Properties instance"
|
17
19
|
end
|
@@ -45,6 +47,9 @@ module Resilient
|
|
45
47
|
# size of buckets in statistical window
|
46
48
|
attr_reader :bucket_size_in_seconds
|
47
49
|
|
50
|
+
# metrics instance used to keep track of success and failure
|
51
|
+
attr_reader :metrics
|
52
|
+
|
48
53
|
def initialize(options = {})
|
49
54
|
@force_open = options.fetch(:force_open, false)
|
50
55
|
@force_closed = options.fetch(:force_closed, false)
|
@@ -64,6 +69,13 @@ module Resilient
|
|
64
69
|
"window_size_in_seconds must be perfectly divisible by" +
|
65
70
|
" bucket_size_in_seconds in order to evenly partition the buckets"
|
66
71
|
end
|
72
|
+
|
73
|
+
@metrics = options.fetch(:metrics) {
|
74
|
+
Metrics.new({
|
75
|
+
window_size_in_seconds: @window_size_in_seconds,
|
76
|
+
bucket_size_in_seconds: @bucket_size_in_seconds,
|
77
|
+
})
|
78
|
+
}
|
67
79
|
end
|
68
80
|
end
|
69
81
|
end
|
data/lib/resilient/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resilient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.0.
|
4
|
+
version: 0.4.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|