diff --git a/CHANGELOG.md b/CHANGELOG.md index 608f7027f..a8fbd7978 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ Changelog | [#602](https://github.com/bugsnag/bugsnag-ruby/pull/602) | [#603](https://github.com/bugsnag/bugsnag-ruby/pull/603) +* If a custom object responds to `id` method, show the id and class in error reports + | [#531](https://github.com/bugsnag/bugsnag-ruby/pull/531) + | [manojmj92](https://github.com/manojmj92) + ### Deprecated * The `ignore_classes` configuration option has been deprecated in favour of `discard_classes`. `ignore_classes` will be removed in the next major release diff --git a/lib/bugsnag/cleaner.rb b/lib/bugsnag/cleaner.rb index 25ca20508..b33d06600 100644 --- a/lib/bugsnag/cleaner.rb +++ b/lib/bugsnag/cleaner.rb @@ -7,6 +7,7 @@ class Cleaner RECURSION = '[RECURSION]'.freeze OBJECT = '[OBJECT]'.freeze RAISED = '[RAISED]'.freeze + OBJECT_WITH_ID_AND_CLASS = '[OBJECT]: [Class]: %s [ID]: %d'.freeze ## # @param configuration [Configuration] @@ -121,7 +122,12 @@ def traverse_object(obj, seen, scope) # avoid leaking potentially sensitive data from objects' #inspect output if str =~ /#<.*>/ - OBJECT + # Use id of the object if available + if obj.respond_to?(:id) + format(OBJECT_WITH_ID_AND_CLASS, class_name: obj.class, id: obj.id) + else + OBJECT + end else clean_string(str) end diff --git a/spec/cleaner_spec.rb b/spec/cleaner_spec.rb index 3f207a0e7..96bb9dfec 100644 --- a/spec/cleaner_spec.rb +++ b/spec/cleaner_spec.rb @@ -134,6 +134,17 @@ def to_s expect(subject.clean_object(object)).to eq("[RECURSION]") end + it "cleans custom objects to show the id of the object if object responds to id method" do + class MacaronWithId + def id + 10 + end + end + + a = MacaronWithId.new + expect(subject.clean_object(a)).to eq("[OBJECT]: [Class]: #{a.class.name} [ID]: #{a.id}") + end + it "cleans up binary strings properly" do if RUBY_VERSION > "1.9" obj = "Andr\xc7\xff"