Skip to content

Conversation

antonpirker
Copy link
Member

@antonpirker antonpirker commented Sep 17, 2025

Description

Remove memory pressure of DedupeIntegration. Fixes a memory leak during exception logging.

Issues

Copy link

linear bot commented Sep 17, 2025

Copy link

codecov bot commented Sep 17, 2025

❌ 63 Tests Failed:

Tests completed Failed Passed Skipped
707 63 644 8
View the top 3 failed test(s) by shortest run time
tests.integrations.chalice.test_chalice::test_has_request
Stack Traces | 0.067s run time
.../integrations/chalice/test_chalice.py:81: in test_has_request
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-debug]
Stack Traces | 0.07s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-nodebug]
Stack Traces | 0.071s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_mount
Stack Traces | 0.074s run time
.../integrations/bottle/test_bottle.py:372: in test_mount
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_flask_session_tracking
Stack Traces | 0.075s run time
.../integrations/flask/test_flask.py:309: in test_flask_session_tracking
    (first_event, error_event, session) = envelopes
E   ValueError: too many values to unpack (expected 3)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-nodebug]
Stack Traces | 0.078s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-debug]
Stack Traces | 0.079s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-nodebug]
Stack Traces | 0.079s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-debug]
Stack Traces | 0.08s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_mount
Stack Traces | 0.08s run time
.../integrations/bottle/test_bottle.py:372: in test_mount
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[manual-False-False]
Stack Traces | 0.08s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_mount
Stack Traces | 0.081s run time
.../integrations/bottle/test_bottle.py:372: in test_mount
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_error_has_trace_context_if_tracing_disabled
Stack Traces | 0.082s run time
.../integrations/flask/test_flask.py:826: in test_error_has_trace_context_if_tracing_disabled
    (error_event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[auto-False-False]
Stack Traces | 0.082s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[auto-False-True]
Stack Traces | 0.082s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[manual-True-False]
Stack Traces | 0.082s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[manual-True-True]
Stack Traces | 0.082s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[manual-False-True]
Stack Traces | 0.083s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_failed_request_status_codes_non_http_exception
Stack Traces | 0.084s run time
.../integrations/bottle/test_bottle.py:533: in test_failed_request_status_codes_non_http_exception
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[auto-True-False]
Stack Traces | 0.084s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors[auto-True-True]
Stack Traces | 0.084s run time
.../integrations/flask/test_flask.py:153: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.flask.test_flask::test_errors_not_reported_twice[integrations1]
Stack Traces | 0.084s run time
.../integrations/flask/test_flask.py:549: in test_errors_not_reported_twice
    assert len(events) == 1
E   AssertionError: assert 3 == 1
E    +  where 3 = len([{'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'a9a195c3743e16a3', 'trace_id': '898e57d4c8d7456fa1101440dacff432'}}, 'environment': 'production', 'event_id': 'c8bd078a9058453db400b05a10cc3b8a', ...}, {'breadcrumbs': {'values': [{'category': 'tests.integrations.flask.test_flask', 'data': {}, 'level': 'error', 'message': 'division by zero', ...}]}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'a9a195c3743e16a3', 'trace_id': '898e57d4c8d7456fa1101440dacff432'}}, 'environment': 'production', 'event_id': '9b326e8dde6142c3944d814163481c1b', ...}, {'breadcrumbs': {'values': [{'category': 'tests.integrations.flask.test_flask', 'data': {}, 'level': 'error', 'message': 'division by zero', ...}]}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'a9a195c3743e16a3', 'trace_id': '898e57d4c8d7456fa1101440dacff432'}}, 'environment': 'production', 'event_id': '163c9a031ac94e389f9857bbab06662e', ...}])
tests.integrations.flask.test_flask::test_tracing_error
Stack Traces | 0.084s run time
.../integrations/flask/test_flask.py:801: in test_tracing_error
    error_event, transaction_event = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.bottle.test_bottle::test_errors[catchall-nodebug]
Stack Traces | 0.086s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations1]
Stack Traces | 0.086s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   AssertionError: assert 3 == 1
E    +  where 3 = len([{'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'af5507657ce12dd9', 'trace_id': '553dcf7922004d6599ae4084eb2a3831'}}, 'environment': 'production', 'event_id': 'f12b109577b34303aa4c479bd7da6b94', ...}, {'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'af5507657ce12dd9', 'trace_id': '553dcf7922004d6599ae4084eb2a3831'}}, 'environment': 'production', 'event_id': '2763fe68118f46148aba89b01c3a27b6', ...}, {'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'af5507657ce12dd9', 'trace_id': '553dcf7922004d6599ae4084eb2a3831'}}, 'environment': 'production', 'event_id': '70d39472abce419190810ee723e62e47', ...}])
tests.integrations.flask.test_flask::test_errors_not_reported_twice[integrations0]
Stack Traces | 0.086s run time
.../integrations/flask/test_flask.py:549: in test_errors_not_reported_twice
    assert len(events) == 1
E   AssertionError: assert 3 == 1
E    +  where 3 = len([{'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'bd1dfcba6c3366a9', 'trace_id': 'a12939a70c224094931e76e5e6ff2414'}}, 'environment': 'production', 'event_id': 'faf2e328b91843a6b6229dd12370a60f', ...}, {'breadcrumbs': {'values': [{'category': 'tests.integrations.flask.test_flask', 'data': {}, 'level': 'error', 'message': 'division by zero', ...}]}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'bd1dfcba6c3366a9', 'trace_id': 'a12939a70c224094931e76e5e6ff2414'}}, 'environment': 'production', 'event_id': 'c2c56fb688b245b2ab1c43b917bce213', ...}, {'breadcrumbs': {'values': [{'category': 'tests.integrations.flask.test_flask', 'data': {}, 'level': 'error', 'message': 'division by zero', ...}]}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': 'bd1dfcba6c3366a9', 'trace_id': 'a12939a70c224094931e76e5e6ff2414'}}, 'environment': 'production', 'event_id': '3a5d4e289d0145d9a8262b2f12c44d07', ...}])
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations0]
Stack Traces | 0.087s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   AssertionError: assert 3 == 1
E    +  where 3 = len([{'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': '97794e43e5a92d45', 'trace_id': '738241231e574df4bfb81140d825c3e4'}}, 'environment': 'production', 'event_id': 'fc4f2e2fe1064798bf14ead4e9c8f966', ...}, {'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': '97794e43e5a92d45', 'trace_id': '738241231e574df4bfb81140d825c3e4'}}, 'environment': 'production', 'event_id': 'ed031544aebf4fe48249cb6a5a84cc01', ...}, {'breadcrumbs': {'values': []}, 'contexts': {'runtime': {'build': '3.7.17 (default, Jun 23 2023, 13:13:52) \n[GCC 11.3.0]', 'name': 'CPython', 'version': '3.7.17'}, 'trace': {'parent_span_id': None, 'span_id': '97794e43e5a92d45', 'trace_id': '738241231e574df4bfb81140d825c3e4'}}, 'environment': 'production', 'event_id': 'add0fec19cfc423eb4df821bd37e8f1d', ...}])
tests.integrations.flask.test_flask::test_error_in_errorhandler
Stack Traces | 0.09s run time
.../integrations/flask/test_flask.py:667: in test_error_in_errorhandler
    event1, event2 = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.bottle.test_bottle::test_errors[catchall-debug]
Stack Traces | 0.091s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations1]
Stack Traces | 0.093s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   assert 3 == 1
E     +3
E     -1
tests.integrations.chalice.test_chalice::test_has_request
Stack Traces | 0.095s run time
.../integrations/chalice/test_chalice.py:81: in test_has_request
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[nocatchall-nodebug]
Stack Traces | 0.098s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations0]
Stack Traces | 0.099s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   assert 3 == 1
E     +3
E     -1
tests.integrations.bottle.test_bottle::test_errors[nocatchall-debug]
Stack Traces | 0.101s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations0]
Stack Traces | 0.102s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   assert 3 == 1
E    +  where 3 = len([{'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'bottle', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4ec1820>', 'dumps': '<function dumps at 0x7f21e8f5d9d0>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '89966ee773ab4936980864e6d9b5dff9', 'timestamp': '2025-09-19T11:04:09.885886Z', 'contexts': {'trace': {'trace_id': '4f49a12881a4468ba9ddf3d394b290f3', 'span_id': 'af93605e8c656986', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.8.18', 'build': '3.8.18 (default, Dec 12 2024, 19:15:02) \n[GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.8-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'requests': '2.32.4', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'jsonschema': '4.23.0', 'coverage': '7.6.1', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'docopt': '0.6.2', 'wheel': '0.43.0', 'socksio': '1.0.0', 'idna': '3.10', 'setuptools': '69.5.1', 'h2': '4.1.0', 'watchdog': '4.0.2', 'httpcore': '1.0.9', 'responses': '0.25.8', 'pytest-cov': '5.0.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'pyyaml': '6.0.2', 'tomli': '2.2.1', 'exceptiongroup': '1.3.0', 'py': '1.11.0', 'urllib3': '2.2.3', 'packaging': '25.0', 'rpds-py': '0.20.1', 'hyperframe': '6.0.1', 'typing_extensions': '4.13.2', 'hpack': '4.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'pluggy': '1.5.0', 'asttokens': '3.0.0', 'referencing': '0.35.1', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'pytest': '8.3.5', 'importlib_resources': '6.4.5', 'pytest-localserver': '0.9.0.post0', 'zipp': '3.20.2', 'attrs': '25.3.0', 'pkgutil_resolve_name': '1.3.10', 'jsonschema-specifications': '2023.12.1'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'wsgi', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>, <Transaction(name='generic WSGI request', op='http.server', trace_id='b4bc0d78c1d2472191f68d8171c5c86f', span_id='bfd1a81f231a4577', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>, <Transaction(name='generic WSGI request', op='http.server', trace_id='b4bc0d78c1d2472191f68d8171c5c86f', span_id='bfd1a81f231a4577', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4ec1820>', 'dumps': '<function dumps at 0x7f21e8f5d9d0>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': 'efec626f83134da199da77e730bd3ddd', 'timestamp': '2025-09-19T11:04:09.893537Z', 'contexts': {'trace': {'trace_id': '4f49a12881a4468ba9ddf3d394b290f3', 'span_id': 'af93605e8c656986', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.8.18', 'build': '3.8.18 (default, Dec 12 2024, 19:15:02) \n[GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.8-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'requests': '2.32.4', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'jsonschema': '4.23.0', 'coverage': '7.6.1', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'docopt': '0.6.2', 'wheel': '0.43.0', 'socksio': '1.0.0', 'idna': '3.10', 'setuptools': '69.5.1', 'h2': '4.1.0', 'watchdog': '4.0.2', 'httpcore': '1.0.9', 'responses': '0.25.8', 'pytest-cov': '5.0.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'pyyaml': '6.0.2', 'tomli': '2.2.1', 'exceptiongroup': '1.3.0', 'py': '1.11.0', 'urllib3': '2.2.3', 'packaging': '25.0', 'rpds-py': '0.20.1', 'hyperframe': '6.0.1', 'typing_extensions': '4.13.2', 'hpack': '4.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'pluggy': '1.5.0', 'asttokens': '3.0.0', 'referencing': '0.35.1', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'pytest': '8.3.5', 'importlib_resources': '6.4.5', 'pytest-localserver': '0.9.0.post0', 'zipp': '3.20.2', 'attrs': '25.3.0', 'pkgutil_resolve_name': '1.3.10', 'jsonschema-specifications': '2023.12.1'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'logging', 'handled': True}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'test_errors_not_reported_twice', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 342, 'pre_context': ['', '    client = get_client()', '', '    with pytest.raises(ZeroDivisionError):', '        try:'], 'context_line': '            client.get("/")', 'post_context': ['        except ZeroDivisionError as e:', '            logger.exception(e)', '            raise e', '', '    assert len(events) == 1'], 'vars': {'sentry_init': '<function sentry_init.<locals>.inner at 0x7f21e4f22160>', 'integrations': ['<sentry_sdk.integrations.bottle.BottleIntegration object at 0x7f21e71b9850>'], 'capture_events': '<function capture_events.<locals>.inner at 0x7f21e4f2bc10>', 'app': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'get_client': '<function get_client.<locals>.inner at 0x7f21e4ec14c0>', 'logger': '<Logger bottle.app (WARNING)>', 'index': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4ec1820>', 'events': [{'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'bottle\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4ec1820>\', \'dumps\': \'<function dumps at 0x7f21e8f5d9d0>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'89966ee773ab4936980864e6d9b5dff9'", 'timestamp': "'2025-09-19T11:04:09.885886Z'", 'contexts': {'trace': {'trace_id': "'4f49a12881a4468ba9ddf3d394b290f3'", 'span_id': "'af93605e8c656986'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.8.18'", 'build': "'3.8.18 (default, Dec 12 2024, 19:15:02) \\n[GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.8-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'requests': "'2.32.4'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'jsonschema': "'4.23.0'", 'coverage': "'7.6.1'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'"}}, {'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'wsgi\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'__call__\', \'module\': \'bottle\', \'lineno\': 1133, \'pre_context\': ["            start_response(\'500 INTERNAL SERVER ERROR\', headers, sys.exc_info())", \'            return [tob(err)]\', \'\', \'    def __call__(self, environ, start_response):\', \'        """ Each instance of :class:\\\'Bottle\\\' is a WSGI application. """\'], \'context_line\': \'        return self.wsgi(environ, start_response)\', \'post_context\': [\'\', \'    def __enter__(self):\', \'        """ Use this application as default for all module-level shortcuts. """\', \'        default_app.push(self)\', \'        return self\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f21e4f3cc70>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'b4bc0d78c1d2472191f68d8171c5c86f\', span_id=\'bfd1a81f231a4577\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'wsgi\', \'module\': \'bottle\', \'lineno\': 1104, \'pre_context\': [\'        return new_iter\', \'\', \'    def wsgi(self, environ, start_response):\', \'        """ The bottle WSGI-interface. """\', \'        try:\'], \'context_line\': \'            out = self._cast(self._handle(environ))\', \'post_context\': [\'            # rfc2616 section 4.3\', \'            if response._status_code in (100, 101, 204, 304)\\\\\', "            or environ[\'REQUEST_METHOD\'] == \'HEAD\':", "                if hasattr(out, \'close\'): out.close()", \'                out = []\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f21e4f3cc70>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'b4bc0d78c1d2472191f68d8171c5c86f\', span_id=\'bfd1a81f231a4577\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'_handle\', \'module\': \'bottle\', \'lineno\': 996, \'pre_context\': ["                    self.trigger_hook(\'before_request\')", \'                    route, args = self.router.match(environ)\', "                    environ[\'route.handle\'] = route", "                    environ[\'bottle.route\'] = route", "                    environ[\'route.url_args\'] = args"], \'context_line\': \'                    out = route.call(**args)\', \'post_context\': [\'                    break\', \'                except HTTPResponse as E:\', \'                    out = E\', \'                    break\', \'                except RouteReset:\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f21e4f3cc70>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'path\': "\'/\'", \'out\': \'None\', \'route\': \'<GET / -> tests.integrations.bottle.test_bottle:index>\', \'args\': {}}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4ec1820>\', \'dumps\': \'<function dumps at 0x7f21e8f5d9d0>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'efec626f83134da199da77e730bd3ddd'", 'timestamp': "'2025-09-19T11:04:09.893537Z'", 'contexts': {'trace': {'trace_id': "'4f49a12881a4468ba9ddf3d394b290f3'", 'span_id': "'af93605e8c656986'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.8.18'", 'build': "'3.8.18 (default, Dec 12 2024, 19:15:02) \\n[GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.8-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'requests': "'2.32.4'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'jsonschema': "'4.23.0'", 'coverage': "'7.6.1'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'"}}], 'client': '<Client <bottle.Bottle object at 0x7f21e4f3cc70>>', 'e': "ZeroDivisionError('division by zero')"}, 'in_app': True}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'get', 'module': 'werkzeug.test', 'lineno': 1131, 'pre_context': ['        return response', '', '    def get(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``GET``."""', '        kw["method"] = "GET"'], 'context_line': '        return self.open(*args, **kw)', 'post_context': ['', '    def post(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``POST``."""', '        kw["method"] = "POST"', '        return self.open(*args, **kw)'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f21e4f3cc70>>', 'args': ["'/'"], 'kw': {'method': "'GET'"}}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'open', 'module': 'werkzeug.test', 'lineno': 1076, 'pre_context': ['            try:', '                request = builder.get_request()', '            finally:', '                builder.close()', ''], 'context_line': '        response = self.run_wsgi_app(request.environ, buffered=buffered)', 'post_context': ['        response = self.response_wrapper(*response, request=request)', '', '        redirects = set()', '        history: t.List["TestResponse"] = []', ''], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f21e4f3cc70>>', 'as_tuple': 'False', 'buffered': 'False', 'follow_redirects': 'False', 'args': ["'/'"], 'kwargs': {'method': "'GET'"}, 'request': "<Request 'http://localhost/' [GET]>", 'builder': '<werkzeug.test.EnvironBuilder object at 0x7f21e4f21d60>'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 945, 'pre_context': ['        :meta private:', '        """', '        if self.cookie_jar is not None:', '            self.cookie_jar.inject_wsgi(environ)', ''], 'context_line': '        rv = run_wsgi_app(self.application, environ, buffered=buffered)', 'post_context': ['', '        if self.cookie_jar is not None:', '            self.cookie_jar.extract_wsgi(environ, rv[2])', '', '        return rv'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f21e4f3cc70>>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 1233, 'pre_context': ['                exc_info = None', '', '        response = (status, headers)', '        return buffer.append', ''], 'context_line': '    app_rv = app(environ, start_response)', 'post_context': ['    close_func = getattr(app_rv, "close", None)', '    app_iter: t.Iterable[bytes] = iter(app_rv)', '', '    # when buffering we emit the close call early and convert the', '    # application iterator into a regular list'], 'vars': {'app': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False', 'start_response': '<function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>', 'buffer': [], 'response': 'None'}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>, <Transaction(name='generic WSGI request', op='http.server', trace_id='b4bc0d78c1d2472191f68d8171c5c86f', span_id='bfd1a81f231a4577', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4ec1e50>, <Transaction(name='generic WSGI request', op='http.server', trace_id='b4bc0d78c1d2472191f68d8171c5c86f', span_id='bfd1a81f231a4577', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cc70>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4ec1820>', 'dumps': '<function dumps at 0x7f21e8f5d9d0>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'logger': 'bottle.app', 'logentry': {'message': 'division by zero', 'formatted': 'division by zero', 'params': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.8-bottle-v0.13.4']}, 'event_id': '75f92f3c925949fe9b0a3de78b2d1534', 'timestamp': '2025-09-19T11:04:09.909891Z', 'contexts': {'trace': {'trace_id': '4f49a12881a4468ba9ddf3d394b290f3', 'span_id': 'af93605e8c656986', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.8.18', 'build': '3.8.18 (default, Dec 12 2024, 19:15:02) \n[GCC 11.4.0]'}}, 'transaction_info': {}, 'breadcrumbs': {'values': []}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'requests': '2.32.4', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'jsonschema': '4.23.0', 'coverage': '7.6.1', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'docopt': '0.6.2', 'wheel': '0.43.0', 'socksio': '1.0.0', 'idna': '3.10', 'setuptools': '69.5.1', 'h2': '4.1.0', 'watchdog': '4.0.2', 'httpcore': '1.0.9', 'responses': '0.25.8', 'pytest-cov': '5.0.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'pyyaml': '6.0.2', 'tomli': '2.2.1', 'exceptiongroup': '1.3.0', 'py': '1.11.0', 'urllib3': '2.2.3', 'packaging': '25.0', 'rpds-py': '0.20.1', 'hyperframe': '6.0.1', 'typing_extensions': '4.13.2', 'hpack': '4.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'pluggy': '1.5.0', 'asttokens': '3.0.0', 'referencing': '0.35.1', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'pytest': '8.3.5', 'importlib_resources': '6.4.5', 'pytest-localserver': '0.9.0.post0', 'zipp': '3.20.2', 'attrs': '25.3.0', 'pkgutil_resolve_name': '1.3.10', 'jsonschema-specifications': '2023.12.1'}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}])
tests.integrations.bottle.test_bottle::test_failed_request_status_codes_non_http_exception
Stack Traces | 0.103s run time
.../integrations/bottle/test_bottle.py:533: in test_failed_request_status_codes_non_http_exception
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors[catchall-nodebug]
Stack Traces | 0.104s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_mount
Stack Traces | 0.104s run time
.../integrations/bottle/test_bottle.py:372: in test_mount
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.pyramid.test_pyramid::test_error_in_errorhandler
Stack Traces | 0.114s run time
.../integrations/pyramid/test_pyramid.py:363: in test_error_in_errorhandler
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.chalice.test_chalice::test_has_request
Stack Traces | 0.115s run time
.../integrations/chalice/test_chalice.py:81: in test_has_request
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations1]
Stack Traces | 0.118s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   assert 3 == 1
E    +  where 3 = len([{'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'bottle', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19cfe160>', 'dumps': '<function dumps at 0x7f2e1b928180>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '55d4c791768449308099de3a4e82afa7', 'timestamp': '2025-09-19T11:04:48.549966Z', 'contexts': {'trace': {'trace_id': '8eed7b6d748449c5ac92e1ed38bba8b2', 'span_id': '88755e8e59b8d160', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.12.11', 'build': '3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.12-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'hyperframe': '6.1.0', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'pluggy': '1.6.0', 'docopt': '0.6.2', 'socksio': '1.0.0', 'requests': '2.32.5', 'coverage': '7.10.6', 'hpack': '4.1.0', 'idna': '3.10', 'setuptools': '80.9.0', 'jsonschema-specifications': '2025.9.1', 'referencing': '0.36.2', 'pygments': '2.19.2', 'httpcore': '1.0.9', 'h2': '4.3.0', 'responses': '0.25.8', 'typing_extensions': '4.15.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'jsonschema': '4.25.1', 'pyyaml': '6.0.2', 'rpds-py': '0.27.1', 'py': '1.11.0', 'packaging': '25.0', 'pytest-cov': '7.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'asttokens': '3.0.0', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'watchdog': '6.0.0', 'urllib3': '2.5.0', 'pytest': '8.4.2', 'pytest-localserver': '0.9.0.post0', 'attrs': '25.3.0'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'wsgi', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>, <Transaction(name='generic WSGI request', op='http.server', trace_id='38876be04f75453db4972ec9c77b28e5', span_id='99f0c98bb1f3b445', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>, <Transaction(name='generic WSGI request', op='http.server', trace_id='38876be04f75453db4972ec9c77b28e5', span_id='99f0c98bb1f3b445', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19cfe160>', 'dumps': '<function dumps at 0x7f2e1b928180>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '348e3c9d85c74f0fb29d9628890a83db', 'timestamp': '2025-09-19T11:04:48.556047Z', 'contexts': {'trace': {'trace_id': '8eed7b6d748449c5ac92e1ed38bba8b2', 'span_id': '88755e8e59b8d160', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.12.11', 'build': '3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.12-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'hyperframe': '6.1.0', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'pluggy': '1.6.0', 'docopt': '0.6.2', 'socksio': '1.0.0', 'requests': '2.32.5', 'coverage': '7.10.6', 'hpack': '4.1.0', 'idna': '3.10', 'setuptools': '80.9.0', 'jsonschema-specifications': '2025.9.1', 'referencing': '0.36.2', 'pygments': '2.19.2', 'httpcore': '1.0.9', 'h2': '4.3.0', 'responses': '0.25.8', 'typing_extensions': '4.15.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'jsonschema': '4.25.1', 'pyyaml': '6.0.2', 'rpds-py': '0.27.1', 'py': '1.11.0', 'packaging': '25.0', 'pytest-cov': '7.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'asttokens': '3.0.0', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'watchdog': '6.0.0', 'urllib3': '2.5.0', 'pytest': '8.4.2', 'pytest-localserver': '0.9.0.post0', 'attrs': '25.3.0'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'logging', 'handled': True}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'test_errors_not_reported_twice', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 342, 'pre_context': ['', '    client = get_client()', '', '    with pytest.raises(ZeroDivisionError):', '        try:'], 'context_line': '            client.get("/")', 'post_context': ['        except ZeroDivisionError as e:', '            logger.exception(e)', '            raise e', '', '    assert len(events) == 1'], 'vars': {'sentry_init': '<function sentry_init.<locals>.inner at 0x7f2e18a46200>', 'integrations': ['<sentry_sdk.integrations.bottle.BottleIntegration object at 0x7f2e19eaf9b0>', '<sentry_sdk.integrations.logging.LoggingIntegration object at 0x7f2e19eaf950>'], 'capture_events': '<function capture_events.<locals>.inner at 0x7f2e18a45da0>', 'app': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'get_client': '<function get_client.<locals>.inner at 0x7f2e18a46de0>', 'logger': '<Logger bottle.app (WARNING)>', 'index': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19cfe160>', 'events': [{'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'bottle\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19cfe160>\', \'dumps\': \'<function dumps at 0x7f2e1b928180>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'55d4c791768449308099de3a4e82afa7'", 'timestamp': "'2025-09-19T11:04:48.549966Z'", 'contexts': {'trace': {'trace_id': "'8eed7b6d748449c5ac92e1ed38bba8b2'", 'span_id': "'88755e8e59b8d160'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.12.11'", 'build': "'3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.12-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'hyperframe': "'6.1.0'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'", 'certifi': "'2025.8.3'", 'pluggy': "'1.6.0'"}}, {'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'wsgi\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'__call__\', \'module\': \'bottle\', \'lineno\': 1133, \'pre_context\': ["            start_response(\'500 INTERNAL SERVER ERROR\', headers, sys.exc_info())", \'            return [tob(err)]\', \'\', \'    def __call__(self, environ, start_response):\', \'        """ Each instance of :class:\\\'Bottle\\\' is a WSGI application. """\'], \'context_line\': \'        return self.wsgi(environ, start_response)\', \'post_context\': [\'\', \'    def __enter__(self):\', \'        """ Use this application as default for all module-level shortcuts. """\', \'        default_app.push(self)\', \'        return self\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f2e19ec6c30>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'38876be04f75453db4972ec9c77b28e5\', span_id=\'99f0c98bb1f3b445\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'wsgi\', \'module\': \'bottle\', \'lineno\': 1104, \'pre_context\': [\'        return new_iter\', \'\', \'    def wsgi(self, environ, start_response):\', \'        """ The bottle WSGI-interface. """\', \'        try:\'], \'context_line\': \'            out = self._cast(self._handle(environ))\', \'post_context\': [\'            # rfc2616 section 4.3\', \'            if response._status_code in (100, 101, 204, 304)\\\\\', "            or environ[\'REQUEST_METHOD\'] == \'HEAD\':", "                if hasattr(out, \'close\'): out.close()", \'                out = []\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f2e19ec6c30>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'38876be04f75453db4972ec9c77b28e5\', span_id=\'99f0c98bb1f3b445\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'_handle\', \'module\': \'bottle\', \'lineno\': 996, \'pre_context\': ["                    self.trigger_hook(\'before_request\')", \'                    route, args = self.router.match(environ)\', "                    environ[\'route.handle\'] = route", "                    environ[\'bottle.route\'] = route", "                    environ[\'route.url_args\'] = args"], \'context_line\': \'                    out = route.call(**args)\', \'post_context\': [\'                    break\', \'                except HTTPResponse as E:\', \'                    out = E\', \'                    break\', \'                except RouteReset:\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f2e19ec6c30>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'path\': "\'/\'", \'out\': \'None\', \'route\': \'<GET / -> tests.integrations.bottle.test_bottle:index>\', \'args\': {}}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19cfe160>\', \'dumps\': \'<function dumps at 0x7f2e1b928180>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'348e3c9d85c74f0fb29d9628890a83db'", 'timestamp': "'2025-09-19T11:04:48.556047Z'", 'contexts': {'trace': {'trace_id': "'8eed7b6d748449c5ac92e1ed38bba8b2'", 'span_id': "'88755e8e59b8d160'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.12.11'", 'build': "'3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.12-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'hyperframe': "'6.1.0'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'", 'certifi': "'2025.8.3'", 'pluggy': "'1.6.0'"}}], 'client': '<Client <bottle.Bottle object at 0x7f2e19ec6c30>>', 'e': "ZeroDivisionError('division by zero')"}, 'in_app': True}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'get', 'module': 'werkzeug.test', 'lineno': 1131, 'pre_context': ['        return response', '', '    def get(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``GET``."""', '        kw["method"] = "GET"'], 'context_line': '        return self.open(*args, **kw)', 'post_context': ['', '    def post(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``POST``."""', '        kw["method"] = "POST"', '        return self.open(*args, **kw)'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f2e19ec6c30>>', 'args': ["'/'"], 'kw': {'method': "'GET'"}}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'open', 'module': 'werkzeug.test', 'lineno': 1076, 'pre_context': ['            try:', '                request = builder.get_request()', '            finally:', '                builder.close()', ''], 'context_line': '        response = self.run_wsgi_app(request.environ, buffered=buffered)', 'post_context': ['        response = self.response_wrapper(*response, request=request)', '', '        redirects = set()', '        history: t.List["TestResponse"] = []', ''], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f2e19ec6c30>>', 'as_tuple': 'False', 'buffered': 'False', 'follow_redirects': 'False', 'args': ["'/'"], 'kwargs': {'method': "'GET'"}, 'request': "<Request 'http://localhost/' [GET]>", 'builder': '<werkzeug.test.EnvironBuilder object at 0x7f2e18ab3a40>'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 945, 'pre_context': ['        :meta private:', '        """', '        if self.cookie_jar is not None:', '            self.cookie_jar.inject_wsgi(environ)', ''], 'context_line': '        rv = run_wsgi_app(self.application, environ, buffered=buffered)', 'post_context': ['', '        if self.cookie_jar is not None:', '            self.cookie_jar.extract_wsgi(environ, rv[2])', '', '        return rv'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f2e19ec6c30>>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 1233, 'pre_context': ['                exc_info = None', '', '        response = (status, headers)', '        return buffer.append', ''], 'context_line': '    app_rv = app(environ, start_response)', 'post_context': ['    close_func = getattr(app_rv, "close", None)', '    app_iter: t.Iterable[bytes] = iter(app_rv)', '', '    # when buffering we emit the close call early and convert the', '    # application iterator into a regular list'], 'vars': {'app': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False', 'start_response': '<function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>', 'buffer': [], 'response': 'None'}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>, <Transaction(name='generic WSGI request', op='http.server', trace_id='38876be04f75453db4972ec9c77b28e5', span_id='99f0c98bb1f3b445', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19cfeac0>, <Transaction(name='generic WSGI request', op='http.server', trace_id='38876be04f75453db4972ec9c77b28e5', span_id='99f0c98bb1f3b445', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19ec6c30>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19cfe160>', 'dumps': '<function dumps at 0x7f2e1b928180>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'logger': 'bottle.app', 'logentry': {'message': 'division by zero', 'formatted': 'division by zero', 'params': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.12-bottle-v0.13.4']}, 'event_id': '504d82d6b434426897c5faf405eb2ba7', 'timestamp': '2025-09-19T11:04:48.569606Z', 'contexts': {'trace': {'trace_id': '8eed7b6d748449c5ac92e1ed38bba8b2', 'span_id': '88755e8e59b8d160', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.12.11', 'build': '3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'}}, 'transaction_info': {}, 'breadcrumbs': {'values': []}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'hyperframe': '6.1.0', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'pluggy': '1.6.0', 'docopt': '0.6.2', 'socksio': '1.0.0', 'requests': '2.32.5', 'coverage': '7.10.6', 'hpack': '4.1.0', 'idna': '3.10', 'setuptools': '80.9.0', 'jsonschema-specifications': '2025.9.1', 'referencing': '0.36.2', 'pygments': '2.19.2', 'httpcore': '1.0.9', 'h2': '4.3.0', 'responses': '0.25.8', 'typing_extensions': '4.15.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'jsonschema': '4.25.1', 'pyyaml': '6.0.2', 'rpds-py': '0.27.1', 'py': '1.11.0', 'packaging': '25.0', 'pytest-cov': '7.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'asttokens': '3.0.0', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'watchdog': '6.0.0', 'urllib3': '2.5.0', 'pytest': '8.4.2', 'pytest-localserver': '0.9.0.post0', 'attrs': '25.3.0'}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}])
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations1]
Stack Traces | 0.118s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   assert 3 == 1
E    +  where 3 = len([{'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'bottle', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4f22c10>', 'dumps': '<function dumps at 0x7f21e8f5d9d0>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '27c7a084f87c4c7e8fcec1bae560a97a', 'timestamp': '2025-09-19T11:04:09.998520Z', 'contexts': {'trace': {'trace_id': '5998993460c440f8a5a0bc68af8e8644', 'span_id': 'ac5ba64d97901e64', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.8.18', 'build': '3.8.18 (default, Dec 12 2024, 19:15:02) \n[GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.8-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'requests': '2.32.4', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'jsonschema': '4.23.0', 'coverage': '7.6.1', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'docopt': '0.6.2', 'wheel': '0.43.0', 'socksio': '1.0.0', 'idna': '3.10', 'setuptools': '69.5.1', 'h2': '4.1.0', 'watchdog': '4.0.2', 'httpcore': '1.0.9', 'responses': '0.25.8', 'pytest-cov': '5.0.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'pyyaml': '6.0.2', 'tomli': '2.2.1', 'exceptiongroup': '1.3.0', 'py': '1.11.0', 'urllib3': '2.2.3', 'packaging': '25.0', 'rpds-py': '0.20.1', 'hyperframe': '6.0.1', 'typing_extensions': '4.13.2', 'hpack': '4.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'pluggy': '1.5.0', 'asttokens': '3.0.0', 'referencing': '0.35.1', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'pytest': '8.3.5', 'importlib_resources': '6.4.5', 'pytest-localserver': '0.9.0.post0', 'zipp': '3.20.2', 'attrs': '25.3.0', 'pkgutil_resolve_name': '1.3.10', 'jsonschema-specifications': '2023.12.1'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'wsgi', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>, <Transaction(name='generic WSGI request', op='http.server', trace_id='8b7300ca46944998bcee8a89f4ad819d', span_id='b56889285d46963d', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>, <Transaction(name='generic WSGI request', op='http.server', trace_id='8b7300ca46944998bcee8a89f4ad819d', span_id='b56889285d46963d', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4f22c10>', 'dumps': '<function dumps at 0x7f21e8f5d9d0>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '38fd920e369a4761a0a68be714f7d9ed', 'timestamp': '2025-09-19T11:04:10.006237Z', 'contexts': {'trace': {'trace_id': '5998993460c440f8a5a0bc68af8e8644', 'span_id': 'ac5ba64d97901e64', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.8.18', 'build': '3.8.18 (default, Dec 12 2024, 19:15:02) \n[GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.8-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'requests': '2.32.4', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'jsonschema': '4.23.0', 'coverage': '7.6.1', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'docopt': '0.6.2', 'wheel': '0.43.0', 'socksio': '1.0.0', 'idna': '3.10', 'setuptools': '69.5.1', 'h2': '4.1.0', 'watchdog': '4.0.2', 'httpcore': '1.0.9', 'responses': '0.25.8', 'pytest-cov': '5.0.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'pyyaml': '6.0.2', 'tomli': '2.2.1', 'exceptiongroup': '1.3.0', 'py': '1.11.0', 'urllib3': '2.2.3', 'packaging': '25.0', 'rpds-py': '0.20.1', 'hyperframe': '6.0.1', 'typing_extensions': '4.13.2', 'hpack': '4.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'pluggy': '1.5.0', 'asttokens': '3.0.0', 'referencing': '0.35.1', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'pytest': '8.3.5', 'importlib_resources': '6.4.5', 'pytest-localserver': '0.9.0.post0', 'zipp': '3.20.2', 'attrs': '25.3.0', 'pkgutil_resolve_name': '1.3.10', 'jsonschema-specifications': '2023.12.1'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'logging', 'handled': True}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'test_errors_not_reported_twice', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 342, 'pre_context': ['', '    client = get_client()', '', '    with pytest.raises(ZeroDivisionError):', '        try:'], 'context_line': '            client.get("/")', 'post_context': ['        except ZeroDivisionError as e:', '            logger.exception(e)', '            raise e', '', '    assert len(events) == 1'], 'vars': {'sentry_init': '<function sentry_init.<locals>.inner at 0x7f21e4ec18b0>', 'integrations': ['<sentry_sdk.integrations.bottle.BottleIntegration object at 0x7f21e71b9160>', '<sentry_sdk.integrations.logging.LoggingIntegration object at 0x7f21e71b96d0>'], 'capture_events': '<function capture_events.<locals>.inner at 0x7f21e4ec10d0>', 'app': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'get_client': '<function get_client.<locals>.inner at 0x7f21e4f2bee0>', 'logger': '<Logger bottle.app (WARNING)>', 'index': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4f22c10>', 'events': [{'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'bottle\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4f22c10>\', \'dumps\': \'<function dumps at 0x7f21e8f5d9d0>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'27c7a084f87c4c7e8fcec1bae560a97a'", 'timestamp': "'2025-09-19T11:04:09.998520Z'", 'contexts': {'trace': {'trace_id': "'5998993460c440f8a5a0bc68af8e8644'", 'span_id': "'ac5ba64d97901e64'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.8.18'", 'build': "'3.8.18 (default, Dec 12 2024, 19:15:02) \\n[GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.8-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'requests': "'2.32.4'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'jsonschema': "'4.23.0'", 'coverage': "'7.6.1'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'"}}, {'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'wsgi\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'__call__\', \'module\': \'bottle\', \'lineno\': 1133, \'pre_context\': ["            start_response(\'500 INTERNAL SERVER ERROR\', headers, sys.exc_info())", \'            return [tob(err)]\', \'\', \'    def __call__(self, environ, start_response):\', \'        """ Each instance of :class:\\\'Bottle\\\' is a WSGI application. """\'], \'context_line\': \'        return self.wsgi(environ, start_response)\', \'post_context\': [\'\', \'    def __enter__(self):\', \'        """ Use this application as default for all module-level shortcuts. """\', \'        default_app.push(self)\', \'        return self\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f21e4f3cbb0>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'8b7300ca46944998bcee8a89f4ad819d\', span_id=\'b56889285d46963d\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'wsgi\', \'module\': \'bottle\', \'lineno\': 1104, \'pre_context\': [\'        return new_iter\', \'\', \'    def wsgi(self, environ, start_response):\', \'        """ The bottle WSGI-interface. """\', \'        try:\'], \'context_line\': \'            out = self._cast(self._handle(environ))\', \'post_context\': [\'            # rfc2616 section 4.3\', \'            if response._status_code in (100, 101, 204, 304)\\\\\', "            or environ[\'REQUEST_METHOD\'] == \'HEAD\':", "                if hasattr(out, \'close\'): out.close()", \'                out = []\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f21e4f3cbb0>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'8b7300ca46944998bcee8a89f4ad819d\', span_id=\'b56889285d46963d\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'_handle\', \'module\': \'bottle\', \'lineno\': 996, \'pre_context\': ["                    self.trigger_hook(\'before_request\')", \'                    route, args = self.router.match(environ)\', "                    environ[\'route.handle\'] = route", "                    environ[\'bottle.route\'] = route", "                    environ[\'route.url_args\'] = args"], \'context_line\': \'                    out = route.call(**args)\', \'post_context\': [\'                    break\', \'                except HTTPResponse as E:\', \'                    out = E\', \'                    break\', \'                except RouteReset:\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f21e4f3cbb0>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'path\': "\'/\'", \'out\': \'None\', \'route\': \'<GET / -> tests.integrations.bottle.test_bottle:index>\', \'args\': {}}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4f22c10>\', \'dumps\': \'<function dumps at 0x7f21e8f5d9d0>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'38fd920e369a4761a0a68be714f7d9ed'", 'timestamp': "'2025-09-19T11:04:10.006237Z'", 'contexts': {'trace': {'trace_id': "'5998993460c440f8a5a0bc68af8e8644'", 'span_id': "'ac5ba64d97901e64'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.8.18'", 'build': "'3.8.18 (default, Dec 12 2024, 19:15:02) \\n[GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.8-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'requests': "'2.32.4'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'jsonschema': "'4.23.0'", 'coverage': "'7.6.1'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'"}}], 'client': '<Client <bottle.Bottle object at 0x7f21e4f3cbb0>>', 'e': "ZeroDivisionError('division by zero')"}, 'in_app': True}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'get', 'module': 'werkzeug.test', 'lineno': 1131, 'pre_context': ['        return response', '', '    def get(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``GET``."""', '        kw["method"] = "GET"'], 'context_line': '        return self.open(*args, **kw)', 'post_context': ['', '    def post(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``POST``."""', '        kw["method"] = "POST"', '        return self.open(*args, **kw)'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f21e4f3cbb0>>', 'args': ["'/'"], 'kw': {'method': "'GET'"}}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'open', 'module': 'werkzeug.test', 'lineno': 1076, 'pre_context': ['            try:', '                request = builder.get_request()', '            finally:', '                builder.close()', ''], 'context_line': '        response = self.run_wsgi_app(request.environ, buffered=buffered)', 'post_context': ['        response = self.response_wrapper(*response, request=request)', '', '        redirects = set()', '        history: t.List["TestResponse"] = []', ''], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f21e4f3cbb0>>', 'as_tuple': 'False', 'buffered': 'False', 'follow_redirects': 'False', 'args': ["'/'"], 'kwargs': {'method': "'GET'"}, 'request': "<Request 'http://localhost/' [GET]>", 'builder': '<werkzeug.test.EnvironBuilder object at 0x7f21e6f75130>'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 945, 'pre_context': ['        :meta private:', '        """', '        if self.cookie_jar is not None:', '            self.cookie_jar.inject_wsgi(environ)', ''], 'context_line': '        rv = run_wsgi_app(self.application, environ, buffered=buffered)', 'post_context': ['', '        if self.cookie_jar is not None:', '            self.cookie_jar.extract_wsgi(environ, rv[2])', '', '        return rv'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f21e4f3cbb0>>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 1233, 'pre_context': ['                exc_info = None', '', '        response = (status, headers)', '        return buffer.append', ''], 'context_line': '    app_rv = app(environ, start_response)', 'post_context': ['    close_func = getattr(app_rv, "close", None)', '    app_iter: t.Iterable[bytes] = iter(app_rv)', '', '    # when buffering we emit the close call early and convert the', '    # application iterator into a regular list'], 'vars': {'app': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False', 'start_response': '<function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>', 'buffer': [], 'response': 'None'}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>, <Transaction(name='generic WSGI request', op='http.server', trace_id='8b7300ca46944998bcee8a89f4ad819d', span_id='b56889285d46963d', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f21e71c1a60>, <function run_wsgi_app.<locals>.start_response at 0x7f21e4f22a60>, <Transaction(name='generic WSGI request', op='http.server', trace_id='8b7300ca46944998bcee8a89f4ad819d', span_id='b56889285d46963d', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f21e4f3cbb0>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f21e4f22c10>', 'dumps': '<function dumps at 0x7f21e8f5d9d0>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'logger': 'bottle.app', 'logentry': {'message': 'division by zero', 'formatted': 'division by zero', 'params': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.8-bottle-v0.13.4/lib/python3.8.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.8-bottle-v0.13.4']}, 'event_id': 'c6d53e369df3490eb8b194692e95188d', 'timestamp': '2025-09-19T11:04:10.041146Z', 'contexts': {'trace': {'trace_id': '5998993460c440f8a5a0bc68af8e8644', 'span_id': 'ac5ba64d97901e64', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.8.18', 'build': '3.8.18 (default, Dec 12 2024, 19:15:02) \n[GCC 11.4.0]'}}, 'transaction_info': {}, 'breadcrumbs': {'values': []}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'requests': '2.32.4', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'jsonschema': '4.23.0', 'coverage': '7.6.1', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'docopt': '0.6.2', 'wheel': '0.43.0', 'socksio': '1.0.0', 'idna': '3.10', 'setuptools': '69.5.1', 'h2': '4.1.0', 'watchdog': '4.0.2', 'httpcore': '1.0.9', 'responses': '0.25.8', 'pytest-cov': '5.0.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'pyyaml': '6.0.2', 'tomli': '2.2.1', 'exceptiongroup': '1.3.0', 'py': '1.11.0', 'urllib3': '2.2.3', 'packaging': '25.0', 'rpds-py': '0.20.1', 'hyperframe': '6.0.1', 'typing_extensions': '4.13.2', 'hpack': '4.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'pluggy': '1.5.0', 'asttokens': '3.0.0', 'referencing': '0.35.1', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'pytest': '8.3.5', 'importlib_resources': '6.4.5', 'pytest-localserver': '0.9.0.post0', 'zipp': '3.20.2', 'attrs': '25.3.0', 'pkgutil_resolve_name': '1.3.10', 'jsonschema-specifications': '2023.12.1'}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}])
tests.integrations.bottle.test_bottle::test_errors_not_reported_twice[integrations0]
Stack Traces | 0.122s run time
.../integrations/bottle/test_bottle.py:347: in test_errors_not_reported_twice
    assert len(events) == 1
E   assert 3 == 1
E    +  where 3 = len([{'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'bottle', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19c14b80>', 'dumps': '<function dumps at 0x7f2e1b928180>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '5fab89096abb421bbdd4158453f9406b', 'timestamp': '2025-09-19T11:04:48.414711Z', 'contexts': {'trace': {'trace_id': '5f5d42bd74be4bbcae23d8370d4cf706', 'span_id': 'a079b272d04f226e', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.12.11', 'build': '3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.12-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'hyperframe': '6.1.0', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'pluggy': '1.6.0', 'docopt': '0.6.2', 'socksio': '1.0.0', 'requests': '2.32.5', 'coverage': '7.10.6', 'hpack': '4.1.0', 'idna': '3.10', 'setuptools': '80.9.0', 'jsonschema-specifications': '2025.9.1', 'referencing': '0.36.2', 'pygments': '2.19.2', 'httpcore': '1.0.9', 'h2': '4.3.0', 'responses': '0.25.8', 'typing_extensions': '4.15.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'jsonschema': '4.25.1', 'pyyaml': '6.0.2', 'rpds-py': '0.27.1', 'py': '1.11.0', 'packaging': '25.0', 'pytest-cov': '7.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'asttokens': '3.0.0', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'watchdog': '6.0.0', 'urllib3': '2.5.0', 'pytest': '8.4.2', 'pytest-localserver': '0.9.0.post0', 'attrs': '25.3.0'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'wsgi', 'handled': False}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>, <Transaction(name='generic WSGI request', op='http.server', trace_id='69c418dcc4804b5da447c6e2a3f9631b', span_id='8be6fcf766af6336', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>, <Transaction(name='generic WSGI request', op='http.server', trace_id='69c418dcc4804b5da447c6e2a3f9631b', span_id='8be6fcf766af6336', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19c14b80>', 'dumps': '<function dumps at 0x7f2e1b928180>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'event_id': '54d9f44f03904a40a27f8f03d4c52e9f', 'timestamp': '2025-09-19T11:04:48.420922Z', 'contexts': {'trace': {'trace_id': '5f5d42bd74be4bbcae23d8370d4cf706', 'span_id': 'a079b272d04f226e', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.12.11', 'build': '3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'}}, 'transaction': 'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index', 'transaction_info': {'source': <TransactionSource.COMPONENT: 'component'>}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.12-bottle-v0.13.4']}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'hyperframe': '6.1.0', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'pluggy': '1.6.0', 'docopt': '0.6.2', 'socksio': '1.0.0', 'requests': '2.32.5', 'coverage': '7.10.6', 'hpack': '4.1.0', 'idna': '3.10', 'setuptools': '80.9.0', 'jsonschema-specifications': '2025.9.1', 'referencing': '0.36.2', 'pygments': '2.19.2', 'httpcore': '1.0.9', 'h2': '4.3.0', 'responses': '0.25.8', 'typing_extensions': '4.15.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'jsonschema': '4.25.1', 'pyyaml': '6.0.2', 'rpds-py': '0.27.1', 'py': '1.11.0', 'packaging': '25.0', 'pytest-cov': '7.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'asttokens': '3.0.0', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'watchdog': '6.0.0', 'urllib3': '2.5.0', 'pytest': '8.4.2', 'pytest-localserver': '0.9.0.post0', 'attrs': '25.3.0'}, 'request': {'url': 'http://localhost/', 'query_string': '', 'method': 'GET', 'env': {'SERVER_NAME': 'localhost', 'SERVER_PORT': '80'}, 'headers': {'Host': 'localhost'}}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}, {'level': 'error', 'exception': {'values': [{'mechanism': {'type': 'logging', 'handled': True}, 'module': None, 'type': 'ZeroDivisionError', 'value': 'division by zero', 'stacktrace': {'frames': [{'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'test_errors_not_reported_twice', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 342, 'pre_context': ['', '    client = get_client()', '', '    with pytest.raises(ZeroDivisionError):', '        try:'], 'context_line': '            client.get("/")', 'post_context': ['        except ZeroDivisionError as e:', '            logger.exception(e)', '            raise e', '', '    assert len(events) == 1'], 'vars': {'sentry_init': '<function sentry_init.<locals>.inner at 0x7f2e18aa2980>', 'integrations': ['<sentry_sdk.integrations.bottle.BottleIntegration object at 0x7f2e19eaf8f0>'], 'capture_events': '<function capture_events.<locals>.inner at 0x7f2e18aa00e0>', 'app': '<bottle.Bottle object at 0x7f2e19d50c20>', 'get_client': '<function get_client.<locals>.inner at 0x7f2e18a45620>', 'logger': '<Logger bottle.app (WARNING)>', 'index': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19c14b80>', 'events': [{'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'bottle\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19c14b80>\', \'dumps\': \'<function dumps at 0x7f2e1b928180>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'5fab89096abb421bbdd4158453f9406b'", 'timestamp': "'2025-09-19T11:04:48.414711Z'", 'contexts': {'trace': {'trace_id': "'5f5d42bd74be4bbcae23d8370d4cf706'", 'span_id': "'a079b272d04f226e'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.12.11'", 'build': "'3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.12-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'hyperframe': "'6.1.0'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'", 'certifi': "'2025.8.3'", 'pluggy': "'1.6.0'"}}, {'level': "'error'", 'exception': {'values': ['{\'mechanism\': {\'type\': \'wsgi\', \'handled\': False}, \'module\': None, \'type\': \'ZeroDivisionError\', \'value\': \'division by zero\', \'stacktrace\': {\'frames\': [{\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'__call__\', \'module\': \'bottle\', \'lineno\': 1133, \'pre_context\': ["            start_response(\'500 INTERNAL SERVER ERROR\', headers, sys.exc_info())", \'            return [tob(err)]\', \'\', \'    def __call__(self, environ, start_response):\', \'        """ Each instance of :class:\\\'Bottle\\\' is a WSGI application. """\'], \'context_line\': \'        return self.wsgi(environ, start_response)\', \'post_context\': [\'\', \'    def __enter__(self):\', \'        """ Use this application as default for all module-level shortcuts. """\', \'        default_app.push(self)\', \'        return self\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f2e19d50c20>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'69c418dcc4804b5da447c6e2a3f9631b\', span_id=\'8be6fcf766af6336\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'wsgi\', \'module\': \'bottle\', \'lineno\': 1104, \'pre_context\': [\'        return new_iter\', \'\', \'    def wsgi(self, environ, start_response):\', \'        """ The bottle WSGI-interface. """\', \'        try:\'], \'context_line\': \'            out = self._cast(self._handle(environ))\', \'post_context\': [\'            # rfc2616 section 4.3\', \'            if response._status_code in (100, 101, 204, 304)\\\\\', "            or environ[\'REQUEST_METHOD\'] == \'HEAD\':", "                if hasattr(out, \'close\'): out.close()", \'                out = []\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f2e19d50c20>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'start_response\': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>, <Transaction(name=\'generic WSGI request\', op=\'http.server\', trace_id=\'69c418dcc4804b5da447c6e2a3f9631b\', span_id=\'8be6fcf766af6336\', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: \'route\'>, origin=\'auto.http.bottle\')>)"}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'_handle\', \'module\': \'bottle\', \'lineno\': 996, \'pre_context\': ["                    self.trigger_hook(\'before_request\')", \'                    route, args = self.router.match(environ)\', "                    environ[\'route.handle\'] = route", "                    environ[\'bottle.route\'] = route", "                    environ[\'route.url_args\'] = args"], \'context_line\': \'                    out = route.call(**args)\', \'post_context\': [\'                    break\', \'                except HTTPResponse as E:\', \'                    out = E\', \'                    break\', \'                except RouteReset:\'], \'vars\': {\'self\': \'<bottle.Bottle object at 0x7f2e19d50c20>\', \'environ\': {\'REQUEST_METHOD\': "\'GET\'", \'SCRIPT_NAME\': "\'\'", \'PATH_INFO\': "\'/\'", \'QUERY_STRING\': "\'\'", \'REQUEST_URI\': "\'/\'", \'RAW_URI\': "\'/\'", \'SERVER_NAME\': "\'localhost\'", \'SERVER_PORT\': "\'80\'", \'HTTP_HOST\': "\'localhost\'", \'SERVER_PROTOCOL\': "\'HTTP/1.1\'"}, \'path\': "\'/\'", \'out\': \'None\', \'route\': \'<GET / -> tests.integrations.bottle.test_bottle:index>\', \'args\': {}}, \'in_app\': False}, {\'filename\': \'bottle.py\', \'abs_path\': \'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py\', \'function\': \'wrapper\', \'module\': \'bottle\', \'lineno\': 2026, \'pre_context\': [\'        if not self.json_dumps: return callback\', \'\', \'        @functools.wraps(callback)\', \'        def wrapper(*a, **ka):\', \'            try:\'], \'context_line\': \'                rv = callback(*a, **ka)\', \'post_context\': [\'            except HTTPResponse as resp:\', \'                rv = resp\', \'\', \'            if isinstance(rv, dict):\', \'                #Attempt to serialize, raises exception on failure\'], \'vars\': {\'a\': [], \'ka\': {}, \'callback\': \'<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19c14b80>\', \'dumps\': \'<function dumps at 0x7f2e1b928180>\'}, \'in_app\': False}, {\'filename\': \'.../integrations/bottle/test_bottle.py\', \'abs_path\': \'/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py\', \'function\': \'index\', \'module\': \'tests.integrations.bottle.test_bottle\', \'lineno\': 334, \'pre_context\': [\'\', \'    logger = logging.getLogger("bottle.app")\', \'\', \'    @app.route("/")\', \'    def index():\'], \'context_line\': \'        1 / 0\', \'post_context\': [\'\', \'    events = capture_events()\', \'\', \'    client = get_client()\', \'\'], \'vars\': {}, \'in_app\': True}]}}']}, 'event_id': "'54d9f44f03904a40a27f8f03d4c52e9f'", 'timestamp': "'2025-09-19T11:04:48.420922Z'", 'contexts': {'trace': {'trace_id': "'5f5d42bd74be4bbcae23d8370d4cf706'", 'span_id': "'a079b272d04f226e'", 'parent_span_id': 'None'}, 'runtime': {'name': "'CPython'", 'version': "'3.12.11'", 'build': "'3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'"}}, 'transaction': "'tests.integrations.bottle.test_bottle.test_errors_not_reported_twice.<locals>.index'", 'transaction_info': {'source': "<TransactionSource.COMPONENT: 'component'>"}, 'breadcrumbs': {'values': []}, 'extra': {'sys.argv': ["'.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py'", "'-W'", "'error::pytest.PytestUnraisableExceptionWarning'", "'tests/integrations/bottle'", "'-o'", "'junit_suite_name=py3.12-bottle-v0.13.4'"]}, 'modules': {'sentry-sdk': "'2.38.0'", 'pip': "'24.0'", 'hyperframe': "'6.1.0'", 'executing': "'2.2.1'", 'werkzeug': "'2.0.3'", 'bottle': "'0.13.4'", 'docker': "'7.1.0'", 'pytest-watch': "'4.2.0'", 'certifi': "'2025.8.3'", 'pluggy': "'1.6.0'"}}], 'client': '<Client <bottle.Bottle object at 0x7f2e19d50c20>>', 'e': "ZeroDivisionError('division by zero')"}, 'in_app': True}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'get', 'module': 'werkzeug.test', 'lineno': 1131, 'pre_context': ['        return response', '', '    def get(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``GET``."""', '        kw["method"] = "GET"'], 'context_line': '        return self.open(*args, **kw)', 'post_context': ['', '    def post(self, *args: t.Any, **kw: t.Any) -> "TestResponse":', '        """Call :meth:`open` with ``method`` set to ``POST``."""', '        kw["method"] = "POST"', '        return self.open(*args, **kw)'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f2e19d50c20>>', 'args': ["'/'"], 'kw': {'method': "'GET'"}}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'open', 'module': 'werkzeug.test', 'lineno': 1076, 'pre_context': ['            try:', '                request = builder.get_request()', '            finally:', '                builder.close()', ''], 'context_line': '        response = self.run_wsgi_app(request.environ, buffered=buffered)', 'post_context': ['        response = self.response_wrapper(*response, request=request)', '', '        redirects = set()', '        history: t.List["TestResponse"] = []', ''], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f2e19d50c20>>', 'as_tuple': 'False', 'buffered': 'False', 'follow_redirects': 'False', 'args': ["'/'"], 'kwargs': {'method': "'GET'"}, 'request': "<Request 'http://localhost/' [GET]>", 'builder': '<werkzeug.test.EnvironBuilder object at 0x7f2e19f37830>'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 945, 'pre_context': ['        :meta private:', '        """', '        if self.cookie_jar is not None:', '            self.cookie_jar.inject_wsgi(environ)', ''], 'context_line': '        rv = run_wsgi_app(self.application, environ, buffered=buffered)', 'post_context': ['', '        if self.cookie_jar is not None:', '            self.cookie_jar.extract_wsgi(environ, rv[2])', '', '        return rv'], 'vars': {'self': '<Client <bottle.Bottle object at 0x7f2e19d50c20>>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False'}, 'in_app': False}, {'filename': 'werkzeug/test.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12............/site-packages/werkzeug/test.py', 'function': 'run_wsgi_app', 'module': 'werkzeug.test', 'lineno': 1233, 'pre_context': ['                exc_info = None', '', '        response = (status, headers)', '        return buffer.append', ''], 'context_line': '    app_rv = app(environ, start_response)', 'post_context': ['    close_func = getattr(app_rv, "close", None)', '    app_iter: t.Iterable[bytes] = iter(app_rv)', '', '    # when buffering we emit the close call early and convert the', '    # application iterator into a regular list'], 'vars': {'app': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'buffered': 'False', 'start_response': '<function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>', 'buffer': [], 'response': 'None'}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '__call__', 'module': 'bottle', 'lineno': 1133, 'pre_context': ["            start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info())", '            return [tob(err)]', '', '    def __call__(self, environ, start_response):', '        """ Each instance of :class:\'Bottle\' is a WSGI application. """'], 'context_line': '        return self.wsgi(environ, start_response)', 'post_context': ['', '    def __enter__(self):', '        """ Use this application as default for all module-level shortcuts. """', '        default_app.push(self)', '        return self'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>, <Transaction(name='generic WSGI request', op='http.server', trace_id='69c418dcc4804b5da447c6e2a3f9631b', span_id='8be6fcf766af6336', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wsgi', 'module': 'bottle', 'lineno': 1104, 'pre_context': ['        return new_iter', '', '    def wsgi(self, environ, start_response):', '        """ The bottle WSGI-interface. """', '        try:'], 'context_line': '            out = self._cast(self._handle(environ))', 'post_context': ['            # rfc2616 section 4.3', '            if response._status_code in (100, 101, 204, 304)\\', "            or environ['REQUEST_METHOD'] == 'HEAD':", "                if hasattr(out, 'close'): out.close()", '                out = []'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'start_response': "functools.partial(<function _sentry_start_response at 0x7f2e19b856c0>, <function run_wsgi_app.<locals>.start_response at 0x7f2e19c14040>, <Transaction(name='generic WSGI request', op='http.server', trace_id='69c418dcc4804b5da447c6e2a3f9631b', span_id='8be6fcf766af6336', parent_span_id=None, sampled=False, source=<TransactionSource.ROUTE: 'route'>, origin='auto.http.bottle')>)"}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': '_handle', 'module': 'bottle', 'lineno': 996, 'pre_context': ["                    self.trigger_hook('before_request')", '                    route, args = self.router.match(environ)', "                    environ['route.handle'] = route", "                    environ['bottle.route'] = route", "                    environ['route.url_args'] = args"], 'context_line': '                    out = route.call(**args)', 'post_context': ['                    break', '                except HTTPResponse as E:', '                    out = E', '                    break', '                except RouteReset:'], 'vars': {'self': '<bottle.Bottle object at 0x7f2e19d50c20>', 'environ': {'REQUEST_METHOD': "'GET'", 'SCRIPT_NAME': "''", 'PATH_INFO': "'/'", 'QUERY_STRING': "''", 'REQUEST_URI': "'/'", 'RAW_URI': "'/'", 'SERVER_NAME': "'localhost'", 'SERVER_PORT': "'80'", 'HTTP_HOST': "'localhost'", 'SERVER_PROTOCOL': "'HTTP/1.1'"}, 'path': "'/'", 'out': 'None', 'route': '<GET / -> tests.integrations.bottle.test_bottle:index>', 'args': {}}, 'in_app': False}, {'filename': 'bottle.py', 'abs_path': '.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12/site-packages/bottle.py', 'function': 'wrapper', 'module': 'bottle', 'lineno': 2026, 'pre_context': ['        if not self.json_dumps: return callback', '', '        @functools.wraps(callback)', '        def wrapper(*a, **ka):', '            try:'], 'context_line': '                rv = callback(*a, **ka)', 'post_context': ['            except HTTPResponse as resp:', '                rv = resp', '', '            if isinstance(rv, dict):', '                #Attempt to serialize, raises exception on failure'], 'vars': {'a': [], 'ka': {}, 'callback': '<function test_errors_not_reported_twice.<locals>.index at 0x7f2e19c14b80>', 'dumps': '<function dumps at 0x7f2e1b928180>'}, 'in_app': False}, {'filename': '.../integrations/bottle/test_bottle.py', 'abs_path': '/home/runner/work/sentry-python/sentry-python/.../integrations/bottle/test_bottle.py', 'function': 'index', 'module': 'tests.integrations.bottle.test_bottle', 'lineno': 334, 'pre_context': ['', '    logger = logging.getLogger("bottle.app")', '', '    @app.route("/")', '    def index():'], 'context_line': '        1 / 0', 'post_context': ['', '    events = capture_events()', '', '    client = get_client()', ''], 'vars': {}, 'in_app': True}]}}]}, 'logger': 'bottle.app', 'logentry': {'message': 'division by zero', 'formatted': 'division by zero', 'params': []}, 'extra': {'sys.argv': ['.../sentry-python/sentry-python/.tox/py3.12-bottle-v0.13.4/lib/python3.12.............../site-packages/pytest/__main__.py', '-W', 'error::pytest.PytestUnraisableExceptionWarning', 'tests/integrations/bottle', '-o', 'junit_suite_name=py3.12-bottle-v0.13.4']}, 'event_id': 'f318cb5ddac242ba8699e9c891dcf648', 'timestamp': '2025-09-19T11:04:48.438114Z', 'contexts': {'trace': {'trace_id': '5f5d42bd74be4bbcae23d8370d4cf706', 'span_id': 'a079b272d04f226e', 'parent_span_id': None}, 'runtime': {'name': 'CPython', 'version': '3.12.11', 'build': '3.12.11 (main, Jun  4 2025, 04:14:37) [GCC 11.4.0]'}}, 'transaction_info': {}, 'breadcrumbs': {'values': []}, 'modules': {'sentry-sdk': '2.38.0', 'pip': '24.0', 'hyperframe': '6.1.0', 'executing': '2.2.1', 'werkzeug': '2.0.3', 'bottle': '0.13.4', 'docker': '7.1.0', 'pytest-watch': '4.2.0', 'certifi': '2025.8.3', 'pluggy': '1.6.0', 'docopt': '0.6.2', 'socksio': '1.0.0', 'requests': '2.32.5', 'coverage': '7.10.6', 'hpack': '4.1.0', 'idna': '3.10', 'setuptools': '80.9.0', 'jsonschema-specifications': '2025.9.1', 'referencing': '0.36.2', 'pygments': '2.19.2', 'httpcore': '1.0.9', 'h2': '4.3.0', 'responses': '0.25.8', 'typing_extensions': '4.15.0', 'colorama': '0.4.6', 'pysocks': '1.7.1', 'jsonschema': '4.25.1', 'pyyaml': '6.0.2', 'rpds-py': '0.27.1', 'py': '1.11.0', 'packaging': '25.0', 'pytest-cov': '7.0.0', 'h11': '0.16.0', 'brotli': '1.1.0', 'asttokens': '3.0.0', 'iniconfig': '2.1.0', 'pytest-forked': '1.6.0', 'charset-normalizer': '3.4.3', 'watchdog': '6.0.0', 'urllib3': '2.5.0', 'pytest': '8.4.2', 'pytest-localserver': '0.9.0.post0', 'attrs': '25.3.0'}, 'release': 'eb272bc3df453428cce38045cf626024dfa1dcaf', 'environment': 'production', 'server_name': 'runnervmyfcvg', 'sdk': {'name': 'sentry.python.bottle', 'version': '2.38.0', 'packages': [{'name': 'pypi:sentry-sdk', 'version': '2.38.0'}], 'integrations': ['argv', 'atexit', 'bottle', 'dedupe', 'excepthook', 'logging', 'modules', 'stdlib', 'threading']}, 'platform': 'python'}])
tests.integrations.bottle.test_bottle::test_errors[catchall-debug]
Stack Traces | 0.123s run time
.../integrations/bottle/test_bottle.py:119: in test_errors
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.pyramid.test_pyramid::test_error_in_errorhandler
Stack Traces | 0.132s run time
.../integrations/pyramid/test_pyramid.py:363: in test_error_in_errorhandler
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.pyramid.test_pyramid::test_error_in_errorhandler
Stack Traces | 0.136s run time
.../integrations/pyramid/test_pyramid.py:363: in test_error_in_errorhandler
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.167s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
    ^^^^^^^^^^
E   ValueError: too many values to unpack (expected 2)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.177s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.183s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.196s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
    ^^^^^^^^^^
E   ValueError: too many values to unpack (expected 2)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.199s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.202s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
    ^^^^^^^^^^
E   ValueError: too many values to unpack (expected 2)
tests.integrations.grpc.test_grpc_aio::test_grpc_server_exception
Stack Traces | 0.227s run time
.../integrations/grpc/test_grpc_aio.py:152: in test_grpc_server_exception
    (event, _) = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.pyramid.test_pyramid::test_view_exceptions
Stack Traces | 0.237s run time
.../integrations/pyramid/test_pyramid.py:97: in test_view_exceptions
    (event,) = events
    ^^^^^^^^
E   ValueError: too many values to unpack (expected 1)
tests.integrations.pyramid.test_pyramid::test_view_exceptions
Stack Traces | 0.247s run time
.../integrations/pyramid/test_pyramid.py:97: in test_view_exceptions
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.dramatiq.test_dramatiq::test_that_local_variables_are_captured
Stack Traces | 0.262s run time
.../integrations/dramatiq/test_dramatiq.py:98: in test_that_local_variables_are_captured
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.dramatiq.test_dramatiq::test_that_actor_name_is_set_as_transaction
Stack Traces | 0.263s run time
.../integrations/dramatiq/test_dramatiq.py:58: in test_that_actor_name_is_set_as_transaction
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.dramatiq.test_dramatiq::test_that_message_data_is_added_as_request
Stack Traces | 0.263s run time
.../integrations/dramatiq/test_dramatiq.py:190: in test_that_message_data_is_added_as_request
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.dramatiq.test_dramatiq::test_that_sub_actor_errors_are_captured
Stack Traces | 0.263s run time
.../integrations/dramatiq/test_dramatiq.py:140: in test_that_sub_actor_errors_are_captured
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.dramatiq.test_dramatiq::test_that_multiple_errors_are_captured
Stack Traces | 0.266s run time
.../integrations/dramatiq/test_dramatiq.py:162: in test_that_multiple_errors_are_captured
    event1, event2 = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.dramatiq.test_dramatiq::test_that_dramatiq_message_id_is_set_as_extra
Stack Traces | 0.272s run time
.../integrations/dramatiq/test_dramatiq.py:74: in test_that_dramatiq_message_id_is_set_as_extra
    event_message, event_error = events
E   ValueError: too many values to unpack (expected 2)
tests.integrations.pyramid.test_pyramid::test_view_exceptions
Stack Traces | 0.281s run time
.../integrations/pyramid/test_pyramid.py:97: in test_view_exceptions
    (event,) = events
E   ValueError: too many values to unpack (expected 1)
tests.integrations.dramatiq.test_dramatiq::test_that_a_single_error_is_captured
Stack Traces | 0.376s run time
.../integrations/dramatiq/test_dramatiq.py:42: in test_that_a_single_error_is_captured
    (event,) = events
E   ValueError: too many values to unpack (expected 1)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@antonpirker antonpirker changed the title dedupe with a fingerprint instead of exception object fix(dedupe): Make DedupeIntegration more memory efficient. Sep 17, 2025
@sl0thentr0py
Copy link
Member

sl0thentr0py commented Sep 22, 2025

closed in favor of #4834

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Memory leak during exception logging
2 participants