diff --git a/rollbar/__init__.py b/rollbar/__init__.py index 357b200a..06508207 100644 --- a/rollbar/__init__.py +++ b/rollbar/__init__.py @@ -172,7 +172,7 @@ def init(access_token, environment='production', **kw): agent_log = _create_agent_log() -def report_exc_info(exc_info=None, request=None, extra_data=None, payload_data=None, **kw): +def report_exc_info(exc_info=None, request=None, extra_data=None, payload_data=None, level=None, **kw): """ Reports an exception to Rollbar, using exc_info (from calling sys.exc_info()) @@ -195,7 +195,7 @@ def report_exc_info(exc_info=None, request=None, extra_data=None, payload_data=N exc_info = sys.exc_info() try: - return _report_exc_info(exc_info, request, extra_data, payload_data) + return _report_exc_info(exc_info, request, extra_data, payload_data, level=level) except Exception as e: log.exception("Exception while reporting exc_info to Rollbar. %r", e) @@ -361,7 +361,7 @@ def _create_agent_log(): return retval -def _report_exc_info(exc_info, request, extra_data, payload_data): +def _report_exc_info(exc_info, request, extra_data, payload_data, level=None): """ Called by report_exc_info() wrapper """ @@ -379,6 +379,10 @@ def _report_exc_info(exc_info, request, extra_data, payload_data): if filtered_level: data['level'] = filtered_level + # explicitly override the level with provided level + if level: + data['level'] = level + # exception info # most recent call last raw_frames = traceback.extract_tb(trace) diff --git a/rollbar/test/test_rollbar.py b/rollbar/test/test_rollbar.py index 471f446f..a855cc1a 100644 --- a/rollbar/test/test_rollbar.py +++ b/rollbar/test/test_rollbar.py @@ -226,3 +226,34 @@ def test_uuid(self, send_payload): payload = json.loads(send_payload.call_args[0][0]) self.assertEqual(payload['data']['uuid'], uuid) + + @mock.patch('rollbar.send_payload') + def test_report_exc_info_level(self, send_payload): + + try: + raise Exception('level_error') + except: + rollbar.report_exc_info() + + self.assertEqual(send_payload.called, True) + payload = json.loads(send_payload.call_args[0][0]) + self.assertEqual(payload['data']['level'], 'error') + + try: + raise Exception('level_info') + except: + rollbar.report_exc_info(level='info') + + self.assertEqual(send_payload.called, True) + payload = json.loads(send_payload.call_args[0][0]) + self.assertEqual(payload['data']['level'], 'info') + + # payload takes precendence over 'level' + try: + raise Exception('payload_warn') + except: + rollbar.report_exc_info(level='info', payload_data={'level': 'warn'}) + + self.assertEqual(send_payload.called, True) + payload = json.loads(send_payload.call_args[0][0]) + self.assertEqual(payload['data']['level'], 'warn')