diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a0cf18b43..a1af43712 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,10 @@ nav_order: 6 ## main +* Add `view_identifier` to the `render.view_component` instrumentation event payload, containing the path to the component's template file (e.g. `app/components/my_component.html.erb`). For components using inline render methods, `view_identifier` will be `nil`. + + *GitHub Copilot* + ## 4.5.0 * Fix initialization ordering issue causing missing asset errors in Sprockets. diff --git a/docs/guide/instrumentation.md b/docs/guide/instrumentation.md index 9ff6fb976..2a29ed12a 100644 --- a/docs/guide/instrumentation.md +++ b/docs/guide/instrumentation.md @@ -22,7 +22,7 @@ Subscribe to the event: ```ruby ActiveSupport::Notifications.subscribe("render.view_component") do |event| # or !render.view_component event.name # => "render.view_component" - event.payload # => { name: "MyComponent", identifier: "/Users/mona/project/app/components/my_component.rb" } + event.payload # => { name: "MyComponent", identifier: "/Users/mona/project/app/components/my_component.rb", view_identifier: "/Users/mona/project/app/components/my_component.html.erb" } end ``` diff --git a/lib/view_component/instrumentation.rb b/lib/view_component/instrumentation.rb index 2b50d84f2..ee59d7351 100644 --- a/lib/view_component/instrumentation.rb +++ b/lib/view_component/instrumentation.rb @@ -11,15 +11,28 @@ def self.included(mod) def render_in(view_context, &block) return super if !Rails.application.config.view_component.instrumentation_enabled.present? + payload = { + name: self.class.name, + identifier: self.class.identifier, + view_identifier: nil + } + ActiveSupport::Notifications.instrument( "render.view_component", - { - name: self.class.name, - identifier: self.class.identifier - } + payload ) do - super + result = super + payload[:view_identifier] = @__vc_instrumentation_view_identifier + result end + ensure + @__vc_instrumentation_view_identifier = nil + end + + def around_render + result = super + @__vc_instrumentation_view_identifier = current_template&.path + result end end end diff --git a/test/sandbox/test/instrumentation_test.rb b/test/sandbox/test/instrumentation_test.rb index 49013c853..ea8254620 100644 --- a/test/sandbox/test/instrumentation_test.rb +++ b/test/sandbox/test/instrumentation_test.rb @@ -16,6 +16,7 @@ def test_instrumentation_for_include assert_equal("render.view_component", events[0].name) assert_equal(events[0].payload[:name], "InstrumentationComponent") assert_match("app/components/instrumentation_component.rb", events[0].payload[:identifier]) + assert_match("app/components/instrumentation_component.html.erb", events[0].payload[:view_identifier]) end def test_instrumentation_disabled