diff --git a/config/initializers/health_check_event_filter.rb b/config/initializers/health_check_event_filter.rb new file mode 100644 index 00000000..ebc27c00 --- /dev/null +++ b/config/initializers/health_check_event_filter.rb @@ -0,0 +1,32 @@ +class FilteredEventSubscriber + def initialize(subscriber, filter:) + @subscriber = subscriber + @filter = filter + end + + def emit(event) + @subscriber.emit(event) if @filter.call(event) + end +end + +class HealthCheckFilteredEventSubscriber < FilteredEventSubscriber + def initialize(subscriber) + filter = ->(event) { event.dig(:payload, :controller) != "Rails::HealthController" } + + super(subscriber, filter:) + end +end + +Rails.application.config.to_prepare do + next unless defined?(Appsignal::Integrations::ActiveSupportEventReporter::Subscriber) + + subscribers = Rails.event.instance_variable_get(:@subscribers) + original = subscribers.find { it[:subscriber].is_a? Appsignal::Integrations::ActiveSupportEventReporter::Subscriber } + + next unless original + + subscribers.delete original + + filtered = HealthCheckFilteredEventSubscriber.new(original[:subscriber]) + Rails.event.subscribe(filtered, &original[:filter]) +end diff --git a/test/lib/health_check_event_filtering_test.rb b/test/lib/health_check_event_filtering_test.rb new file mode 100644 index 00000000..67c144b8 --- /dev/null +++ b/test/lib/health_check_event_filtering_test.rb @@ -0,0 +1,34 @@ +require "test_helper" + +class HealthCheckEventFilteringTest < ActionDispatch::IntegrationTest + test "filters out health check request events" do + with_filtered_event_reporter do + assert_no_event_reported("action_controller.request_started") do + get health_check_path + assert_response :ok + end + end + end + + test "passes through non-health check request events" do + assert_event_reported("action_controller.request_completed") do + get root_path + end + end + + private + + def with_filtered_event_reporter + original = ActiveSupport.event_reporter + ActiveSupport.event_reporter = FilteredEventReporter.new(original) + yield + ensure + ActiveSupport.event_reporter = original + end + + class FilteredEventReporter < SimpleDelegator + def subscribe(subscriber, &filter) + super(HealthCheckFilteredEventSubscriber.new(subscriber), &filter) + end + end +end