berater 0.13.0 → 0.13.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 +4 -4
- data/lib/berater/middleware/load_shedder.rb +7 -6
- data/lib/berater/middleware/trace.rb +2 -4
- data/lib/berater/version.rb +1 -1
- data/spec/limiter_spec.rb +3 -7
- data/spec/middleware/trace_spec.rb +59 -21
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1270edae5d2c019ae92b623ff4c26e588cf8d5413c8f7b6c549d3d3ec4e16766
|
4
|
+
data.tar.gz: a9a659acde5a04263b1ca516a2fb1ecdd760d9133f3603b4fa7ec336c06f59df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07fc3784c2e6d41648f97878e3a0c62e3a089c1ef69315e88141642350180634c65a89deda082ed5933a90666c620111329756d0699d3fde5238b97d0ad37e82
|
7
|
+
data.tar.gz: 6f8dc42b5b694a45c286b1d66a0b8efbf17371b3fd6bfd8936098b4155b85ae6523146fecfc6b7c46e3b0a8df1ddb03158f1fd181c9e6a1e13042232089e1a41
|
@@ -23,13 +23,14 @@ module Berater
|
|
23
23
|
priority = Float(priority) rescue nil
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
if PRIORITY_RANGE.include?(priority)
|
27
|
+
# priority 1 stays at 100%, 2 scales down to 90%, 5 to 60%
|
28
|
+
factor = 1 - (priority - 1) * 0.1
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
(capacity * factor).floor
|
31
|
+
else
|
32
|
+
capacity
|
33
|
+
end
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'ddtrace'
|
2
|
-
|
3
1
|
module Berater
|
4
2
|
module Middleware
|
5
3
|
class Trace
|
@@ -8,7 +6,7 @@ module Berater
|
|
8
6
|
end
|
9
7
|
|
10
8
|
def call(limiter, **)
|
11
|
-
tracer
|
9
|
+
tracer&.trace('Berater') do |span|
|
12
10
|
begin
|
13
11
|
lock = yield
|
14
12
|
rescue Exception => error
|
@@ -34,7 +32,7 @@ module Berater
|
|
34
32
|
private
|
35
33
|
|
36
34
|
def tracer
|
37
|
-
@tracer || Datadog.tracer
|
35
|
+
@tracer || (defined?(Datadog::Tracing) && Datadog::Tracing) || (defined?(Datadog) && Datadog.tracer)
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
data/lib/berater/version.rb
CHANGED
data/spec/limiter_spec.rb
CHANGED
@@ -220,9 +220,7 @@ describe Berater::Limiter do
|
|
220
220
|
end
|
221
221
|
|
222
222
|
context 'with custom limiter' do
|
223
|
-
MyLimiter = Class.new(Berater::Unlimiter)
|
224
|
-
|
225
|
-
let(:klass) { MyLimiter }
|
223
|
+
let(:klass) { MyLimiter = Class.new(Berater::Unlimiter) }
|
226
224
|
|
227
225
|
it 'adds Berater prefix' do
|
228
226
|
is_expected.to eq 'Berater:MyLimiter:key'
|
@@ -242,12 +240,10 @@ describe Berater::Limiter do
|
|
242
240
|
end
|
243
241
|
|
244
242
|
context 'with custom limiter' do
|
245
|
-
|
246
|
-
|
247
|
-
let(:klass) { MyLimiter }
|
243
|
+
let(:klass) { MyOtherLimiter = Class.new(Berater::Unlimiter) }
|
248
244
|
|
249
245
|
it 'adds Berater prefix' do
|
250
|
-
is_expected.to eq 'Berater:
|
246
|
+
is_expected.to eq 'Berater:MyOtherLimiter:key'
|
251
247
|
end
|
252
248
|
end
|
253
249
|
end
|
@@ -1,30 +1,61 @@
|
|
1
|
+
require 'ddtrace'
|
2
|
+
|
1
3
|
describe Berater::Middleware::Trace do
|
2
|
-
before
|
4
|
+
before do
|
5
|
+
allow(tracer).to receive(:trace).and_yield(span)
|
6
|
+
end
|
3
7
|
|
4
8
|
it_behaves_like 'a limiter middleware'
|
5
9
|
|
6
10
|
let(:limiter) { Berater::Unlimiter.new }
|
7
|
-
let(:span) { double(Datadog::Span, set_tag: nil) }
|
8
|
-
let(:tracer) { double(Datadog::Tracer) }
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
if defined?(Datadog::Tracing)
|
13
|
+
before { Datadog.configure { |c| c.tracing.enabled = false } }
|
14
|
+
|
15
|
+
let(:span) { double(Datadog::Tracing::SpanOperation, set_tag: nil) }
|
16
|
+
let(:tracer) { double(Datadog::Tracing::Tracer) }
|
17
|
+
let(:ddtracer) { Datadog::Tracing }
|
18
|
+
else
|
19
|
+
before { Datadog.tracer.enabled = false }
|
20
|
+
|
21
|
+
let(:span) { double(Datadog::Span, set_tag: nil) }
|
22
|
+
let(:tracer) { double(Datadog::Tracer) }
|
23
|
+
let(:ddtracer) { Datadog.tracer }
|
12
24
|
end
|
13
25
|
|
14
|
-
|
15
|
-
|
26
|
+
describe '#tracer' do
|
27
|
+
subject { instance.send(:tracer) }
|
16
28
|
|
17
|
-
|
18
|
-
|
19
|
-
|
29
|
+
let(:instance) { described_class.new }
|
30
|
+
|
31
|
+
it 'defaults to Datadog.tracer' do
|
32
|
+
is_expected.to be ddtracer
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when provided a tracer' do
|
36
|
+
let(:instance) { described_class.new(tracer: tracer) }
|
20
37
|
|
21
|
-
|
38
|
+
it { is_expected.to be tracer }
|
22
39
|
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#call' do
|
43
|
+
let(:instance) { described_class.new(tracer: tracer) }
|
23
44
|
|
24
45
|
it 'yields' do
|
25
46
|
expect {|b| instance.call(limiter, &b) }.to yield_control
|
26
47
|
end
|
27
48
|
|
49
|
+
context 'when a Berater::Overloaded exception is raised' do
|
50
|
+
it 'tags the span as overloaded and raises' do
|
51
|
+
expect(span).to receive(:set_tag).with('overloaded', true)
|
52
|
+
|
53
|
+
expect {
|
54
|
+
instance.call(limiter) { raise Berater::Overloaded }
|
55
|
+
}.to be_overloaded
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
28
59
|
context 'when an exception is raised' do
|
29
60
|
it 'tags the span and raises' do
|
30
61
|
expect(span).to receive(:set_tag).with('error', 'IOError')
|
@@ -34,25 +65,32 @@ describe Berater::Middleware::Trace do
|
|
34
65
|
}.to raise_error(IOError)
|
35
66
|
end
|
36
67
|
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when used as middleware' do
|
71
|
+
before do
|
72
|
+
Berater.middleware.use described_class, tracer: tracer
|
73
|
+
end
|
37
74
|
|
38
|
-
|
75
|
+
it 'traces' do
|
76
|
+
expect(tracer).to receive(:trace).with('Berater')
|
77
|
+
expect(span).to receive(:set_tag).with('key', limiter.key)
|
78
|
+
expect(span).to receive(:set_tag).with('capacity', Numeric)
|
79
|
+
expect(span).to receive(:set_tag).with('contention', Numeric)
|
80
|
+
|
81
|
+
limiter.limit
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when limiter is overloaded' do
|
39
85
|
let(:limiter) { Berater::Inhibitor.new }
|
40
86
|
|
41
87
|
it 'tags the span as overloaded and raises' do
|
42
88
|
expect(span).to receive(:set_tag).with('overloaded', true)
|
43
89
|
|
44
90
|
expect {
|
45
|
-
|
91
|
+
limiter.limit
|
46
92
|
}.to be_overloaded
|
47
93
|
end
|
48
94
|
end
|
49
95
|
end
|
50
|
-
|
51
|
-
context 'with the default tracer' do
|
52
|
-
it 'uses Datadog.tracer' do
|
53
|
-
expect(Datadog).to receive(:tracer).and_return(tracer)
|
54
|
-
|
55
|
-
described_class.new.call(limiter) {}
|
56
|
-
end
|
57
|
-
end
|
58
96
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.
|
4
|
+
version: 0.13.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: meddleware
|