circuitbox 1.1.0 → 1.1.1

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
2
  SHA1:
3
- metadata.gz: bb9f064a8178b7bfef8be4552f91410d0783acf5
4
- data.tar.gz: ca1e8126ff01603f881c351c28c47396a8fa7d97
3
+ metadata.gz: 6b50bdb4f6ad77ee69e5f67bc61f9ae5e70e32b4
4
+ data.tar.gz: 86c89e7e0e10bd67349f76e3fee069218b5bb01a
5
5
  SHA512:
6
- metadata.gz: f9e3f74178e1cf6200d5dbbf99925ddb1f235ebf3d287e3c82bd0894d1430b69a4ed062bbaf9afb9cacd5b5707c32cf2dcbd10cd78293b5f438f3b738b956837
7
- data.tar.gz: fe2a7be07392bd92a0a9e731550f82f1b4e3c6d2ed21759c25d91776e5734d538bb4e7d5bc33da09edd8de5ea2ccdb731e6e8baa36946ea02a7e908415b5c17e
6
+ metadata.gz: fb6c0076a6689dc2fcc153f11f5060347a544a678b2a74304fa53a1659fa5456037d9642b34d90ce862f48edbc8215dcc0187549d91cface993757afc8413594
7
+ data.tar.gz: 6cdecb23e5598ae81f621099d5329fc1d133f9acf5f9163a168ba8645615d777441b15045c51e0d16c1c24df56e9210d4bc235fcc6c158bb1ededaced99c1fdb
data/README.md CHANGED
@@ -53,8 +53,11 @@ class ExampleServiceClient
53
53
 
54
54
  # seconds the circuit stays open once it has passed the error threshold
55
55
  sleep_window: 300,
56
+
57
+ # length of interval (in seconds) over which it calculates the error rate
58
+ time_window: 60,
56
59
 
57
- # number of requests within 1 minute before it calculates error rates
60
+ # number of requests within `time_window` seconds before it calculates error rates
58
61
  volume_threshold: 10,
59
62
 
60
63
  # the store you want to use to save the circuit state so it can be
@@ -263,7 +266,7 @@ c.use Circuitbox::FaradayMiddleware, exceptions: [Faraday::Error::TimeoutError]
263
266
  with either
264
267
  * a static value
265
268
  * a `lambda` which is passed the `original_response` and `original_error`.
266
- `original_response` will be populated if Faraday returne an error response,
269
+ `original_response` will be populated if Faraday returns an error response,
267
270
  `original_error` will be populated if an error was thrown before Faraday
268
271
  returned a response. (It will also accept a lambda with arity 1 that is
269
272
  only passed `original_response`. This use is deprecated and will be removed
data/Rakefile CHANGED
@@ -1,18 +1,30 @@
1
- require 'rake/testtask'
1
+ require "rake/testtask"
2
2
  require "bundler/gem_version_tasks"
3
3
 
4
- Rake::TestTask.new do |t|
5
- t.libs << 'test'
6
- t.test_files = FileList['test/**/*_test.rb']
7
- end
4
+ namespace :test do
5
+ desc "Run complete test suite"
6
+ task :all => [:unit, :integration]
7
+
8
+ desc "Run unit tests"
9
+ Rake::TestTask.new(:unit) do |t|
10
+ t.libs << "test"
11
+ t.test_files = FileList["test/*_test.rb"]
12
+ end
13
+
14
+ desc "Run integration tests"
15
+ Rake::TestTask.new(:integration) do |t|
16
+ t.libs << "test"
17
+ t.test_files = FileList["test/integration/*_test.rb"]
18
+ end
8
19
 
9
- desc "run the circuitbox benchmark scripts"
10
- task :benchmark do
11
- benchmark_scripts = FileList.new("./benchmark/*_benchmark.rb")
12
- benchmark_scripts.each do |script|
13
- system "bundle exec ruby #{script}"
20
+ desc "Run the circuitbox benchmarks"
21
+ task :benchmark do
22
+ benchmark_scripts = FileList.new("./benchmark/*_benchmark.rb")
23
+ benchmark_scripts.each do |script|
24
+ system "bundle exec ruby #{script}"
25
+ end
14
26
  end
15
27
  end
16
28
 
17
29
  desc "Run tests"
18
- task :default => :test
30
+ task :default => ["test:all"]
@@ -1,15 +1,12 @@
1
1
  require 'uri'
2
- require 'singleton'
3
- require 'active_support'
4
2
  require 'logger'
5
3
  require 'timeout'
6
4
  require 'moneta'
5
+ require 'active_support/all'
7
6
 
8
7
  require 'circuitbox/version'
9
- require 'circuitbox/memcache_store'
10
8
  require 'circuitbox/circuit_breaker'
11
9
  require 'circuitbox/notifier'
12
-
13
10
  require 'circuitbox/errors/error'
14
11
  require 'circuitbox/errors/open_circuit_error'
15
12
  require 'circuitbox/errors/service_failure_error'
@@ -47,6 +47,7 @@ class Circuitbox
47
47
  if open?
48
48
  logger.debug "[CIRCUIT] open: skipping #{service}"
49
49
  open! unless open_flag?
50
+ skipped!
50
51
  raise Circuitbox::OpenCircuitError.new(service)
51
52
  else
52
53
  close! if was_open?
@@ -170,6 +171,10 @@ class Circuitbox
170
171
  log_event :failure
171
172
  end
172
173
 
174
+ def skipped!
175
+ log_event :skipped
176
+ end
177
+
173
178
  # Store success/failure/open/close data in memcache
174
179
  def log_event(event)
175
180
  notifier.new(service,partition).notify(event)
@@ -208,15 +213,6 @@ class Circuitbox
208
213
  end
209
214
  end
210
215
 
211
- # Logs to Memcache.
212
- def log_event_to_stat_store(key)
213
- if stat_store.read(key, raw: true)
214
- stat_store.increment(key)
215
- else
216
- stat_store.store(key, 1)
217
- end
218
- end
219
-
220
216
  # For returning stale responses when the circuit is open
221
217
  def response_key(args)
222
218
  Digest::SHA1.hexdigest(storage_key(:cache, args.inspect.to_s))
@@ -1,3 +1,3 @@
1
1
  class Circuitbox
2
- VERSION='1.1.0'
2
+ VERSION='1.1.1'
3
3
  end
@@ -231,6 +231,14 @@ class CircuitBreakerTest < Minitest::Test
231
231
  emulate_circuit_run(circuit, :failure, Timeout::Error)
232
232
  end
233
233
 
234
+ def test_records_response_skipped
235
+ circuit = Circuitbox::CircuitBreaker.new(:yammer)
236
+ circuit.stubs(:open? => true)
237
+ circuit.stubs(:log_event)
238
+ circuit.expects(:log_event).with(:skipped)
239
+ emulate_circuit_run(circuit, :failure, Timeout::Error)
240
+ end
241
+
234
242
  def test_records_response_success
235
243
  circuit = Circuitbox::CircuitBreaker.new(:yammer)
236
244
  circuit.expects(:log_event).with(:success)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: circuitbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fahim Ferdous
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-26 00:00:00.000000000 Z
11
+ date: 2017-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -257,7 +257,6 @@ files:
257
257
  - lib/circuitbox/errors/service_failure_error.rb
258
258
  - lib/circuitbox/excon_middleware.rb
259
259
  - lib/circuitbox/faraday_middleware.rb
260
- - lib/circuitbox/memcache_store.rb
261
260
  - lib/circuitbox/notifier.rb
262
261
  - lib/circuitbox/version.rb
263
262
  - test/circuit_breaker_test.rb
@@ -290,7 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
290
289
  version: '0'
291
290
  requirements: []
292
291
  rubyforge_project:
293
- rubygems_version: 2.4.8
292
+ rubygems_version: 2.5.2
294
293
  signing_key:
295
294
  specification_version: 4
296
295
  summary: A robust circuit breaker that manages failing external services.
@@ -1,31 +0,0 @@
1
- module ActiveSupport
2
- module Cache
3
- class MemcacheStore
4
- def initialize(cache)
5
- @cache = cache
6
- end
7
-
8
- def read(key, options = {})
9
- @cache.get(key, options)
10
- rescue Memcached::NotFound
11
- nil
12
- end
13
-
14
- def increment(key)
15
- @cache.incr(key)
16
- end
17
-
18
- def write(key, value, options = {})
19
- if expires_in = options.delete(:expires_in)
20
- options[:expiry] = expires_in.to_i
21
- end
22
-
23
- @cache.set(key, value, options)
24
- end
25
-
26
- def delete(key)
27
- @cache.delete(key)
28
- end
29
- end
30
- end
31
- end