Title: Sentry background worker is chronically blocking async event loop when many exceptions are raised · Issue #2824 · getsentry/sentry-python · GitHub
Open Graph Title: Sentry background worker is chronically blocking async event loop when many exceptions are raised · Issue #2824 · getsentry/sentry-python
X Title: Sentry background worker is chronically blocking async event loop when many exceptions are raised · Issue #2824 · getsentry/sentry-python
Description: How do you use Sentry? Self-hosted/on-premise Version 1.40.6 Steps to Reproduce Hello! And thanks for reading my ticket :) The python sentry client is a synchronous client library that is retrofitted to fit the async model (by spinning o...
Open Graph Description: How do you use Sentry? Self-hosted/on-premise Version 1.40.6 Steps to Reproduce Hello! And thanks for reading my ticket :) The python sentry client is a synchronous client library that is retrofitt...
X Description: How do you use Sentry? Self-hosted/on-premise Version 1.40.6 Steps to Reproduce Hello! And thanks for reading my ticket :) The python sentry client is a synchronous client library that is retrofitt...
Opengraph URL: https://github.com/getsentry/sentry-python/issues/2824
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Sentry background worker is chronically blocking async event loop when many exceptions are raised","articleBody":"### How do you use Sentry?\n\nSelf-hosted/on-premise\n\n### Version\n\n1.40.6\n\n### Steps to Reproduce\n\nHello! And thanks for reading my ticket :) \r\n\r\nThe python sentry client is a synchronous client library that is retrofitted to fit the async model (_by spinning off separate threads to avoid disrupting the event loop thread_ -- _see background worker (1) for thread usage_).\r\n\r\nUnder healthy conditions, the sentry client doesn’t need to make many web requests. However, if conditions become rocky and exceptions are frequently raised (_caught or uncaught_), the sentry client may become an extreme inhibitor to the app event loop (_assuming high sample rate_). This is due to the necessary OS thread context switching that effectively pauses/blocks the event loop to work on other threads (_i.e the background worker (1)_). This is not a recommended pattern (_obviously_) due to the costs of switching threads, but can be useful for quickly/lazily retrofitting sync code.\r\n\r\nRelevant flow - in short:\r\nEvery time an exception is raised (_caught or uncaught_) in my code, a web request is immediately made to dump the data to sentry when sampled. Since sentry’s background worker is thread based (1), this will trigger an thread context switch and then a synchronous web request to dump the data to sentry. When applications receive many exceptions in a short period of time, this becomes a context switching nightmare.\r\n\r\nSuggestion:\r\nIn an ideal world, sentry would asyncify its Background worker to use a task (1) and its transport layer (2) would use aiohttp. I don't think this is of super high complexity, but I could be wrong.\r\n\r\nAn immediate workaround could be made with more background worker control. If sentry’s background worker made web requests to dump data at configurable intervals, it would behave far more efficiently for event loops apps. At the moment, the background worker always dumps data **immediately** with regards to exceptions. In my opinion, if sentry is flushing data at app exit, having a 60 second timer to dump data would alleviate most of the symptoms I described above without ever losing data (albeit it would be up to 60 seconds slower).\r\n\r\n(1) - https://github.com/getsentry/sentry-python/blob/1b0e932c3f827c681cdd20abfee9afc55e5d141c/sentry_sdk/worker.py#L20\r\n\r\n(2) - https://github.com/getsentry/sentry-python/blob/1b0e932c3f827c681cdd20abfee9afc55e5d141c/sentry_sdk/transport.py#L244\n\n### Expected Result\n\nI expect to have less thread context switching when using sentry.\n\n### Actual Result\n\nI see a lot of thread context switching when there are high exception rates.","author":{"url":"https://github.com/cpvandehey","@type":"Person","name":"cpvandehey"},"datePublished":"2024-03-14T22:59:54.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":19},"url":"https://github.com/2824/sentry-python/issues/2824"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:55484b79-6178-905f-aa28-c70023d81243 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 864C:37F343:A4ECE1:DE2488:6A4D728C |
| html-safe-nonce | ab6fa11f0dcb267ff357b60d7ce0881e07cd377b00d49f387e8c5c4b0a90da07 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4NjRDOjM3RjM0MzpBNEVDRTE6REUyNDg4OjZBNEQ3MjhDIiwidmlzaXRvcl9pZCI6IjIyMTUwOTcyOTY5OTQ3OTIwNzYiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 8ecec7c426d29ead0a5355d5d91a32e5bebb75510c3f33cc0d060c3544aac120 |
| hovercard-subject-tag | issue:2187420855 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/getsentry/sentry-python/2824/issue_layout |
| twitter:image | https://opengraph.githubassets.com/d1c4a4f40fb875edab0cba39773986abf4d0f704944a11ecbb377a75d40df7b3/getsentry/sentry-python/issues/2824 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/d1c4a4f40fb875edab0cba39773986abf4d0f704944a11ecbb377a75d40df7b3/getsentry/sentry-python/issues/2824 |
| og:image:alt | How do you use Sentry? Self-hosted/on-premise Version 1.40.6 Steps to Reproduce Hello! And thanks for reading my ticket :) The python sentry client is a synchronous client library that is retrofitt... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | cpvandehey |
| hostname | github.com |
| expected-hostname | github.com |
| None | c78260c7b3f4ac4b0356c8208537f05406a3a2d46a9ec3f735b372dcc519c39e |
| turbo-cache-control | no-preview |
| go-import | github.com/getsentry/sentry-python git https://github.com/getsentry/sentry-python.git |
| octolytics-dimension-user_id | 1396951 |
| octolytics-dimension-user_login | getsentry |
| octolytics-dimension-repository_id | 137814779 |
| octolytics-dimension-repository_nwo | getsentry/sentry-python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 137814779 |
| octolytics-dimension-repository_network_root_nwo | getsentry/sentry-python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 399fff412f48461d435721c009efc17ea44be72f |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width