From 9c41e81f139753d91345bfa8df760f42ca814a89 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 11 Sep 2024 12:50:09 +0200 Subject: [PATCH 1/5] Make sure op/name/description are set correctly on transactions/spans --- sentry_sdk/integrations/opentelemetry/utils.py | 3 ++- sentry_sdk/tracing.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/opentelemetry/utils.py b/sentry_sdk/integrations/opentelemetry/utils.py index afa42ea772..2d16a0835d 100644 --- a/sentry_sdk/integrations/opentelemetry/utils.py +++ b/sentry_sdk/integrations/opentelemetry/utils.py @@ -96,8 +96,9 @@ def extract_span_data(span): if span.attributes is None: return (op, description, status, http_status, origin) - origin = span.attributes.get(SentrySpanAttribute.ORIGIN) + op = span.attributes.get(SentrySpanAttribute.OP) or op description = span.attributes.get(SentrySpanAttribute.DESCRIPTION) or description + origin = span.attributes.get(SentrySpanAttribute.ORIGIN) http_method = span.attributes.get(SpanAttributes.HTTP_METHOD) http_method = cast("Optional[str]", http_method) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index 82c7ede10a..1dcde915f9 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -1225,7 +1225,7 @@ def __init__( start_timestamp = convert_to_otel_timestamp(start_timestamp) self._otel_span = tracer.start_span( - description or op or "", start_time=start_timestamp + name or description or op or "", start_time=start_timestamp ) self.origin = origin or DEFAULT_SPAN_ORIGIN From 4fac8a23d7515c83954c88435b5c5e8f67a7273e Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 11 Sep 2024 12:51:14 +0200 Subject: [PATCH 2/5] added missing file --- .../integrations/opentelemetry/test_compat.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 tests/integrations/opentelemetry/test_compat.py diff --git a/tests/integrations/opentelemetry/test_compat.py b/tests/integrations/opentelemetry/test_compat.py new file mode 100644 index 0000000000..ccff8920af --- /dev/null +++ b/tests/integrations/opentelemetry/test_compat.py @@ -0,0 +1,53 @@ +import sentry_sdk + + +def test_transaction_span_compat( + sentry_init, + capture_events, +): + sentry_init(traces_sample_rate=1.0) + + events = capture_events() + + with sentry_sdk.start_transaction(name="trx-name", op="trx-op") as trx: + with sentry_sdk.start_span( + description="span-desc", + op="span-op", + ) as spn: + ... + + assert trx.__class__.__name__ == "POTelSpan" + assert trx.op == "trx-op" + assert trx.name == "trx-name" + assert trx.description is None + + assert trx._otel_span is not None + assert trx._otel_span.name == "trx-name" + assert trx._otel_span.attributes["sentry.op"] == "trx-op" + assert trx._otel_span.attributes["sentry.name"] == "trx-name" + assert "sentry.description" not in trx._otel_span.attributes + + assert spn.__class__.__name__ == "POTelSpan" + assert spn.op == "span-op" + assert spn.description == "span-desc" + assert spn.name is None + + assert spn._otel_span is not None + assert spn._otel_span.name == "span-desc" + assert spn._otel_span.attributes["sentry.op"] == "span-op" + assert spn._otel_span.attributes["sentry.description"] == "span-desc" + assert "sentry.name" not in spn._otel_span.attributes + + transaction = events[0] + assert transaction["transaction"] == "trx-name" + assert transaction["contexts"]["trace"]["op"] == "trx-op" + assert transaction["contexts"]["trace"]["data"]["sentry.op"] == "trx-op" + assert transaction["contexts"]["trace"]["data"]["sentry.name"] == "trx-name" + assert "sentry.description" not in transaction["contexts"]["trace"]["data"] + + span = transaction["spans"][0] + assert span["description"] == "span-desc" + assert span["op"] == "span-op" + assert span["data"]["sentry.op"] == "span-op" + assert span["data"]["sentry.description"] == "span-desc" + assert "sentry.name" not in span["data"] From 0f7f7507a12ed8981d64a0ade203f7b7f0b4eed7 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 11 Sep 2024 12:53:03 +0200 Subject: [PATCH 3/5] formatting --- tests/integrations/opentelemetry/test_compat.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/integrations/opentelemetry/test_compat.py b/tests/integrations/opentelemetry/test_compat.py index ccff8920af..6551d30391 100644 --- a/tests/integrations/opentelemetry/test_compat.py +++ b/tests/integrations/opentelemetry/test_compat.py @@ -9,7 +9,10 @@ def test_transaction_span_compat( events = capture_events() - with sentry_sdk.start_transaction(name="trx-name", op="trx-op") as trx: + with sentry_sdk.start_transaction( + name="trx-name", + op="trx-op", + ) as trx: with sentry_sdk.start_span( description="span-desc", op="span-op", From f458d15d50910b7197cabc0fb7c190555bf90dfb Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 11 Sep 2024 12:54:19 +0200 Subject: [PATCH 4/5] wording --- tests/integrations/opentelemetry/test_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/opentelemetry/test_compat.py b/tests/integrations/opentelemetry/test_compat.py index 6551d30391..ece08ec900 100644 --- a/tests/integrations/opentelemetry/test_compat.py +++ b/tests/integrations/opentelemetry/test_compat.py @@ -1,7 +1,7 @@ import sentry_sdk -def test_transaction_span_compat( +def test_transaction_name_span_description_compat( sentry_init, capture_events, ): From 67e191a320c6ad0175451b5ffe4511dc7d3caec1 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 12 Sep 2024 12:40:41 +0200 Subject: [PATCH 5/5] Add deprecation warning for now --- sentry_sdk/integrations/opentelemetry/scope.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sentry_sdk/integrations/opentelemetry/scope.py b/sentry_sdk/integrations/opentelemetry/scope.py index 40eb47c01f..a3eb1f3268 100644 --- a/sentry_sdk/integrations/opentelemetry/scope.py +++ b/sentry_sdk/integrations/opentelemetry/scope.py @@ -1,3 +1,5 @@ +import warnings + from typing import cast from contextlib import contextmanager @@ -115,6 +117,13 @@ def start_transaction(self, custom_sampling_context=None, **kwargs): def start_span(self, custom_sampling_context=None, **kwargs): # type: (Optional[SamplingContext], Any) -> POTelSpan + if kwargs.get("description") is not None: + warnings.warn( + "The `description` parameter is deprecated. Please use `name` instead.", + DeprecationWarning, + stacklevel=2, + ) + return POTelSpan(**kwargs, scope=self)