Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
20 changes: 13 additions & 7 deletions sentry_sdk/integrations/opentelemetry/span_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
if TYPE_CHECKING:
from typing import Any, Optional, Union
from opentelemetry import context as context_api
from opentelemetry.trace import SpanContext
from sentry_sdk._types import Event, Hint

OPEN_TELEMETRY_CONTEXT = "otel"
Expand Down Expand Up @@ -124,13 +125,16 @@ def on_start(
if client.options["instrumenter"] != INSTRUMENTER.OTEL:
return

if not otel_span.get_span_context().is_valid:
span_context = otel_span.get_span_context()
if span_context is None or not span_context.is_valid:
return

if self._is_sentry_span(otel_span):
return

trace_data = self._get_trace_data(otel_span, parent_context)
trace_data = self._get_trace_data(
span_context, otel_span.parent, parent_context
)

parent_span_id = trace_data["parent_span_id"]
sentry_parent_span = (
Expand Down Expand Up @@ -183,7 +187,7 @@ def on_end(self, otel_span: "OTelSpan") -> None:
return

span_context = otel_span.get_span_context()
if not span_context.is_valid:
if span_context is None or not span_context.is_valid:
return

span_id = format_span_id(span_context.span_id)
Expand Down Expand Up @@ -255,13 +259,15 @@ def _get_otel_context(self, otel_span: "OTelSpan") -> "dict[str, Any]":
return ctx

def _get_trace_data(
self, otel_span: "OTelSpan", parent_context: "Optional[context_api.Context]"
self,
span_context: "SpanContext",
parent_span_context: "Optional[SpanContext]",
parent_context: "Optional[context_api.Context]",
) -> "dict[str, Any]":
"""
Extracts tracing information from one OTel span and its parent OTel context.
Extracts tracing information from one OTel span's context and its parent OTel context.
"""
trace_data: "dict[str, Any]" = {}
span_context = otel_span.get_span_context()

span_id = format_span_id(span_context.span_id)
trace_data["span_id"] = span_id
Expand All @@ -270,7 +276,7 @@ def _get_trace_data(
trace_data["trace_id"] = trace_id

parent_span_id = (
format_span_id(otel_span.parent.span_id) if otel_span.parent else None
format_span_id(parent_span_context.span_id) if parent_span_context else None
)
trace_data["parent_span_id"] = parent_span_id

Expand Down
20 changes: 15 additions & 5 deletions tests/integrations/opentelemetry/test_span_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ def test_get_trace_data_with_span_and_trace():
parent_context = {}

span_processor = SentrySpanProcessor()
sentry_trace_data = span_processor._get_trace_data(otel_span, parent_context)
sentry_trace_data = span_processor._get_trace_data(
otel_span.get_span_context(), otel_span.parent, parent_context
)
assert sentry_trace_data["trace_id"] == "1234567890abcdef1234567890abcdef"
assert sentry_trace_data["span_id"] == "1234567890abcdef"
assert sentry_trace_data["parent_span_id"] is None
Expand All @@ -90,7 +92,9 @@ def test_get_trace_data_with_span_and_trace_and_parent():
parent_context = {}

span_processor = SentrySpanProcessor()
sentry_trace_data = span_processor._get_trace_data(otel_span, parent_context)
sentry_trace_data = span_processor._get_trace_data(
otel_span.get_span_context(), otel_span.parent, parent_context
)
assert sentry_trace_data["trace_id"] == "1234567890abcdef1234567890abcdef"
assert sentry_trace_data["span_id"] == "1234567890abcdef"
assert sentry_trace_data["parent_span_id"] == "abcdef1234567890"
Expand Down Expand Up @@ -121,7 +125,9 @@ def test_get_trace_data_with_sentry_trace():
],
):
span_processor = SentrySpanProcessor()
sentry_trace_data = span_processor._get_trace_data(otel_span, parent_context)
sentry_trace_data = span_processor._get_trace_data(
otel_span.get_span_context(), otel_span.parent, parent_context
)
assert sentry_trace_data["trace_id"] == "1234567890abcdef1234567890abcdef"
assert sentry_trace_data["span_id"] == "1234567890abcdef"
assert sentry_trace_data["parent_span_id"] == "abcdef1234567890"
Expand All @@ -138,7 +144,9 @@ def test_get_trace_data_with_sentry_trace():
],
):
span_processor = SentrySpanProcessor()
sentry_trace_data = span_processor._get_trace_data(otel_span, parent_context)
sentry_trace_data = span_processor._get_trace_data(
otel_span.get_span_context(), otel_span.parent, parent_context
)
assert sentry_trace_data["trace_id"] == "1234567890abcdef1234567890abcdef"
assert sentry_trace_data["span_id"] == "1234567890abcdef"
assert sentry_trace_data["parent_span_id"] == "abcdef1234567890"
Expand Down Expand Up @@ -175,7 +183,9 @@ def test_get_trace_data_with_sentry_trace_and_baggage():
],
):
span_processor = SentrySpanProcessor()
sentry_trace_data = span_processor._get_trace_data(otel_span, parent_context)
sentry_trace_data = span_processor._get_trace_data(
otel_span.get_span_context(), otel_span.parent, parent_context
)
assert sentry_trace_data["trace_id"] == "1234567890abcdef1234567890abcdef"
assert sentry_trace_data["span_id"] == "1234567890abcdef"
assert sentry_trace_data["parent_span_id"] == "abcdef1234567890"
Expand Down
Loading