diff --git a/src/sentry/utils/raven.py b/src/sentry/utils/raven.py index 891542f904cb3f..bebf566a02ddca 100644 --- a/src/sentry/utils/raven.py +++ b/src/sentry/utils/raven.py @@ -60,6 +60,10 @@ def send(self, **kwargs): if not is_current_event_safe(): return + # Force raven-python encoding of this event, so that edge cases like + # non JSON-serializable objects are handled. + kwargs = self.decode(self.encode(kwargs)) + from sentry import tsdb from sentry.coreapi import ClientApiHelper from sentry.event_manager import EventManager diff --git a/tests/sentry/utils/test_raven.py b/tests/sentry/utils/test_raven.py index 2cfe8dc2743ddb..9f960ff75fa785 100644 --- a/tests/sentry/utils/test_raven.py +++ b/tests/sentry/utils/test_raven.py @@ -40,3 +40,24 @@ def test_upstream(self, send): _, kwargs = send.call_args # and got tagged properly assert kwargs['tags']['install-id'] == 'abc123' + + @patch.object(SentryInternalClient, 'is_enabled', Mock(return_value=True)) + def test_encoding(self): + + class NotJSONSerializable(): + pass + + sic = SentryInternalClient() + with self.tasks(): + sic.send(**{ + 'sentry.interfaces.Message': { + 'message': 'check the req', + }, + 'extra': { + 'request': NotJSONSerializable() + }, + }) + + event = Event.objects.get() + assert event.data['sentry.interfaces.Message']['message'] == 'check the req' + assert 'NotJSONSerializable' in event.data['extra']['request']