circuitbox 1.1.1 → 2.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +60 -122
  3. data/lib/circuitbox.rb +15 -52
  4. data/lib/circuitbox/circuit_breaker.rb +131 -141
  5. data/lib/circuitbox/circuit_breaker/logger_messages.rb +31 -0
  6. data/lib/circuitbox/configuration.rb +53 -0
  7. data/lib/circuitbox/errors/error.rb +1 -2
  8. data/lib/circuitbox/errors/open_circuit_error.rb +0 -1
  9. data/lib/circuitbox/errors/service_failure_error.rb +2 -1
  10. data/lib/circuitbox/excon_middleware.rb +15 -24
  11. data/lib/circuitbox/faraday_middleware.rb +35 -61
  12. data/lib/circuitbox/memory_store.rb +76 -0
  13. data/lib/circuitbox/memory_store/compactor.rb +35 -0
  14. data/lib/circuitbox/memory_store/container.rb +28 -0
  15. data/lib/circuitbox/memory_store/monotonic_time.rb +11 -0
  16. data/lib/circuitbox/notifier/active_support.rb +19 -0
  17. data/lib/circuitbox/notifier/null.rb +11 -0
  18. data/lib/circuitbox/timer/monotonic.rb +17 -0
  19. data/lib/circuitbox/timer/null.rb +9 -0
  20. data/lib/circuitbox/timer/simple.rb +13 -0
  21. data/lib/circuitbox/version.rb +1 -1
  22. metadata +78 -150
  23. data/.gitignore +0 -20
  24. data/.ruby-version +0 -1
  25. data/.travis.yml +0 -9
  26. data/Gemfile +0 -6
  27. data/Rakefile +0 -30
  28. data/benchmark/circuit_store_benchmark.rb +0 -114
  29. data/circuitbox.gemspec +0 -48
  30. data/lib/circuitbox/notifier.rb +0 -34
  31. data/test/circuit_breaker_test.rb +0 -436
  32. data/test/circuitbox_test.rb +0 -45
  33. data/test/excon_middleware_test.rb +0 -131
  34. data/test/faraday_middleware_test.rb +0 -175
  35. data/test/integration/circuitbox_cross_process_open_test.rb +0 -56
  36. data/test/integration/faraday_middleware_test.rb +0 -78
  37. data/test/integration_helper.rb +0 -48
  38. data/test/notifier_test.rb +0 -21
  39. data/test/service_failure_error_test.rb +0 -23
  40. data/test/test_helper.rb +0 -15
@@ -0,0 +1,28 @@
1
+ require_relative 'monotonic_time'
2
+
3
+ class Circuitbox
4
+ class MemoryStore
5
+ class Container
6
+ include MonotonicTime
7
+
8
+ attr_accessor :value
9
+
10
+ def initialize(value:, expiry: 0)
11
+ @value = value
12
+ expires_after(expiry)
13
+ end
14
+
15
+ def expired?
16
+ @expires_after > 0 && @expires_after < current_second
17
+ end
18
+
19
+ def expired_at?(clock_second)
20
+ @expires_after > 0 && @expires_after < clock_second
21
+ end
22
+
23
+ def expires_after(seconds = 0)
24
+ @expires_after = seconds.zero? ? seconds : current_second + seconds
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ class Circuitbox
2
+ class MemoryStore
3
+ module MonotonicTime
4
+ module_function
5
+
6
+ def current_second
7
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Circuitbox
4
+ class Notifier
5
+ class ActiveSupport
6
+ def notify(circuit_name, event)
7
+ ::ActiveSupport::Notifications.instrument("circuit_#{event}", circuit: circuit_name)
8
+ end
9
+
10
+ def notify_warning(circuit_name, message)
11
+ ::ActiveSupport::Notifications.instrument('circuit_warning', circuit: circuit_name, message: message)
12
+ end
13
+
14
+ def metric_gauge(circuit_name, gauge, value)
15
+ ::ActiveSupport::Notifications.instrument('circuit_gauge', circuit: circuit_name, gauge: gauge, value: value)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ class Circuitbox
2
+ class Notifier
3
+ class Null
4
+ def notify(_, _); end
5
+
6
+ def notify_warning(_, _); end
7
+
8
+ def metric_gauge(_, _, _); end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ class Circuitbox
2
+ class Timer
3
+ class Monotonic
4
+ def initialize(time_unit = :millisecond)
5
+ @time_unit = time_unit
6
+ end
7
+
8
+ def time(service, notifier, metric_name)
9
+ before = Process.clock_gettime(Process::CLOCK_MONOTONIC, @time_unit)
10
+ result = yield
11
+ total_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, @time_unit) - before
12
+ notifier.metric_gauge(service, metric_name, total_time)
13
+ result
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ class Circuitbox
2
+ class Timer
3
+ class Null
4
+ def time(_service, _notifier, _metric_name)
5
+ yield
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class Circuitbox
2
+ class Timer
3
+ class Simple
4
+ def time(service, notifier, metric_name)
5
+ before = Time.now.to_f
6
+ result = yield
7
+ total_time = Time.now.to_f - before
8
+ notifier.metric_gauge(service, metric_name, total_time)
9
+ result
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  class Circuitbox
2
- VERSION='1.1.1'
2
+ VERSION = '2.0.0.pre1'.freeze
3
3
  end
metadata CHANGED
@@ -1,277 +1,215 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: circuitbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fahim Ferdous
8
+ - Matthew Shafer
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-03-02 00:00:00.000000000 Z
12
+ date: 2019-01-10 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ">="
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '0'
20
+ version: '1.16'
20
21
  type: :development
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ">="
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '0'
27
+ version: '1.16'
27
28
  - !ruby/object:Gem::Dependency
28
- name: rake
29
+ name: excon
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - ">="
32
+ - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: '0'
34
+ version: '0.62'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - ">="
39
+ - - "~>"
39
40
  - !ruby/object:Gem::Version
40
- version: '0'
41
+ version: '0.62'
41
42
  - !ruby/object:Gem::Dependency
42
- name: rack
43
+ name: faraday
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
- - - ">="
46
+ - - "~>"
46
47
  - !ruby/object:Gem::Version
47
- version: '0'
48
+ version: '0.15'
48
49
  type: :development
49
50
  prerelease: false
50
51
  version_requirements: !ruby/object:Gem::Requirement
51
52
  requirements:
52
- - - ">="
53
+ - - "~>"
53
54
  - !ruby/object:Gem::Version
54
- version: '0'
55
+ version: '0.15'
55
56
  - !ruby/object:Gem::Dependency
56
57
  name: gimme
57
58
  requirement: !ruby/object:Gem::Requirement
58
59
  requirements:
59
- - - ">="
60
+ - - "~>"
60
61
  - !ruby/object:Gem::Version
61
- version: '0'
62
+ version: '0.5'
62
63
  type: :development
63
64
  prerelease: false
64
65
  version_requirements: !ruby/object:Gem::Requirement
65
66
  requirements:
66
- - - ">="
67
+ - - "~>"
67
68
  - !ruby/object:Gem::Version
68
- version: '0'
69
+ version: '0.5'
69
70
  - !ruby/object:Gem::Dependency
70
71
  name: minitest
71
72
  requirement: !ruby/object:Gem::Requirement
72
73
  requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: mocha
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: typhoeus
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: timecop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
74
+ - - "~>"
116
75
  - !ruby/object:Gem::Version
117
- version: '0'
76
+ version: '5.11'
118
77
  type: :development
119
78
  prerelease: false
120
79
  version_requirements: !ruby/object:Gem::Requirement
121
80
  requirements:
122
- - - ">="
81
+ - - "~>"
123
82
  - !ruby/object:Gem::Version
124
- version: '0'
83
+ version: '5.11'
125
84
  - !ruby/object:Gem::Dependency
126
- name: faraday
85
+ name: minitest-excludes
127
86
  requirement: !ruby/object:Gem::Requirement
128
87
  requirements:
129
- - - ">="
88
+ - - "~>"
130
89
  - !ruby/object:Gem::Version
131
- version: '0'
90
+ version: '2.0'
132
91
  type: :development
133
92
  prerelease: false
134
93
  version_requirements: !ruby/object:Gem::Requirement
135
94
  requirements:
136
- - - ">="
95
+ - - "~>"
137
96
  - !ruby/object:Gem::Version
138
- version: '0'
97
+ version: '2.0'
139
98
  - !ruby/object:Gem::Dependency
140
- name: excon
99
+ name: mocha
141
100
  requirement: !ruby/object:Gem::Requirement
142
101
  requirements:
143
- - - ">="
102
+ - - "~>"
144
103
  - !ruby/object:Gem::Version
145
- version: '0'
104
+ version: '1.7'
146
105
  type: :development
147
106
  prerelease: false
148
107
  version_requirements: !ruby/object:Gem::Requirement
149
108
  requirements:
150
- - - ">="
109
+ - - "~>"
151
110
  - !ruby/object:Gem::Version
152
- version: '0'
111
+ version: '1.7'
153
112
  - !ruby/object:Gem::Dependency
154
- name: logger
113
+ name: rack
155
114
  requirement: !ruby/object:Gem::Requirement
156
115
  requirements:
157
- - - ">="
116
+ - - "~>"
158
117
  - !ruby/object:Gem::Version
159
- version: '0'
118
+ version: '2.0'
160
119
  type: :development
161
120
  prerelease: false
162
121
  version_requirements: !ruby/object:Gem::Requirement
163
122
  requirements:
164
- - - ">="
123
+ - - "~>"
165
124
  - !ruby/object:Gem::Version
166
- version: '0'
125
+ version: '2.0'
167
126
  - !ruby/object:Gem::Dependency
168
- name: bundler-gem_version_tasks
127
+ name: rake
169
128
  requirement: !ruby/object:Gem::Requirement
170
129
  requirements:
171
- - - ">="
130
+ - - "~>"
172
131
  - !ruby/object:Gem::Version
173
- version: '0'
132
+ version: '12.0'
174
133
  type: :development
175
134
  prerelease: false
176
135
  version_requirements: !ruby/object:Gem::Requirement
177
136
  requirements:
178
- - - ">="
137
+ - - "~>"
179
138
  - !ruby/object:Gem::Version
180
- version: '0'
139
+ version: '12.0'
181
140
  - !ruby/object:Gem::Dependency
182
- name: lmdb
141
+ name: timecop
183
142
  requirement: !ruby/object:Gem::Requirement
184
143
  requirements:
185
- - - ">="
144
+ - - "~>"
186
145
  - !ruby/object:Gem::Version
187
- version: '0'
146
+ version: '0.9'
188
147
  type: :development
189
148
  prerelease: false
190
149
  version_requirements: !ruby/object:Gem::Requirement
191
150
  requirements:
192
- - - ">="
151
+ - - "~>"
193
152
  - !ruby/object:Gem::Version
194
- version: '0'
153
+ version: '0.9'
195
154
  - !ruby/object:Gem::Dependency
196
- name: daybreak
155
+ name: typhoeus
197
156
  requirement: !ruby/object:Gem::Requirement
198
157
  requirements:
199
- - - ">="
158
+ - - "~>"
200
159
  - !ruby/object:Gem::Version
201
- version: '0'
160
+ version: '1.3'
202
161
  type: :development
203
162
  prerelease: false
204
163
  version_requirements: !ruby/object:Gem::Requirement
205
164
  requirements:
206
- - - ">="
165
+ - - "~>"
207
166
  - !ruby/object:Gem::Version
208
- version: '0'
209
- - !ruby/object:Gem::Dependency
210
- name: activesupport
211
- requirement: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - ">="
214
- - !ruby/object:Gem::Version
215
- version: '0'
216
- type: :runtime
217
- prerelease: false
218
- version_requirements: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - ">="
221
- - !ruby/object:Gem::Version
222
- version: '0'
167
+ version: '1.3'
223
168
  - !ruby/object:Gem::Dependency
224
169
  name: moneta
225
170
  requirement: !ruby/object:Gem::Requirement
226
171
  requirements:
227
- - - ">="
172
+ - - "~>"
228
173
  - !ruby/object:Gem::Version
229
- version: '0'
230
- type: :runtime
174
+ version: '1.0'
175
+ type: :development
231
176
  prerelease: false
232
177
  version_requirements: !ruby/object:Gem::Requirement
233
178
  requirements:
234
- - - ">="
179
+ - - "~>"
235
180
  - !ruby/object:Gem::Version
236
- version: '0'
237
- description: A robust circuit breaker that manages failing external services.
181
+ version: '1.0'
182
+ description:
238
183
  email:
239
184
  - fahimfmf@gmail.com
240
185
  executables: []
241
186
  extensions: []
242
187
  extra_rdoc_files: []
243
188
  files:
244
- - ".gitignore"
245
- - ".ruby-version"
246
- - ".travis.yml"
247
- - Gemfile
248
189
  - LICENSE
249
190
  - README.md
250
- - Rakefile
251
- - benchmark/circuit_store_benchmark.rb
252
- - circuitbox.gemspec
253
191
  - lib/circuitbox.rb
254
192
  - lib/circuitbox/circuit_breaker.rb
193
+ - lib/circuitbox/circuit_breaker/logger_messages.rb
194
+ - lib/circuitbox/configuration.rb
255
195
  - lib/circuitbox/errors/error.rb
256
196
  - lib/circuitbox/errors/open_circuit_error.rb
257
197
  - lib/circuitbox/errors/service_failure_error.rb
258
198
  - lib/circuitbox/excon_middleware.rb
259
199
  - lib/circuitbox/faraday_middleware.rb
260
- - lib/circuitbox/notifier.rb
200
+ - lib/circuitbox/memory_store.rb
201
+ - lib/circuitbox/memory_store/compactor.rb
202
+ - lib/circuitbox/memory_store/container.rb
203
+ - lib/circuitbox/memory_store/monotonic_time.rb
204
+ - lib/circuitbox/notifier/active_support.rb
205
+ - lib/circuitbox/notifier/null.rb
206
+ - lib/circuitbox/timer/monotonic.rb
207
+ - lib/circuitbox/timer/null.rb
208
+ - lib/circuitbox/timer/simple.rb
261
209
  - lib/circuitbox/version.rb
262
- - test/circuit_breaker_test.rb
263
- - test/circuitbox_test.rb
264
- - test/excon_middleware_test.rb
265
- - test/faraday_middleware_test.rb
266
- - test/integration/circuitbox_cross_process_open_test.rb
267
- - test/integration/faraday_middleware_test.rb
268
- - test/integration_helper.rb
269
- - test/notifier_test.rb
270
- - test/service_failure_error_test.rb
271
- - test/test_helper.rb
272
- homepage: ''
210
+ homepage: https://github.com/yammer/circuitbox
273
211
  licenses:
274
- - MIT
212
+ - Apache-2.0
275
213
  metadata: {}
276
214
  post_install_message:
277
215
  rdoc_options: []
@@ -284,23 +222,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
284
222
  version: '0'
285
223
  required_rubygems_version: !ruby/object:Gem::Requirement
286
224
  requirements:
287
- - - ">="
225
+ - - ">"
288
226
  - !ruby/object:Gem::Version
289
- version: '0'
227
+ version: 1.3.1
290
228
  requirements: []
291
229
  rubyforge_project:
292
- rubygems_version: 2.5.2
230
+ rubygems_version: 2.7.6
293
231
  signing_key:
294
232
  specification_version: 4
295
233
  summary: A robust circuit breaker that manages failing external services.
296
- test_files:
297
- - test/circuit_breaker_test.rb
298
- - test/circuitbox_test.rb
299
- - test/excon_middleware_test.rb
300
- - test/faraday_middleware_test.rb
301
- - test/integration/circuitbox_cross_process_open_test.rb
302
- - test/integration/faraday_middleware_test.rb
303
- - test/integration_helper.rb
304
- - test/notifier_test.rb
305
- - test/service_failure_error_test.rb
306
- - test/test_helper.rb
234
+ test_files: []