Skip to content

fix(tracing): Skip child span creation in streaming path when no current span (task queues)#6814

Draft
sentrivana wants to merge 1 commit into
masterfrom
ivana/streaming-child-spans-task-queues
Draft

fix(tracing): Skip child span creation in streaming path when no current span (task queues)#6814
sentrivana wants to merge 1 commit into
masterfrom
ivana/streaming-child-spans-task-queues

Conversation

@sentrivana

Copy link
Copy Markdown
Contributor

Summary

  • When span streaming is enabled and there is no current span, task queue integrations should not create new root segments for child-span operations
  • Adds a sentry_sdk.traces.get_current_span() is None guard before creating spans in the streaming path
  • Affected integrations: celery, huey, arq, ray

Test plan

  • Existing tests pass
  • Verify that in streaming mode, no orphan root segments are created for task queue operations when there's no active span

🤖 Generated with Claude Code

…ent span (task queues)

When span streaming is enabled and there is no current span,
task queue integrations should not create new root segments for
child-span operations. This adds a guard check using
`sentry_sdk.traces.get_current_span()` before creating spans
in the streaming path.

Affected integrations: celery, huey, arq, ray.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

89992 passed | ❌ 40 failed | ⏭️ 6282 skipped | Total: 96314 | Pass Rate: 93.44% | Execution Time: 306m 20s

📊 Comparison with Base Branch

Metric Change
Total Tests 📉 -1188
Passed Tests 📉 -1208
Failed Tests 📈 +40
Skipped Tests 📉 -20

➕ New Tests (40)

View new tests
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_task_transaction_or_segment[streaming-error]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_transaction_or_segment[streaming-success]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_retry[streaming]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_cancel_does_not_override_status[streaming]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_transaction_or_segment[streaming-error]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_transaction_or_segment[streaming-success]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_retry[streaming]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_cancel_does_not_override_status[streaming]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_lock[streaming-locked]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_task_lock[streaming-unlocked]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_huey_enqueue_group[True]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_huey_enqueue_chord[True]
    • File: tests.integrations.huey.test_huey
    • Status: ❌ Failing
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_job_retry[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing
  • test_span_origin_consumer[True-init_arq_with_dict_settings]
    • File: tests.integrations.arq.test_arq
    • Status: ❌ Failing

❌ Failed Tests

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.10-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.10-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.10-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.10-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.13-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.13-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.13-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.13-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.14-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.14-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.14-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.14-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.14t-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.14t-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.14t-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.14t-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
           ^^^^^^^^
E   IndexError: list index out of range

test_task_transaction_or_segment[streaming-error]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v2.1.3
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:96: in test_task_transaction_or_segment
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_transaction_or_segment[streaming-success]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v2.1.3
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:96: in test_task_transaction_or_segment
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_retry[streaming]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v2.1.3
Error: assert 2 == 3 +2 -3

Stack Trace
tests/integrations/huey/test_huey.py:160: in test_task_retry
    assert len(payloads) == 3
E   assert 2 == 3
E     +2
E     -3

test_task_cancel_does_not_override_status[streaming]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v2.1.3
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:227: in test_task_cancel_does_not_override_status
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_transaction_or_segment[streaming-error]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:96: in test_task_transaction_or_segment
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_transaction_or_segment[streaming-success]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:96: in test_task_transaction_or_segment
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_retry[streaming]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 2 == 3 +2 -3

Stack Trace
tests/integrations/huey/test_huey.py:160: in test_task_retry
    assert len(payloads) == 3
E   assert 2 == 3
E     +2
E     -3

test_task_cancel_does_not_override_status[streaming]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:227: in test_task_cancel_does_not_override_status
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_lock[streaming-locked]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:273: in test_task_lock
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_task_lock[streaming-unlocked]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 1 == 2 +1 -2

Stack Trace
tests/integrations/huey/test_huey.py:273: in test_task_lock
    assert len(payloads) == 2
E   assert 1 == 2
E     +1
E     -2

test_huey_enqueue_group[True]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 2 == 5 +2 -5

Stack Trace
tests/integrations/huey/test_huey.py:401: in test_huey_enqueue_group
    assert len(items) == 5
E   assert 2 == 5
E     +2
E     -5

test_huey_enqueue_chord[True]

File: tests.integrations.huey.test_huey
Suite: py3.6-huey-v3.1.1
Error: assert 3 == 5 +3 -5

Stack Trace
tests/integrations/huey/test_huey.py:528: in test_huey_enqueue_chord
    assert len(items) == 5
E   assert 3 == 5
E     +3
E     -5

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.7-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.7-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.7-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.7-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.23
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_job_retry[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:248: in test_job_retry
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

test_span_origin_consumer[True-init_arq_with_dict_settings]

File: tests.integrations.arq.test_arq
Suite: py3.9-arq-v0.28.0
Error: IndexError: list index out of range

Stack Trace
tests/integrations/arq/test_arq.py:597: in test_span_origin_consumer
    assert spans[4]["attributes"]["sentry.op"] == "queue.task.arq"
E   IndexError: list index out of range

❌ Patch coverage is 44.44%. Project has 2574 uncovered lines.
❌ Project coverage is 89.24%. Comparing base (base) to head (head).

Files with missing lines (2)
File Patch % Lines
sentry_sdk/integrations/ray.py 0.00% ⚠️ 9 Missing
sentry_sdk/integrations/celery/init.py 50.00% ⚠️ 1 Missing and 1 partials
Coverage diff
@@            Coverage Diff             @@
##          main       #PR       +/-##
==========================================
- Coverage    89.78%    89.24%    -0.54%
==========================================
  Files          193       193         —
  Lines        23898     23914       +16
  Branches      8258      8268       +10
==========================================
+ Hits         21454     21340      -114
- Misses        2444      2574      +130
- Partials      1353      1352        -1

Generated by Codecov Action

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant