[do not merge] feat: Span streaming & new span API#5551
[do not merge] feat: Span streaming & new span API#5551sentrivana wants to merge 202 commits intomasterfrom
Conversation
| if isinstance(span, Span): | ||
| set_on_span = span.set_attribute | ||
| else: | ||
| set_on_span = span.set_data |
There was a problem hiding this comment.
set_attribute method does not exist on Span class, will raise AttributeError
The code assigns set_on_span = span.set_attribute when the span is an instance of Span, but the Span class (in sentry_sdk/tracing.py) does not have a set_attribute method. This will cause an AttributeError at runtime when _record_exception_on_span is called with a legacy Span object. The logic appears to be inverted - Span has set_data() while StreamedSpan has set_attribute().
Verification
Verified by reading sentry_sdk/tracing.py (Span class definition at line 225) - it has set_data() at line 590 but no set_attribute method. Confirmed via grep that 'set_attribute' has no matches in tracing.py. Also verified sentry_sdk/traces.py where StreamedSpan class at line 216 has set_attribute() at line 410.
Suggested fix: Swap the method assignments - use set_data for Span and set_attribute for StreamedSpan
| if isinstance(span, Span): | |
| set_on_span = span.set_attribute | |
| else: | |
| set_on_span = span.set_data | |
| set_on_span = span.set_data | |
| set_on_span = span.set_attribute |
Also found at 1 additional location
sentry_sdk/integrations/sqlalchemy.py:102-102
Identified by Warden code-review, find-bugs · LS6-SGE
There was a problem hiding this comment.
Fix attempt detected (commit 4b2147d)
The fix attempted to address the inverted logic but introduced the same error in reverse - it assigns set_attribute to Span (which doesn't have this method) and set_data to StreamedSpan (which has set_attribute), so the AttributeError on Span objects will still occur at runtime.
The original issue appears unresolved. Please review and try again.
Evaluated by Warden
Introduce a new
start_span()API with a simpler and more intuitive signature to eventually replace the originalstart_span()andstart_transaction()APIs.Additionally, introduce a new streaming mode (
sentry_sdk.init(_experiments={"trace_lifecycle": "stream"})) that will send spans as they finish, rather than by transaction.The new API MUST be used with the new streaming mode, and the old API MUST be used in the legacy non-streaming (static) mode.
Migration guide: getsentry/sentry-docs#16072
Notes
Spanand drop the newStreamedSpanintracing.pyas a replacement.trace_id(we can't send spans from different traces in the same envelope).Release Plan
Project
https://linear.app/getsentry/project/span-first-sdk-python-727da28dd037/overview