resilient 0.5.0 → 0.5.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 +5 -5
- data/.github/workflows/ci.yml +28 -0
- data/CHANGELOG.md +4 -0
- data/README.md +11 -11
- data/lib/resilient/circuit_breaker.rb +11 -4
- data/lib/resilient/version.rb +1 -1
- data/resilient.gemspec +1 -1
- metadata +8 -9
- data/.travis.yml +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2e439a74385ae133b7d375d90c75dcc302a1cd77a56d69facda7b04f2de07124
|
4
|
+
data.tar.gz: bceca2780a2b2b71ff1b0084db9e2c6ed206345114d2849d1da1c957e1995365
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a58ea0dce1f90dc61f4a3d34d0fa6f7ad7ca64fd246776a6696ee2e7ae1f2df9447b9f1ba394a914503320b40a1d3a2b326fd27e0e954e826fb985209233330
|
7
|
+
data.tar.gz: '088e66a7f364869da5da43f926dead2cd62af861baaa07b3a4615e521ac1ab75ecdeb4e6c7aee0b1f40ce2a692e66cca25cd2737bfe2c3fdc1635142fb96fb3a'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [push, pull_request]
|
3
|
+
jobs:
|
4
|
+
build:
|
5
|
+
runs-on: ubuntu-latest
|
6
|
+
strategy:
|
7
|
+
matrix:
|
8
|
+
ruby: ['2.5', '2.6', '2.7']
|
9
|
+
steps:
|
10
|
+
- name: Check out repository code
|
11
|
+
uses: actions/checkout@v2
|
12
|
+
- name: Do some action caching
|
13
|
+
uses: actions/cache@v1
|
14
|
+
with:
|
15
|
+
path: vendor/bundle
|
16
|
+
key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
|
17
|
+
restore-keys: |
|
18
|
+
${{ runner.os }}-gem-
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: actions/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby }}
|
23
|
+
- name: Install bundler
|
24
|
+
run: gem install bundler
|
25
|
+
- name: Run bundler
|
26
|
+
run: bundle install --jobs 4 --retry 3
|
27
|
+
- name: Run Tests
|
28
|
+
run: script/test
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 0.5.1
|
2
|
+
|
3
|
+
* [Added two new events open_circuit and close_circuit](https://github.com/jnunemaker/resilient/pull/16) and [renamed them here](https://github.com/jnunemaker/resilient/commit/407e673eb5268912814398bebdeb173793d0af05).
|
4
|
+
|
1
5
|
## 0.5.0
|
2
6
|
|
3
7
|
* [tweaked interface for metrics](https://github.com/jnunemaker/resilient/pull/15)
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Some tools to aid in resiliency in Ruby. For now, just a circuit breaker (~~stolen from~~ based on [hystrix](https://github.com/netflix/hystrix)). Soon much more...
|
4
4
|
|
5
|
-
Nothing asynchronous or thread safe yet either, but open to it and would like to see more around it in the future.
|
5
|
+
Nothing asynchronous or thread safe yet either, but open to it and would like to see more around it in the future. See more here: [jnunemaker/resilient#18](https://github.com/jnunemaker/resilient/issues/18).
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -29,7 +29,7 @@ require "resilient/circuit_breaker"
|
|
29
29
|
# CircuitBreaker.new as `get` keeps a registry of circuits by key to prevent
|
30
30
|
# creating multiple instances of the same circuit breaker for a key; not using
|
31
31
|
# `get` means you would have multiple instances of the circuit breaker and thus
|
32
|
-
# separate state and metrics; you can read more in examples/
|
32
|
+
# separate state and metrics; you can read more in examples/get_vs_new.rb
|
33
33
|
circuit_breaker = Resilient::CircuitBreaker.get("example")
|
34
34
|
if circuit_breaker.allow_request?
|
35
35
|
begin
|
@@ -86,15 +86,15 @@ circuit_breaker = Resilient::CircuitBreaker.get("example", {
|
|
86
86
|
|
87
87
|
Property | Default | Notes
|
88
88
|
--------------------------------|------------------------|--------
|
89
|
-
**:force_open** | false | allows forcing the circuit open (stopping all requests)
|
90
|
-
**:force_closed** | false | allows ignoring errors and therefore never trip "open" (
|
91
|
-
**:instrumenter** | Instrumenters::Noop | what to use to instrument all events that happen (
|
92
|
-
**:sleep_window_seconds** | 5 | seconds after tripping circuit before allowing retry
|
93
|
-
**:request_volume_threshold** | 20 | number of requests that must be made within a statistical window before open/close decisions are made using stats
|
94
|
-
**:error_threshold_percentage** | 50 | % of "marks" that must be failed to trip the circuit
|
95
|
-
**:window_size_in_seconds** | 60 | number of seconds in the statistical window
|
96
|
-
**:bucket_size_in_seconds** | 10 | size of buckets in statistical window
|
97
|
-
**:metrics** | Resilient::Metrics.new | metrics instance used to keep track of success and failure
|
89
|
+
**:force_open** | `false` | allows forcing the circuit open (stopping all requests)
|
90
|
+
**:force_closed** | `false` | allows ignoring errors and therefore never trip "open" (e.g. allow all traffic through); normal instrumentation will still happen, thus allowing you to "test" configuration live without impact
|
91
|
+
**:instrumenter** | `Instrumenters::Noop` | what to use to instrument all events that happen (e.g. `ActiveSupport::Notifications`)
|
92
|
+
**:sleep_window_seconds** | `5` | seconds after tripping circuit before allowing retry
|
93
|
+
**:request_volume_threshold** | `20` | number of requests that must be made within a statistical window before open/close decisions are made using stats
|
94
|
+
**:error_threshold_percentage** | `50` | % of "marks" that must be failed to trip the circuit
|
95
|
+
**:window_size_in_seconds** | `60` | number of seconds in the statistical window
|
96
|
+
**:bucket_size_in_seconds** | `10` | size of buckets in statistical window
|
97
|
+
**:metrics** | `Resilient::Metrics.new` | metrics instance used to keep track of success and failure
|
98
98
|
|
99
99
|
## Tests
|
100
100
|
|
@@ -106,13 +106,20 @@ module Resilient
|
|
106
106
|
private
|
107
107
|
|
108
108
|
def open_circuit
|
109
|
-
@
|
110
|
-
|
109
|
+
instrument("resilient.circuit_breaker.open_circuit", key: @key) { |payload|
|
110
|
+
@opened_or_last_checked_at_epoch = Time.now.to_i
|
111
|
+
@open = true
|
112
|
+
payload[:open] = @open
|
113
|
+
}
|
111
114
|
end
|
112
115
|
|
113
116
|
def close_circuit
|
114
|
-
@
|
115
|
-
|
117
|
+
instrument("resilient.circuit_breaker.close_circuit", key: @key) { |payload|
|
118
|
+
@open = false
|
119
|
+
payload[:open] = @open
|
120
|
+
payload[:interval] = Time.now.to_i - @opened_or_last_checked_at_epoch
|
121
|
+
@opened_or_last_checked_at_epoch = 0
|
122
|
+
}
|
116
123
|
metrics.reset
|
117
124
|
end
|
118
125
|
|
data/lib/resilient/version.rb
CHANGED
data/resilient.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler", "
|
21
|
+
spec.add_development_dependency "bundler", "< 3.0"
|
22
22
|
spec.add_development_dependency "minitest", "~> 5.8"
|
23
23
|
spec.add_development_dependency "timecop", "~> 0.8.0"
|
24
24
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resilient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "<"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '3.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "<"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,8 +59,8 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
+
- ".github/workflows/ci.yml"
|
62
63
|
- ".gitignore"
|
63
|
-
- ".travis.yml"
|
64
64
|
- CHANGELOG.md
|
65
65
|
- Gemfile
|
66
66
|
- Guardfile
|
@@ -114,8 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '0'
|
116
116
|
requirements: []
|
117
|
-
|
118
|
-
rubygems_version: 2.4.5.1
|
117
|
+
rubygems_version: 3.0.3
|
119
118
|
signing_key:
|
120
119
|
specification_version: 4
|
121
120
|
summary: toolkit for resilient ruby apps
|