Skip to content

Commit 02fa36b

Browse files
authored
feat: Add untraced endpoints config to rack middleware (#594)
1 parent 9cbce7e commit 02fa36b

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

instrumentation/rack/lib/opentelemetry/instrumentation/rack/middlewares/tracer_middleware.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,15 @@ def clear_cached_config
4949

5050
def initialize(app)
5151
@app = app
52+
@untraced_endpoints = config[:untraced_endpoints].is_a?(Array) ? config[:untraced_endpoints] : []
5253
end
5354

5455
def call(env) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
56+
if untraced_request?(env)
57+
OpenTelemetry::Common::Utilities.untraced do
58+
return @app.call(env)
59+
end
60+
end
5561
original_env = env.dup
5662
extracted_context = OpenTelemetry.propagation.extract(
5763
env,
@@ -79,6 +85,10 @@ def call(env) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
7985

8086
private
8187

88+
def untraced_request?(env)
89+
@untraced_endpoints.include?(env['PATH_INFO'])
90+
end
91+
8292
# return Context with the frontend span as the current span
8393
def create_frontend_span(env, extracted_context)
8494
request_start_time = OpenTelemetry::Instrumentation::Rack::Util::QueueTime.get_request_start(env)

instrumentation/rack/test/opentelemetry/instrumentation/rack/middlewares/tracer_middleware_test.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
let(:rack_builder) { Rack::Builder.new }
2424

2525
let(:exporter) { EXPORTER }
26+
let(:finished_spans) { exporter.finished_spans }
2627
let(:first_span) { exporter.finished_spans.first }
2728

2829
let(:default_config) { {} }
@@ -71,6 +72,50 @@
7172
_(first_span.parent_span_id).must_equal OpenTelemetry::Trace::INVALID_SPAN_ID
7273
end
7374

75+
describe 'config[:untraced_endpoints]' do
76+
describe 'when an array is passed in' do
77+
let(:config) { { untraced_endpoints: ['/ping'] } }
78+
79+
it 'does not trace paths listed in the array' do
80+
Rack::MockRequest.new(rack_builder).get('/ping', env)
81+
82+
ping_span = finished_spans.find { |s| s.name == '/ping' }
83+
_(ping_span).must_be_nil
84+
85+
root_span = finished_spans.find { |s| s.name == '/' }
86+
_(root_span).wont_be_nil
87+
end
88+
end
89+
90+
describe 'when a string is passed in' do
91+
let(:config) { { untraced_endpoints: '/ping' } }
92+
93+
it 'traces everything' do
94+
Rack::MockRequest.new(rack_builder).get('/ping', env)
95+
96+
ping_span = finished_spans.find { |s| s.name == '/ping' }
97+
_(ping_span).wont_be_nil
98+
99+
root_span = finished_spans.find { |s| s.name == '/' }
100+
_(root_span).wont_be_nil
101+
end
102+
end
103+
104+
describe 'when nil is passed in' do
105+
let(:config) { { untraced_endpoints: nil } }
106+
107+
it 'traces everything' do
108+
Rack::MockRequest.new(rack_builder).get('/ping', env)
109+
110+
ping_span = finished_spans.find { |s| s.name == '/ping' }
111+
_(ping_span).wont_be_nil
112+
113+
root_span = finished_spans.find { |s| s.name == '/' }
114+
_(root_span).wont_be_nil
115+
end
116+
end
117+
end
118+
74119
describe 'config[:allowed_request_headers]' do
75120
let(:env) { Hash('HTTP_FOO_BAR' => 'http foo bar value') }
76121

0 commit comments

Comments
 (0)