@@ -172,3 +172,57 @@ def target():
172172 assert Thread .run .__qualname__ == original_run .__qualname__
173173 assert t .run .__name__ == "run"
174174 assert t .run .__qualname__ == original_run .__qualname__
175+
176+
177+ def test_trx_in_trx_not_working (sentry_init , capture_events ):
178+ sentry_init (
179+ traces_sample_rate = 1.0 ,
180+ integrations = [ThreadingIntegration (propagate_hub = True )],
181+ )
182+ events = capture_events ()
183+
184+ def do_some_work (number ):
185+ with sentry_sdk .start_transaction (name = f"inner-trx-{ number } " ) as trx_inner :
186+ print (f"Inner Trx: { trx_inner } " )
187+ with sentry_sdk .start_span (op = f"inner-{ number } -a" , name = str (number )):
188+ with sentry_sdk .start_span (op = f"inner-{ number } -b" , name = str (number )):
189+ with sentry_sdk .start_span (
190+ op = f"inner-{ number } -c" , name = str (number )
191+ ):
192+ with sentry_sdk .start_span (
193+ op = f"inner-{ number } -d" , name = str (number )
194+ ):
195+ with sentry_sdk .start_span (
196+ op = f"inner-{ number } -e" , name = str (number )
197+ ):
198+ with sentry_sdk .start_span (
199+ op = f"inner-{ number } -f" , name = str (number )
200+ ):
201+ pass
202+
203+ with sentry_sdk .start_transaction (name = "outer-trx" ) as trx_outer :
204+ print (f"Outer Trx: { trx_outer } " )
205+ with futures .ThreadPoolExecutor (max_workers = 2 ) as executor :
206+ for number in range (20 ):
207+ with sentry_sdk .start_span (
208+ op = f"outer1-{ number } " , name = str (number )
209+ ) as span :
210+ with sentry_sdk .start_span (
211+ op = f"outer2-{ number } " , name = str (number )
212+ ) as span :
213+ with sentry_sdk .start_span (
214+ op = f"outer3-{ number } " , name = str (number )
215+ ) as span :
216+ executor .submit (do_some_work , number )
217+
218+ wrong_span_found_in_trx = False
219+ for event in events :
220+ prefix = "inner" if event ["transaction" ].startswith ("inner" ) else "outer"
221+ for span in event ["spans" ]:
222+ if not span ["op" ].startswith (prefix ):
223+ wrong_span_found_in_trx = True
224+ break
225+
226+ assert (
227+ wrong_span_found_in_trx
228+ ), "No wrong span found in transaction. It is excepted that there is one. (as we are testing a race condition, this test might fail randomly)"
0 commit comments