circuitbox 1.1.1 → 2.0.0.pre1

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.
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: []