@@ -76,6 +76,33 @@ def _patched_close() -> None:
7676 loop ._sentry_flush_patched = True # type: ignore
7777
7878
79+ def _create_task_with_factory (
80+ orig_task_factory : Any ,
81+ loop : asyncio .AbstractEventLoop ,
82+ coro : Coroutine [Any , Any , Any ],
83+ ** kwargs : Any ,
84+ ) -> asyncio .Task [Any ]:
85+ task = None
86+
87+ # Trying to use user set task factory (if there is one)
88+ if orig_task_factory :
89+ task = orig_task_factory (loop , coro , ** kwargs )
90+
91+ if task is None :
92+ # The default task factory in `asyncio` does not have its own function
93+ # but is just a couple of lines in `asyncio.base_events.create_task()`
94+ # Those lines are copied here.
95+
96+ # WARNING:
97+ # If the default behavior of the task creation in asyncio changes,
98+ # this will break!
99+ task = Task (coro , loop = loop , ** kwargs )
100+ if task ._source_traceback : # type: ignore
101+ del task ._source_traceback [- 1 ] # type: ignore
102+
103+ return task
104+
105+
79106def patch_asyncio () -> None :
80107 orig_task_factory = None
81108 try :
@@ -92,15 +119,9 @@ def _sentry_task_factory(
92119 is_internal = is_internal_task ()
93120
94121 if is_internal :
95- task = None
96- if orig_task_factory :
97- task = orig_task_factory (loop , coro , ** kwargs )
98- if task is None :
99- task = Task (coro , loop = loop , ** kwargs )
100- if task ._source_traceback : # type: ignore
101- del task ._source_traceback [- 1 ] # type: ignore
102-
103- return task
122+ return _create_task_with_factory (
123+ orig_task_factory , loop , coro , ** kwargs
124+ )
104125
105126 async def _task_with_sentry_span_creation () -> Any :
106127 result = None
@@ -119,25 +140,9 @@ async def _task_with_sentry_span_creation() -> Any:
119140
120141 return result
121142
122- task = None
123-
124- # Trying to use user set task factory (if there is one)
125- if orig_task_factory :
126- task = orig_task_factory (
127- loop , _task_with_sentry_span_creation (), ** kwargs
128- )
129-
130- if task is None :
131- # The default task factory in `asyncio` does not have its own function
132- # but is just a couple of lines in `asyncio.base_events.create_task()`
133- # Those lines are copied here.
134-
135- # WARNING:
136- # If the default behavior of the task creation in asyncio changes,
137- # this will break!
138- task = Task (_task_with_sentry_span_creation (), loop = loop , ** kwargs )
139- if task ._source_traceback : # type: ignore
140- del task ._source_traceback [- 1 ] # type: ignore
143+ task = _create_task_with_factory (
144+ orig_task_factory , loop , _task_with_sentry_span_creation (), ** kwargs
145+ )
141146
142147 # Set the task name to include the original coroutine's name
143148 try :
0 commit comments