From 07517cb4efacfa1598b44e20ef97c92e4261575d Mon Sep 17 00:00:00 2001 From: Guilherme Scaranse Date: Thu, 18 Nov 2021 12:20:34 -0300 Subject: [PATCH 1/9] Patch eventlet on Sentry SDK --- sentry_sdk/utils.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 5c43fa3cc6..755bb8e555 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1136,9 +1136,12 @@ def _is_contextvars_broken(): pass try: + import greenlet from eventlet.patcher import is_monkey_patched # type: ignore if is_monkey_patched("thread"): + version_tuple = tuple([int(part) for part in greenlet.__version__.split(".")[:2]]) + if is_monkey_patched("thread") and version_tuple < (0, 5): return True except ImportError: pass @@ -1197,6 +1200,15 @@ def _get_contextvars(): return True, ContextVar except ImportError: pass + # For eventlet + try: + import eventlet # type: ignore + from eventlet.patcher import is_monkey_patched # type: ignore + if is_monkey_patched('thread'): + contextvars = eventlet.import_patched('contextvars') + return True, contextvars.ContextVar + except ImportError: + pass # Fall back to basic thread-local usage. From e584049f5772d81c06b6648118a1b28db41d543b Mon Sep 17 00:00:00 2001 From: Guilherme Scaranse Date: Thu, 18 Nov 2021 12:21:36 -0300 Subject: [PATCH 2/9] Update sequence --- sentry_sdk/utils.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 755bb8e555..c17b8597fc 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1194,13 +1194,7 @@ def _get_contextvars(): pass else: # On Python 3.7 contextvars are functional. - try: - from contextvars import ContextVar - - return True, ContextVar - except ImportError: - pass - # For eventlet + # Special check for eventlet try: import eventlet # type: ignore from eventlet.patcher import is_monkey_patched # type: ignore @@ -1209,6 +1203,14 @@ def _get_contextvars(): return True, contextvars.ContextVar except ImportError: pass + + try: + from contextvars import ContextVar + + return True, ContextVar + except ImportError: + pass + # Fall back to basic thread-local usage. From b411c96a747e50f133b327be5da006a083647c7c Mon Sep 17 00:00:00 2001 From: Guilherme Scaranse Date: Fri, 19 Nov 2021 11:03:09 -0300 Subject: [PATCH 3/9] Remove redundant stuff Co-authored-by: Sergey Shepelev --- sentry_sdk/utils.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index c17b8597fc..f0414ff666 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1139,7 +1139,6 @@ def _is_contextvars_broken(): import greenlet from eventlet.patcher import is_monkey_patched # type: ignore - if is_monkey_patched("thread"): version_tuple = tuple([int(part) for part in greenlet.__version__.split(".")[:2]]) if is_monkey_patched("thread") and version_tuple < (0, 5): return True @@ -1194,16 +1193,6 @@ def _get_contextvars(): pass else: # On Python 3.7 contextvars are functional. - # Special check for eventlet - try: - import eventlet # type: ignore - from eventlet.patcher import is_monkey_patched # type: ignore - if is_monkey_patched('thread'): - contextvars = eventlet.import_patched('contextvars') - return True, contextvars.ContextVar - except ImportError: - pass - try: from contextvars import ContextVar @@ -1211,9 +1200,7 @@ def _get_contextvars(): except ImportError: pass - # Fall back to basic thread-local usage. - from threading import local return False, _make_threadlocal_contextvars(local) From 55ce654c1e2ad8dde86fae89e6b47deca53ea719 Mon Sep 17 00:00:00 2001 From: Guilherme Scaranse Date: Fri, 19 Nov 2021 14:50:04 -0300 Subject: [PATCH 4/9] fix codestyle --- sentry_sdk/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index f0414ff666..7bcf0075f3 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1201,6 +1201,7 @@ def _get_contextvars(): pass # Fall back to basic thread-local usage. + from threading import local return False, _make_threadlocal_contextvars(local) From 9dd50a4868decf83c20f28c8fe82681b7632e1d7 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 25 Oct 2023 12:07:12 +0200 Subject: [PATCH 5/9] Applied Black formatting to utils.py --- sentry_sdk/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 8c6221b1a6..ce7b34258e 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1162,7 +1162,9 @@ def _is_contextvars_broken(): import greenlet from eventlet.patcher import is_monkey_patched # type: ignore - version_tuple = tuple([int(part) for part in greenlet.__version__.split(".")[:2]]) + version_tuple = tuple( + [int(part) for part in greenlet.__version__.split(".")[:2]] + ) if is_monkey_patched("thread") and version_tuple < (0, 5): return True except ImportError: From 53955e00c83a44fa25c6339adb01f56602fe8187 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 25 Oct 2023 12:13:45 +0200 Subject: [PATCH 6/9] Add greenlet to linter requirements --- linter-requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/linter-requirements.txt b/linter-requirements.txt index d1108f8eae..a3b59d1758 100644 --- a/linter-requirements.txt +++ b/linter-requirements.txt @@ -9,3 +9,4 @@ loguru # There is no separate types module. flake8-bugbear pep8-naming pre-commit # local linting +greenlet From e912cb1c3e30188592834d4ec21fe66f4967818a Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 25 Oct 2023 12:20:48 +0200 Subject: [PATCH 7/9] Removed greenlet from linter-requirements, added type ignore to import --- linter-requirements.txt | 1 - sentry_sdk/utils.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/linter-requirements.txt b/linter-requirements.txt index a3b59d1758..d1108f8eae 100644 --- a/linter-requirements.txt +++ b/linter-requirements.txt @@ -9,4 +9,3 @@ loguru # There is no separate types module. flake8-bugbear pep8-naming pre-commit # local linting -greenlet diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index ce7b34258e..6ddb5b985e 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1159,7 +1159,7 @@ def _is_contextvars_broken(): pass try: - import greenlet + import greenlet # type: ignore from eventlet.patcher import is_monkey_patched # type: ignore version_tuple = tuple( From 4fa49e00397fdf439811b076b2f6e30b1765bb48 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 25 Oct 2023 14:52:02 +0200 Subject: [PATCH 8/9] Use parse_version --- sentry_sdk/utils.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 6ddb5b985e..1018311b50 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1162,9 +1162,14 @@ def _is_contextvars_broken(): import greenlet # type: ignore from eventlet.patcher import is_monkey_patched # type: ignore - version_tuple = tuple( - [int(part) for part in greenlet.__version__.split(".")[:2]] - ) + version_tuple = parse_version(greenlet.__version__) + + if version_tuple is None: + logger.error( + "Internal error in Sentry SDK: Could not parse Greenlet version from greenlet.__version__." + ) + return False + if is_monkey_patched("thread") and version_tuple < (0, 5): return True except ImportError: From c70a7da304dd31e34e7f0784541127da2de93c06 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 25 Oct 2023 14:59:56 +0200 Subject: [PATCH 9/9] Fixed mypy error --- sentry_sdk/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 1018311b50..22816e3d33 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1162,15 +1162,15 @@ def _is_contextvars_broken(): import greenlet # type: ignore from eventlet.patcher import is_monkey_patched # type: ignore - version_tuple = parse_version(greenlet.__version__) + greenlet_version = parse_version(greenlet.__version__) - if version_tuple is None: + if greenlet_version is None: logger.error( "Internal error in Sentry SDK: Could not parse Greenlet version from greenlet.__version__." ) return False - if is_monkey_patched("thread") and version_tuple < (0, 5): + if is_monkey_patched("thread") and greenlet_version < (0, 5): return True except ImportError: pass