Skip to content
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions sentry_sdk/integrations/rust_tracing.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@
from sentry_sdk.tracing import Span as SentrySpan
from sentry_sdk.utils import SENSITIVE_DATA_SUBSTITUTE

TraceState = Optional[Tuple[Optional[SentrySpan], SentrySpan]]
Comment thread
sentrivana marked this conversation as resolved.


class RustTracingLevel(Enum):
Trace = "TRACE"
Expand Down Expand Up @@ -170,7 +168,7 @@
else self.include_tracing_fields
)

def on_event(self, event: str, _span_state: "TraceState") -> None:
def on_event(self, event: str, sentry_span: "SentrySpan") -> None:
deserialized_event = json.loads(event)
metadata = deserialized_event.get("metadata", {})

Expand All @@ -184,7 +182,7 @@
elif event_type == EventTypeMapping.Event:
process_event(deserialized_event)

def on_new_span(self, attrs: str, span_id: str) -> "TraceState":
def on_new_span(self, attrs: str, span_id: str) -> "SentrySpan":
attrs = json.loads(attrs)
metadata = attrs.get("metadata", {})

Expand All @@ -210,35 +208,26 @@
"origin": self.origin,
}

scope = sentry_sdk.get_current_scope()
parent_sentry_span = scope.span
if parent_sentry_span:
sentry_span = parent_sentry_span.start_child(**kwargs)
else:
sentry_span = scope.start_span(**kwargs)

sentry_span = sentry_sdk.start_span(**kwargs)
fields = metadata.get("fields", [])
for field in fields:
if self._include_tracing_fields():
sentry_span.set_data(field, attrs.get(field))
else:
sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE)

scope.span = sentry_span
return (parent_sentry_span, sentry_span)
sentry_span.__enter__()
return sentry_span

def on_close(self, span_id: str, span_state: "TraceState") -> None:
if span_state is None:
def on_close(self, span_id: str, sentry_span: "SentrySpan") -> None:
if sentry_span is None:
return

parent_sentry_span, sentry_span = span_state
sentry_span.finish()
sentry_sdk.get_current_scope().span = parent_sentry_span
sentry_span.__exit__()

Check failure on line 226 in sentry_sdk/integrations/rust_tracing.py

View workflow job for this annotation

GitHub Actions / warden: code-review

sentry_span.__exit__() called without required arguments causes TypeError

The `__exit__()` method is called without arguments, but Python's context manager protocol requires three arguments (`exc_type`, `exc_value`, `traceback`). The `Span.__exit__` method signature is `def __exit__(self, ty, value, tb)` with no default values. This will raise `TypeError: __exit__() missing 3 required positional arguments` when `on_close()` is called.

Check failure on line 226 in sentry_sdk/integrations/rust_tracing.py

View workflow job for this annotation

GitHub Actions / warden: find-bugs

Span.__exit__() called without required arguments causing TypeError at runtime

The `on_close` method calls `sentry_span.__exit__()` without any arguments, but `Span.__exit__` requires three positional arguments (`ty`, `value`, `tb`) as shown in `sentry_sdk/tracing.py` line 396-398. This will cause a `TypeError` at runtime when closing any Rust tracing span, completely breaking the integration's span lifecycle.
Comment thread
sentrivana marked this conversation as resolved.
Outdated

def on_record(self, span_id: str, values: str, span_state: "TraceState") -> None:
if span_state is None:
def on_record(self, span_id: str, values: str, sentry_span: "SentrySpan") -> None:
if sentry_span is None:
return
_parent_sentry_span, sentry_span = span_state

deserialized_values = json.loads(values)
for key, value in deserialized_values.items():
Expand Down
Loading