diff --git a/.changesets/check-rails-backtrace_cleaner-method.md b/.changesets/check-rails-backtrace_cleaner-method.md new file mode 100644 index 000000000..bde1bd498 --- /dev/null +++ b/.changesets/check-rails-backtrace_cleaner-method.md @@ -0,0 +1,5 @@ +--- +bump: "patch" +--- + +Check Rails.backtrace_cleaner method before calling the method. This prevents a NoMethodError from being raised in some edge cases. diff --git a/lib/appsignal/transaction.rb b/lib/appsignal/transaction.rb index 7d9c3e678..cec97b6e6 100644 --- a/lib/appsignal/transaction.rb +++ b/lib/appsignal/transaction.rb @@ -526,7 +526,7 @@ def sanitized_tags end def cleaned_backtrace(backtrace) - if defined?(::Rails) && backtrace + if defined?(::Rails) && Rails.respond_to?(:backtrace_cleaner) && backtrace ::Rails.backtrace_cleaner.clean(backtrace, nil) else backtrace diff --git a/spec/lib/appsignal/transaction_spec.rb b/spec/lib/appsignal/transaction_spec.rb index d2471c932..9c06a4044 100644 --- a/spec/lib/appsignal/transaction_spec.rb +++ b/spec/lib/appsignal/transaction_spec.rb @@ -1321,6 +1321,13 @@ def session_exists?(_env) expect(subject).to eq ["line 1", "line 2"] end + context "with Rails module but without backtrace_cleaner method" do + it "returns the backtrace uncleaned" do + stub_const("Rails", Module.new) + expect(subject).to eq ["line 1", "line 2"] + end + end + if rails_present? context "with rails" do it "cleans the backtrace with the Rails backtrace cleaner" do