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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: defd1ba585ef0f8b5ff8f2f388604c344571fe4fe887f7ca44d03d57c7ce20f8
4
- data.tar.gz: 729865914aa2f72c4b61a16cbcd29f12d86d034a04f9c15f3c48c53a7611c5cf
3
+ metadata.gz: 1270edae5d2c019ae92b623ff4c26e588cf8d5413c8f7b6c549d3d3ec4e16766
4
+ data.tar.gz: a9a659acde5a04263b1ca516a2fb1ecdd760d9133f3603b4fa7ec336c06f59df
5
5
  SHA512:
6
- metadata.gz: 864cc51b0eaf4c1767a36580331a27dfb20a2e0eeaaff805d2d188078cf9500ccfbf0d08e331cd06efb238b0c58dca9f67cde27025d1e87ebec8ef4ae234c683
7
- data.tar.gz: aa303e6a58f1d79b0471d9d31bb5aa8835bd7f253c26f7930c6253e7801e154b9c26ce977529e70a7de647d9967caa6753963608828e721f7d1cfe5523805f41
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
- unless PRIORITY_RANGE.include?(priority)
27
- return capacity
28
- end
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
- # priority 1 stays at 100%, 2 scales down to 90%, 5 to 60%
31
- factor = 1 - (priority - 1) * 0.1
32
- (capacity * factor).floor
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.trace('Berater.limit') do |span|
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
@@ -1,3 +1,3 @@
1
1
  module Berater
2
- VERSION = "0.13.0"
2
+ VERSION = "0.13.1"
3
3
  end
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
- MyLimiter = Class.new(Berater::Unlimiter)
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:MyLimiter:key'
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 { Datadog.tracer.enabled = false }
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
- before do
11
- allow(tracer).to receive(:trace) {|&b| b.call(span) }
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
- context 'with a provided tracer' do
15
- let(:instance) { described_class.new(tracer: tracer) }
26
+ describe '#tracer' do
27
+ subject { instance.send(:tracer) }
16
28
 
17
- it 'traces' do
18
- expect(tracer).to receive(:trace).with(/Berater/)
19
- expect(span).to receive(:set_tag).with(/capacity/, Numeric)
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
- instance.call(limiter) {}
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
- context 'when an Overloaded exception is raised' do
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
- instance.call(limiter) { raise Berater::Overloaded }
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.0
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-03-04 00:00:00.000000000 Z
11
+ date: 2022-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: meddleware