@@ -93,13 +93,12 @@ def division(a, b):
9393 sentry_sdk .get_client ().flush ()
9494
9595 payloads = [i .payload for i in items ]
96- assert len (payloads ) == 2
97- enqueue_span , execute_span = payloads
96+ # The task is enqueued without a wrapping span, so in streaming mode no
97+ # producer (queue.submit.huey) span is created (see the early return in
98+ # patch_enqueue). Only the consumer segment is emitted.
99+ assert len (payloads ) == 1
100+ (execute_span ,) = payloads
98101
99- assert enqueue_span ["attributes" ]["sentry.op" ] == OP .QUEUE_SUBMIT_HUEY
100- assert (
101- enqueue_span ["attributes" ][SPANDATA .MESSAGING_DESTINATION_NAME ] == huey .name
102- )
103102 assert execute_span ["is_segment" ]
104103 assert execute_span ["attributes" ]["sentry.op" ] == OP .QUEUE_TASK_HUEY
105104 assert (
@@ -157,12 +156,12 @@ def retry_task(context):
157156 sentry_sdk .get_client ().flush ()
158157
159158 payloads = [i .payload for i in items ]
160- assert len (payloads ) == 3
161-
162- enqueue_span , re_enqueue_span , execute_span = payloads
159+ # The initial enqueue happens without a wrapping span, so no producer
160+ # span is created for it. The re-enqueue triggered by RetryTask happens
161+ # inside the running consumer segment, so it does get a child span.
162+ assert len (payloads ) == 2
163163
164- assert enqueue_span ["attributes" ]["sentry.op" ] == OP .QUEUE_SUBMIT_HUEY
165- assert enqueue_span ["is_segment" ]
164+ re_enqueue_span , execute_span = payloads
166165
167166 assert re_enqueue_span ["attributes" ]["sentry.op" ] == OP .QUEUE_SUBMIT_HUEY
168167 assert not re_enqueue_span ["is_segment" ]
@@ -181,8 +180,8 @@ def retry_task(context):
181180
182181 all_payloads = [i .payload for i in items ]
183182
184- assert len (all_payloads ) == 4
185- retry_span = all_payloads [3 ]
183+ assert len (all_payloads ) == 3
184+ retry_span = all_payloads [2 ]
186185
187186 assert retry_span ["is_segment" ]
188187 assert retry_span ["name" ] == "retry_task"
@@ -224,10 +223,10 @@ def cancel_task():
224223 sentry_sdk .get_client ().flush ()
225224
226225 payloads = [i .payload for i in items ]
227- assert len (payloads ) == 2
228- enqueue_span , execute_span = payloads
226+ # Enqueued without a wrapping span -> no producer span in streaming mode.
227+ assert len (payloads ) == 1
228+ (execute_span ,) = payloads
229229
230- assert enqueue_span ["attributes" ]["sentry.op" ] == OP .QUEUE_SUBMIT_HUEY
231230 assert execute_span ["attributes" ]["sentry.op" ] == OP .QUEUE_TASK_HUEY
232231 assert execute_span ["is_segment" ]
233232 assert execute_span ["name" ] == "cancel_task"
@@ -270,10 +269,10 @@ def maybe_locked_task():
270269 sentry_sdk .get_client ().flush ()
271270
272271 payloads = [i .payload for i in items ]
273- assert len (payloads ) == 2
274- enqueue_span , execute_span = payloads
272+ # Enqueued without a wrapping span -> no producer span in streaming mode.
273+ assert len (payloads ) == 1
274+ (execute_span ,) = payloads
275275
276- assert enqueue_span ["attributes" ]["sentry.op" ] == OP .QUEUE_SUBMIT_HUEY
277276 assert execute_span ["attributes" ]["sentry.op" ] == OP .QUEUE_TASK_HUEY
278277
279278 assert execute_span ["is_segment" ]
@@ -391,29 +390,36 @@ def task2():
391390 if has_span_streaming :
392391 items = capture_items ("span" )
393392
394- huey .enqueue (group ([task1 .s (), task2 .s ()]))
393+ with sentry_sdk .traces .start_span (name = "submission" ):
394+ huey .enqueue (group ([task1 .s (), task2 .s ()]))
395395
396396 for _ in range (2 ):
397397 task = huey .dequeue ()
398398 huey .execute (task )
399399
400400 sentry_sdk .get_client ().flush ()
401- assert len (items ) == 5
401+ assert len (items ) == 6
402402
403403 (
404404 task1_enqueue_span ,
405405 task2_enqueue_span ,
406406 group_span ,
407+ submission_span ,
407408 task1_execute_span ,
408409 task2_execute_span ,
409410 ) = [i .payload for i in items ]
410411
411- assert group_span ["is_segment" ]
412+ # The enqueue happens inside a wrapping span, so the group producer
413+ # tree is created and parented under that segment.
414+ assert submission_span ["is_segment" ]
415+ assert submission_span ["name" ] == "submission"
416+ assert not group_span ["is_segment" ]
412417 assert not task1_enqueue_span ["is_segment" ]
413418 assert not task2_enqueue_span ["is_segment" ]
414419 assert task1_execute_span ["is_segment" ]
415420 assert task2_execute_span ["is_segment" ]
416421
422+ assert group_span ["parent_span_id" ] == submission_span ["span_id" ]
417423 assert group_span ["name" ] == "Huey Task Group"
418424 assert group_span ["status" ] == "ok"
419425 assert group_span ["attributes" ]["sentry.op" ] == "queue.submit.huey"
@@ -422,18 +428,14 @@ def task2():
422428 assert task1_enqueue_span ["name" ] == "task1"
423429 assert task1_enqueue_span ["status" ] == "ok"
424430 assert task1_enqueue_span ["parent_span_id" ] == group_span ["span_id" ]
425- assert (
426- task1_enqueue_span ["attributes" ]["sentry.segment.name" ] == "Huey Task Group"
427- )
431+ assert task1_enqueue_span ["attributes" ]["sentry.segment.name" ] == "submission"
428432 assert task1_enqueue_span ["attributes" ]["sentry.op" ] == "queue.submit.huey"
429433 assert task1_enqueue_span ["attributes" ]["sentry.origin" ] == "auto.queue.huey"
430434
431435 assert task2_enqueue_span ["name" ] == "task2"
432436 assert task2_enqueue_span ["status" ] == "ok"
433437 assert task2_enqueue_span ["parent_span_id" ] == group_span ["span_id" ]
434- assert (
435- task2_enqueue_span ["attributes" ]["sentry.segment.name" ] == "Huey Task Group"
436- )
438+ assert task2_enqueue_span ["attributes" ]["sentry.segment.name" ] == "submission"
437439 assert task2_enqueue_span ["attributes" ]["sentry.op" ] == "queue.submit.huey"
438440 assert task2_enqueue_span ["attributes" ]["sentry.origin" ] == "auto.queue.huey"
439441
@@ -518,29 +520,36 @@ def task2(results):
518520
519521 if has_span_streaming :
520522 items = capture_items ("span" )
521- huey .enqueue (chord ([task1 .s ()], task2 .s ()))
523+ with sentry_sdk .traces .start_span (name = "submission" ):
524+ huey .enqueue (chord ([task1 .s ()], task2 .s ()))
522525
523526 for _ in range (2 ):
524527 task = huey .dequeue ()
525528 huey .execute (task )
526529
527530 sentry_sdk .get_client ().flush ()
528- assert len (items ) == 5
531+ assert len (items ) == 6
529532
530533 (
531534 task1_enqueue_span ,
532535 chord_span ,
536+ submission_span ,
533537 task2_enqueue_span ,
534538 task1_execute_span ,
535539 task2_execute_span ,
536540 ) = [i .payload for i in items ]
537541
538- assert chord_span ["is_segment" ]
542+ # The enqueue happens inside a wrapping span, so the chord producer
543+ # tree is created and parented under that segment.
544+ assert submission_span ["is_segment" ]
545+ assert submission_span ["name" ] == "submission"
546+ assert not chord_span ["is_segment" ]
539547 assert not task1_enqueue_span ["is_segment" ]
540548 assert not task2_enqueue_span ["is_segment" ]
541549 assert task1_execute_span ["is_segment" ]
542550 assert task2_execute_span ["is_segment" ]
543551
552+ assert chord_span ["parent_span_id" ] == submission_span ["span_id" ]
544553 assert chord_span ["name" ] == "Huey Chord"
545554 assert chord_span ["status" ] == "ok"
546555 assert chord_span ["attributes" ]["sentry.op" ] == "queue.submit.huey"
@@ -549,7 +558,7 @@ def task2(results):
549558 assert task1_enqueue_span ["name" ] == "task1"
550559 assert task1_enqueue_span ["status" ] == "ok"
551560 assert task1_enqueue_span ["parent_span_id" ] == chord_span ["span_id" ]
552- assert task1_enqueue_span ["attributes" ]["sentry.segment.name" ] == "Huey Chord "
561+ assert task1_enqueue_span ["attributes" ]["sentry.segment.name" ] == "submission "
553562 assert task1_enqueue_span ["attributes" ]["sentry.op" ] == "queue.submit.huey"
554563 assert task1_enqueue_span ["attributes" ]["sentry.origin" ] == "auto.queue.huey"
555564
0 commit comments