diff --git a/lib/instana/activators/action_view.rb b/lib/instana/activators/action_view.rb index e04acdcb..434bca40 100644 --- a/lib/instana/activators/action_view.rb +++ b/lib/instana/activators/action_view.rb @@ -12,8 +12,11 @@ def instrument require 'instana/instrumentation/action_view' ::ActionView::PartialRenderer - .prepend(Instana::Instrumentation::ActionView) - + .prepend(Instana::Instrumentation::ActionView::PartialRenderer) + if defined?(::ActionView::CollectionRenderer) + ::ActionView::CollectionRenderer + .prepend(Instrumentation::ActionView::CollectionRenderer) + end true end end diff --git a/lib/instana/instrumentation/action_view.rb b/lib/instana/instrumentation/action_view.rb index 2d681ee0..9f9b889a 100644 --- a/lib/instana/instrumentation/action_view.rb +++ b/lib/instana/instrumentation/action_view.rb @@ -4,26 +4,52 @@ module Instana module Instrumentation module ActionView - def render_partial(*args) - call_payload = { - render: { - type: :partial, - name: @options.is_a?(Hash) ? @options[:partial].to_s : 'Unknown' + module PartialRenderer + def render_partial(*args) + call_payload = { + render: { + type: :partial, + name: @options.is_a?(Hash) ? @options[:partial].to_s : 'Unknown' + } } - } - ::Instana::Tracer.trace(:render, call_payload) { super(*args) } + ::Instana::Tracer.trace(:render, call_payload) { super(*args) } + end + + def render_collection(*args) + call_payload = { + render: { + type: :collection, + name: @path.to_s + } + } + + ::Instana::Tracer.trace(:render, call_payload) { super(*args) } + end + + def render_partial_template(*args) + call_payload = { + render: { + type: :partial, + name: @options.is_a?(Hash) ? @options[:partial].to_s : 'Unknown' + } + } + + ::Instana::Tracer.trace(:render, call_payload) { super(*args) } + end end - def render_collection(*args) - call_payload = { - render: { - type: :collection, - name: @path.to_s + module CollectionRenderer + def render_collection(*args) + call_payload = { + render: { + type: :collection, + name: @options.is_a?(Hash) ? @options[:partial].to_s : 'Unknown' + } } - } - ::Instana::Tracer.trace(:render, call_payload) { super(*args) } + ::Instana::Tracer.trace(:render, call_payload) { super(*args) } + end end end end diff --git a/test/instrumentation/rails_action_view_test.rb b/test/instrumentation/rails_action_view_test.rb index 13981f16..07f7dc0e 100644 --- a/test/instrumentation/rails_action_view_test.rb +++ b/test/instrumentation/rails_action_view_test.rb @@ -17,18 +17,6 @@ def app def setup clear_all! - @framework_version = Gem::Specification.find_by_name('rails').version - @supported_framework_version = @framework_version < Gem::Version.new('6.1') - @execute_test_if_framework_version_is_supported = lambda { - unless @supported_framework_version - skip "Skipping this test because Rails version #{@framework_version} is not yet supported!" - end - } - @execute_test_only_if_framework_version_is_not_supported = lambda { - if @supported_framework_version - skip "Skipping this test because Rails version #{@framework_version} is already supported!" - end - } end def test_config_defaults @@ -37,25 +25,7 @@ def test_config_defaults assert_equal true, ::Instana.config[:action_view][:enabled] end - def test_no_tracing_if_unsupported_version_only_render_is_ok - @execute_test_only_if_framework_version_is_not_supported.call - - ['/render_view', '/render_view_direct', '/render_partial', '/render_collection', '/render_file', - '/render_alternate_layout', '/render_json', '/render_xml', - '/render_rawbody', '/render_js'].each do |endpoint| - get endpoint - assert last_response.ok? - end - - get '/render_partial_that_errors' - assert_equal false, last_response.ok? - - spans = ::Instana.processor.queued_spans - assert_equal [], spans - end - def test_render_view - @execute_test_if_framework_version_is_supported.call get '/render_view' assert last_response.ok? @@ -66,7 +36,6 @@ def test_render_view end def test_render_view_direct - @execute_test_if_framework_version_is_supported.call get '/render_view_direct' assert last_response.ok? @@ -89,7 +58,6 @@ def test_render_nothing end def test_render_file - @execute_test_if_framework_version_is_supported.call get '/render_file' assert last_response.ok? @@ -100,7 +68,6 @@ def test_render_file end def test_render_json - @execute_test_if_framework_version_is_supported.call get '/render_json' assert last_response.ok? @@ -111,7 +78,6 @@ def test_render_json end def test_render_xml - @execute_test_if_framework_version_is_supported.call get '/render_xml' assert last_response.ok? @@ -122,7 +88,6 @@ def test_render_xml end def test_render_body - @execute_test_if_framework_version_is_supported.call get '/render_rawbody' assert last_response.ok? @@ -133,7 +98,6 @@ def test_render_body end def test_render_js - @execute_test_if_framework_version_is_supported.call get '/render_js' assert last_response.ok? @@ -144,7 +108,6 @@ def test_render_js end def test_render_alternate_layout - @execute_test_if_framework_version_is_supported.call get '/render_alternate_layout' assert last_response.ok? @@ -155,7 +118,6 @@ def test_render_alternate_layout end def test_render_partial - @execute_test_if_framework_version_is_supported.call get '/render_partial' assert last_response.ok? @@ -166,7 +128,6 @@ def test_render_partial end def test_render_partial_that_errors - @execute_test_if_framework_version_is_supported.call get '/render_partial_that_errors' refute last_response.ok? @@ -182,13 +143,11 @@ def test_render_partial_that_errors end def test_render_collection - @execute_test_if_framework_version_is_supported.call get '/render_collection' assert last_response.ok? spans = ::Instana.processor.queued_spans span = find_first_span_by_name(spans, :render) - assert_equal :collection, span[:data][:render][:type] assert_equal 'blocks/block', span[:data][:render][:name] end diff --git a/test/support/apps/action_view/config.ru b/test/support/apps/action_view/config.ru index bae936d0..1f6081e0 100644 --- a/test/support/apps/action_view/config.ru +++ b/test/support/apps/action_view/config.ru @@ -11,41 +11,27 @@ class TestViewApplication < Rails::Application config.consider_all_requests_local = true config.secret_key_base = 'test_key' config.secret_token = 'test_token' + config.autoload_paths = [] + ActiveSupport::Dependencies.autoload_paths = ActiveSupport::Dependencies.autoload_paths.dup + ActiveSupport::Dependencies.autoload_once_paths = ActiveSupport::Dependencies.autoload_paths.dup if Rails::VERSION::MAJOR > 5 config.hosts.clear end - if Gem::Version.new('6.1.0') > RAILS_VERSION - routes.append do - get '/render_view' => 'test_view#render_view' - get '/render_view_direct' => 'test_view#render_view_direct' - get '/render_partial' => 'test_view#render_partial' - get '/render_partial_that_errors' => 'test_view#render_partial_that_errors' - get '/render_collection' => 'test_view#render_collection' - get '/render_file' => 'test_view#render_file' - get '/render_alternate_layout' => 'test_view#render_alternate_layout' - get '/render_nothing' => 'test_view#render_nothing' - get '/render_json' => 'test_view#render_json' - get '/render_xml' => 'test_view#render_xml' - get '/render_rawbody' => 'test_view#render_rawbody' - get '/render_js' => 'test_view#render_js' - end - else - routes.draw do - get '/render_view', to: 'test_view#render_view' - get '/render_view_direct', to: 'test_view#render_view_direct' - get '/render_partial', to: 'test_view#render_partial' - get '/render_partial_that_errors', to: 'test_view#render_partial_that_errors' - get '/render_collection', to: 'test_view#render_collection' - get '/render_file', to: 'test_view#render_file' - get '/render_alternate_layout', to: 'test_view#render_alternate_layout' - get '/render_nothing', to: 'test_view#render_nothing' - get '/render_json', to: 'test_view#render_json' - get '/render_xml', to: 'test_view#render_xml' - get '/render_rawbody', to: 'test_view#render_rawbody' - get '/render_js', to: 'test_view#render_js' - end + routes.append do + get '/render_view' => 'test_view#render_view' + get '/render_view_direct' => 'test_view#render_view_direct' + get '/render_partial' => 'test_view#render_partial' + get '/render_partial_that_errors' => 'test_view#render_partial_that_errors' + get '/render_collection' => 'test_view#render_collection' + get '/render_file' => 'test_view#render_file' + get '/render_alternate_layout' => 'test_view#render_alternate_layout' + get '/render_nothing' => 'test_view#render_nothing' + get '/render_json' => 'test_view#render_json' + get '/render_xml' => 'test_view#render_xml' + get '/render_rawbody' => 'test_view#render_rawbody' + get '/render_js' => 'test_view#render_js' end end @@ -123,10 +109,5 @@ class TestViewController < ActionController::Base end end -# With 6.1 and above explicit initialisation is not possible anymore -# but below that it is required -unless Gem::Version.new('6.1.0') < RAILS_VERSION - TestViewApplication.initialize! -end - +TestViewApplication.initialize! run TestViewApplication diff --git a/test/support/apps/action_view/views/test_view/render_collection.html.erb b/test/support/apps/action_view/views/test_view/render_collection.html.erb index 7e34a863..9352598b 100644 --- a/test/support/apps/action_view/views/test_view/render_collection.html.erb +++ b/test/support/apps/action_view/views/test_view/render_collection.html.erb @@ -1,3 +1,3 @@ This is the template file. -