From d5bbc947e8cad116c52cb4f94c62408e7cf64674 Mon Sep 17 00:00:00 2001 From: Yury Lebedev Date: Fri, 30 Aug 2024 14:59:25 +0200 Subject: [PATCH] Add concatenation of route and script name to rack middleware --- lib/datadog/tracing/contrib/grape/endpoint.rb | 11 +++- .../tracing/contrib/rack/middlewares.rb | 23 +++++++ lib/datadog/tracing/contrib/sinatra/tracer.rb | 4 ++ .../contrib/sinatra/tracer_middleware.rb | 3 - .../action_dispatch/journey/router_spec.rb | 56 ++++++++--------- .../tracing/contrib/grape/tracer_spec.rb | 60 +++++++++++-------- .../tracing/contrib/rails/rack_spec.rb | 12 ++-- 7 files changed, 107 insertions(+), 62 deletions(-) diff --git a/lib/datadog/tracing/contrib/grape/endpoint.rb b/lib/datadog/tracing/contrib/grape/endpoint.rb index d1c0e527066..5c6b9f25a1b 100644 --- a/lib/datadog/tracing/contrib/grape/endpoint.rb +++ b/lib/datadog/tracing/contrib/grape/endpoint.rb @@ -41,6 +41,7 @@ def endpoint_start_process(_name, _start, _finish, _id, payload) # collect endpoint details endpoint = payload.fetch(:endpoint) + env = payload.fetch(:env) api_view = api_view(endpoint.options[:for]) request_method = endpoint.options.fetch(:method).first path = endpoint_expand_path(endpoint) @@ -60,7 +61,15 @@ def endpoint_start_process(_name, _start, _finish, _id, payload) span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT) span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ENDPOINT_RUN) - span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, path) if path + + if (grape_route = env['grape.routing_args'] && env['grape.routing_args'][:route_info]) + trace.set_tag( + Tracing::Metadata::Ext::HTTP::TAG_ROUTE, + grape_route.path&.gsub(/\(\.{1}:?\w+\)\z/, '') + ) + + trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH, env['SCRIPT_NAME']) + end Thread.current[KEY_RUN] = true rescue StandardError => e diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index dd800eb4c2c..68e5cf0bc3e 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -138,6 +138,29 @@ def set_request_tags!(trace, request_span, env, status, headers, response, origi request_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST) request_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_SERVER) + if status != 404 && (last_route = trace.get_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + last_script_name = trace.get_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH).to_s + + # If the last_script_name is empty but the env['SCRIPT_NAME'] is NOT empty + # then the current rack request was not routed and must be accounted for + # which only happens in pure nested rack requests i.e /rack/rack/hello/world + # + # To account for the unaccounted nested rack requests of /rack/hello/world, + # we use 'PATH_INFO knowing that rack cannot have named parameters + if last_script_name == '' && env['SCRIPT_NAME'] != '' + last_script_name = last_route + last_route = env['PATH_INFO'] + end + + # Clear the route and route path tags from the request trace to avoid possibility of misplacement + trace.clear_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE) + trace.clear_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH) + + # Ensure tags are placed in rack.request span as desired + request_span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, last_script_name + last_route) + request_span.clear_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH) + end + # Set analytics sample rate if Contrib::Analytics.enabled?(configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate]) diff --git a/lib/datadog/tracing/contrib/sinatra/tracer.rb b/lib/datadog/tracing/contrib/sinatra/tracer.rb index 4c535c0c8c8..36b823933e8 100644 --- a/lib/datadog/tracing/contrib/sinatra/tracer.rb +++ b/lib/datadog/tracing/contrib/sinatra/tracer.rb @@ -69,6 +69,10 @@ def route_eval trace.resource = span.resource + _, path = env['sinatra.route'].split(' ', 2) + trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, path) + trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH, env['SCRIPT_NAME']) + sinatra_request_span = Sinatra::Env.datadog_span(env) sinatra_request_span.resource = span.resource diff --git a/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb b/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb index 172de14f42a..6a6e2d015a8 100644 --- a/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +++ b/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb @@ -19,7 +19,6 @@ def initialize(app, opt = {}) end # rubocop:disable Metrics/MethodLength - # rubocop:disable Metrics/AbcSize def call(env) # Find out if this is Sinatra within Sinatra return @app.call(env) if Sinatra::Env.datadog_span(env) @@ -66,7 +65,6 @@ def call(env) # since the latter is unaware of what the resource might be # and would fallback to a generic resource name when unset rack_request_span.resource ||= span.resource if rack_request_span - rack_request_span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, datadog_route) if datadog_route if response if (status = response[0]) @@ -90,7 +88,6 @@ def call(env) end end # rubocop:enable Metrics/MethodLength - # rubocop:enable Metrics/AbcSize private diff --git a/spec/datadog/tracing/contrib/action_pack/action_dispatch/journey/router_spec.rb b/spec/datadog/tracing/contrib/action_pack/action_dispatch/journey/router_spec.rb index 05deabb6a42..6fab8071ba0 100644 --- a/spec/datadog/tracing/contrib/action_pack/action_dispatch/journey/router_spec.rb +++ b/spec/datadog/tracing/contrib/action_pack/action_dispatch/journey/router_spec.rb @@ -139,78 +139,78 @@ def create it 'sets http.route when requesting a known route' do get '/api/users/1' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_ok - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta).fetch('http.route')).to eq('/api/users/:id') - expect(rack_trace.send(:meta)).not_to have_key('http.route.path') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags.fetch('http.route')).to eq('/api/users/:id') + expect(request_span.tags).not_to have_key('http.route.path') end it 'sets http.route correctly for ambiguous route with constraints' do get '/items/1' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_ok - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta).fetch('http.route')).to eq('/items/:id') - expect(rack_trace.send(:meta)).not_to have_key('http.route.path') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags.fetch('http.route')).to eq('/items/:id') + expect(request_span.tags).not_to have_key('http.route.path') end it 'sets http.route correctly for ambiguous route with constraints, case two' do get '/items/something' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_ok - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta).fetch('http.route')).to eq('/items/:slug') - expect(rack_trace.send(:meta)).not_to have_key('http.route.path') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags.fetch('http.route')).to eq('/items/:slug') + expect(request_span.tags).not_to have_key('http.route.path') end it 'sets http.route correctly for routes with globbing' do get 'books/some/section/title' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_ok - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta).fetch('http.route')).to eq('/books/*section/:title') - expect(rack_trace.send(:meta)).not_to have_key('http.route.path') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags.fetch('http.route')).to eq('/books/*section/:title') + expect(request_span.tags).not_to have_key('http.route.path') end it 'sets http.route and http.route.path for rails engine routes' do get '/api/auth/sign-in' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_ok - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta).fetch('http.route')).to eq('/sign-in(/:expires_in)') - expect(rack_trace.send(:meta).fetch('http.route.path')).to eq('/api/auth') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags.fetch('http.route')).to eq('/api/auth/sign-in(/:expires_in)') + expect(request_span.tags).not_to have_key('http.route.path') end it 'sets http.route for a route to a rack app' do get '/api/status' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_ok - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta).fetch('http.route')).to eq('/api/status') - expect(rack_trace.send(:meta)).not_to have_key('http.route.path') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags.fetch('http.route')).to eq('/api/status') + expect(request_span.tags).not_to have_key('http.route.path') end it 'does not set http.route when requesting an unknown route' do get '/nope' - rack_trace = traces.first + request_span = spans.first expect(last_response).to be_not_found - expect(rack_trace.name).to eq('rack.request') - expect(rack_trace.send(:meta)).not_to have_key('http.route') - expect(rack_trace.send(:meta)).not_to have_key('http.route.path') + expect(request_span.name).to eq('rack.request') + expect(request_span.tags).not_to have_key('http.route') + expect(request_span.tags).not_to have_key('http.route.path') end end diff --git a/spec/datadog/tracing/contrib/grape/tracer_spec.rb b/spec/datadog/tracing/contrib/grape/tracer_spec.rb index 80970cd3368..933e9db5525 100644 --- a/spec/datadog/tracing/contrib/grape/tracer_spec.rb +++ b/spec/datadog/tracing/contrib/grape/tracer_spec.rb @@ -13,6 +13,7 @@ let(:render_span) { spans.find { |x| x.name == Datadog::Tracing::Contrib::Grape::Ext::SPAN_ENDPOINT_RENDER } } let(:run_span) { spans.find { |x| x.name == Datadog::Tracing::Contrib::Grape::Ext::SPAN_ENDPOINT_RUN } } + let(:rack_span) { sorted_spans.reverse.find { |x| x.name == Datadog::Tracing::Contrib::Rack::Ext::SPAN_REQUEST } } let(:run_filter_span) { spans.find { |x| x.name == Datadog::Tracing::Contrib::Grape::Ext::SPAN_ENDPOINT_RUN_FILTERS } } let(:span) { spans.last } @@ -197,10 +198,10 @@ expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/base/success') - expect(run_span.get_tag('http.status_code')).to eq('200') + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/base/success') end end @@ -266,10 +267,11 @@ expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('grape') expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/filtered/before_after') expect(run_span.get_tag('http.status_code')).to eq('200') + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/filtered/before_after') end end end @@ -301,7 +303,7 @@ expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') expect(span.get_tag('http.status_code')).to eq('405') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/base/hard_failure') end end @@ -358,10 +360,11 @@ expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('grape') expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/base/hard_failure') # Status code has not been set yet at this instrumentation point expect(run_span.get_tag('http.status_code')).to be_nil + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/base/hard_failure') end end @@ -411,7 +414,7 @@ expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('grape') expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/filtered_exception/before') end end @@ -430,7 +433,7 @@ expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') expect(span.get_tag('http.status_code')).to eq('405') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/base/soft_failure') end @@ -448,7 +451,7 @@ expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') expect(span.get_tag('http.status_code')).to eq('405') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/base/soft_failure') end end @@ -467,7 +470,7 @@ expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') expect(span.get_tag('http.status_code')).to eq('405') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/base/soft_failure') end end @@ -486,7 +489,7 @@ expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') expect(span.get_tag('http.status_code')).to eq('405') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/base/soft_failure') end end @@ -505,7 +508,8 @@ expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') expect(span.get_tag('http.status_code')).to eq('405') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/base/soft_failure') end end @@ -554,10 +558,11 @@ expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('grape') expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('endpoint_run') - expect(span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/base/soft_failure') expect(run_span.get_tag('http.status_code')).to eq('500') + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/base/soft_failure') end end end @@ -606,7 +611,8 @@ expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_PATH)).to eq('/widgets') expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_METHOD)).to eq('GET') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/widgets') end end @@ -654,7 +660,8 @@ expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_PATH)).to eq('/widgets') expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_METHOD)).to eq('POST') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/widgets') end end @@ -692,7 +699,8 @@ expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_PATH)).to eq('/nested/widgets') expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_METHOD)).to eq('GET') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + + expect(trace.send(:meta).fetch(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) .to eq('/nested/widgets') end end @@ -779,10 +787,7 @@ expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_METHOD)).to eq('GET') expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_URL)).to eq('/success') - expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_PATH)).to eq('/success') expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_METHOD)).to eq('GET') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/success') expect(rack_span.name).to eq('rack.request') expect(rack_span.type).to eq('web') @@ -790,6 +795,7 @@ expect(rack_span.resource).to eq('RackTestingAPI GET /success') expect(rack_span).to_not have_error expect(rack_span).to be_root_span + expect(rack_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)).to eq('/api/success') end end @@ -848,8 +854,6 @@ expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_PATH)).to eq('/hard_failure') expect(run_span.get_tag(Datadog::Tracing::Contrib::Grape::Ext::TAG_ROUTE_METHOD)).to eq('GET') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/hard_failure') expect(rack_span.name).to eq('rack.request') expect(rack_span.type).to eq('web') @@ -857,6 +861,8 @@ expect(rack_span.resource).to eq('RackTestingAPI GET /hard_failure') expect(rack_span).to have_error expect(rack_span).to be_root_span + expect(rack_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/api/hard_failure') end end @@ -894,8 +900,10 @@ run_span = spans.find { |s| s.name == 'grape.endpoint_run' } expect(run_span.name).to eq('grape.endpoint_run') expect(run_span.resource).to eq('RackTestingAPI GET /span_resource_rack/span_resource') - expect(run_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) - .to eq('/span_resource_rack/span_resource') + + rack_span = spans.find { |x| x.name == Datadog::Tracing::Contrib::Rack::Ext::SPAN_REQUEST } + expect(rack_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/api/span_resource_rack/span_resource') end it 'sets the trace resource before calling the endpoint' do diff --git a/spec/datadog/tracing/contrib/rails/rack_spec.rb b/spec/datadog/tracing/contrib/rails/rack_spec.rb index ab3c2b2c22d..9967decb34d 100644 --- a/spec/datadog/tracing/contrib/rails/rack_spec.rb +++ b/spec/datadog/tracing/contrib/rails/rack_spec.rb @@ -138,7 +138,6 @@ def internal_server_error request_span, controller_span, cache_span, render_span = spans expect(trace.resource).to eq('TestController#full') - expect(trace.send(:meta).fetch('http.route')).to eq('/full') expect(request_span.name).to eq('rack.request') expect(request_span.type).to eq('web') @@ -152,6 +151,8 @@ def internal_server_error .to eq('rack') expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('request') + expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/full') expect(controller_span.name).to eq('rails.action_controller') expect(controller_span.type).to eq('web') @@ -375,7 +376,6 @@ def internal_server_error request_span, controller_span = spans expect(trace.resource).to eq('TestController#error') - expect(trace.send(:meta).fetch('http.route')).to eq('/error') expect(request_span.name).to eq('rack.request') expect(request_span.type).to eq('web') @@ -389,6 +389,8 @@ def internal_server_error .to eq('rack') expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('request') + expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/error') expect(controller_span.name).to eq('rails.action_controller') expect(controller_span).to have_error @@ -411,7 +413,6 @@ def internal_server_error request_span, controller_span = spans expect(trace.resource).to eq('TestController#soft_error') - expect(trace.send(:meta).fetch('http.route')).to eq('/soft_error') expect(request_span.name).to eq('rack.request') expect(request_span.type).to eq('web') @@ -425,6 +426,8 @@ def internal_server_error .to eq('rack') expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('request') + expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/soft_error') expect(controller_span.name).to eq('rails.action_controller') expect(controller_span).to have_error @@ -447,7 +450,6 @@ def internal_server_error request_span, controller_span = spans expect(trace.resource).to eq('TestController#sub_error') - expect(trace.send(:meta).fetch('http.route')).to eq('/sub_error') expect(request_span.name).to eq('rack.request') expect(request_span.type).to eq('web') @@ -464,6 +466,8 @@ def internal_server_error .to eq('rack') expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION)) .to eq('request') + expect(request_span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_ROUTE)) + .to eq('/sub_error') expect(controller_span.name).to eq('rails.action_controller') expect(controller_span).to have_error