Skip to content

Commit 40024f8

Browse files
authored
Merge pull request #478 from DataDog/bugfix/avoid_leaking_memory_by_not_closing_spans
Make sure spans are closed when processing notifications
2 parents f024a5e + c5ea405 commit 40024f8

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

lib/ddtrace/contrib/active_support/notifications/subscription.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,12 @@ def start_span(name, id, payload, start = nil)
7575
tracer.trace(@span_name, @options).tap do |span|
7676
# Assign start time if provided
7777
span.start_time = start unless start.nil?
78+
payload[:datadog_span] = span
7879
end
7980
end
8081

8182
def finish_span(name, id, payload, finish = nil)
82-
tracer.active_span.tap do |span|
83+
payload[:datadog_span].tap do |span|
8384
# If no active span, return.
8485
return nil if span.nil?
8586

spec/ddtrace/contrib/active_support/notifications/subscription_spec.rb

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
let(:tracer) { ::Datadog::Tracer.new(writer: FauxWriter.new) }
1111
let(:span_name) { double('span_name') }
1212
let(:options) { {} }
13+
let(:payload) { {} }
1314
let(:block) do
1415
proc do |span, name, id, payload|
1516
spy.call(span, name, id, payload)
@@ -24,14 +25,13 @@
2425
let(:start) { double('start') }
2526
let(:finish) { double('finish') }
2627
let(:id) { double('id') }
27-
let(:payload) { double('payload') }
28+
let(:payload) { {} }
2829

2930
let(:span) { instance_double(Datadog::Span) }
3031

3132
it do
3233
expect(tracer).to receive(:trace).with(span_name, options).and_return(span).ordered
3334
expect(span).to receive(:start_time=).with(start).and_return(span).ordered
34-
expect(tracer).to receive(:active_span).and_return(span).ordered
3535
expect(spy).to receive(:call).with(span, name, id, payload).ordered
3636
expect(span).to receive(:finish).with(finish).and_return(span).ordered
3737
is_expected.to be(span)
@@ -49,7 +49,6 @@
4949
it 'finishes tracing anyways' do
5050
expect(tracer).to receive(:trace).with(span_name, options).and_return(span).ordered
5151
expect(span).to receive(:start_time=).with(start).and_return(span).ordered
52-
expect(tracer).to receive(:active_span).and_return(span).ordered
5352
expect(span).to receive(:finish).with(finish).and_return(span).ordered
5453
is_expected.to be(span)
5554
end
@@ -60,9 +59,7 @@
6059
subject(:result) { subscription.start(name, id, payload) }
6160
let(:name) { double('name') }
6261
let(:id) { double('id') }
63-
let(:payload) { double('payload') }
64-
65-
let(:span) { instance_double(Datadog::Span) }
62+
let(:span) { double('span') }
6663

6764
it do
6865
expect(tracer).to receive(:trace).with(span_name, options).and_return(span)
@@ -73,18 +70,21 @@
7370
parent = tracer.trace('parent_span')
7471
expect(subject.parent_id).to eq parent.span_id
7572
end
73+
74+
it 'sets span in payload' do
75+
expect { subject }.to change { payload[:datadog_span] }.to be_instance_of(Datadog::Span)
76+
end
7677
end
7778

7879
describe '#finish' do
7980
subject(:result) { subscription.finish(name, id, payload) }
8081
let(:name) { double('name') }
8182
let(:id) { double('id') }
82-
let(:payload) { double('payload') }
8383

8484
let(:span) { instance_double(Datadog::Span) }
85+
let(:payload) { { datadog_span: span } }
8586

8687
it do
87-
expect(tracer).to receive(:active_span).and_return(span).ordered
8888
expect(spy).to receive(:call).with(span, name, id, payload).ordered
8989
expect(span).to receive(:finish).and_return(span).ordered
9090
is_expected.to be(span)
@@ -102,7 +102,7 @@
102102
it do
103103
expect(callback_spy).to receive(:call).ordered
104104
expect(tracer).to receive(:trace).ordered
105-
subscription.start(double('name'), double('id'), double('payload'))
105+
subscription.start(double('name'), double('id'), payload)
106106
end
107107
end
108108
end
@@ -134,13 +134,13 @@
134134
shared_examples_for 'an after_trace callback' do
135135
context 'on #finish' do
136136
let(:span) { instance_double(Datadog::Span) }
137+
let(:payload) { { datadog_span: span } }
137138

138139
it do
139-
expect(tracer).to receive(:active_span).and_return(span).ordered
140140
expect(spy).to receive(:call).ordered
141141
expect(span).to receive(:finish).ordered
142142
expect(callback_spy).to receive(:call).ordered
143-
subscription.finish(double('name'), double('id'), double('payload'))
143+
subscription.finish(double('name'), double('id'), payload)
144144
end
145145
end
146146
end

0 commit comments

Comments
 (0)