From 3b884f7a001d5447293f57d36bed973905064964 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 25 Aug 2026 06:35:33 +0200 Subject: [PATCH 1/2] fix(opentelemetry): Exclude queries from span descriptions Parse the url.full fallback through the shared URL utility before using it as an HTTP span description. This removes query parameters and fragments while preserving route and target handling. Refs #5666 Co-Authored-By: Claude --- .../io/sentry/opentelemetry/SpanDescriptionExtractor.java | 7 +++---- .../src/test/kotlin/SpanDescriptionExtractorTest.kt | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java index 3af3d8f96f0..d4dde49a4b6 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java @@ -10,6 +10,7 @@ import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.sentry.SentryOptions; import io.sentry.protocol.TransactionNameSource; +import io.sentry.util.UrlUtils; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -77,10 +78,8 @@ private OtelSpanInfo descriptionForHttpMethod( final @NotNull String op = opBuilder.toString(); final @Nullable String urlFull = attributes.get(UrlAttributes.URL_FULL); - if (urlFull != null) { - if (httpPath == null) { - httpPath = urlFull; - } + if (urlFull != null && httpPath == null) { + httpPath = UrlUtils.parse(urlFull).getUrl(); } final @Nullable String urlPath = attributes.get(UrlAttributes.URL_PATH); diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt index a43afb849e6..04de1e97078 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt @@ -113,7 +113,7 @@ class SpanDescriptionExtractorTest { val info = whenExtractingSpanInfo() assertEquals("http.server", info.op) - assertEquals("GET https://sentry.io/some/path?q=1#top", info.description) + assertEquals("GET https://sentry.io/some/path", info.description) assertEquals(TransactionNameSource.URL, info.transactionNameSource) } From dc6cd575c82d9484c25a8a11116ec59f0368db70 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 27 Aug 2026 14:57:23 +0200 Subject: [PATCH 2/2] fix(opentelemetry): Normalize legacy HTTP target descriptions Exclude query parameters and fragments when deriving Sentry span descriptions from the legacy http.target attribute. Leave the completed OpenTelemetry attribute unchanged. Refs #5666 Co-Authored-By: Claude --- .../SpanDescriptionExtractor.java | 4 ++-- .../kotlin/SpanDescriptionExtractorTest.kt | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java index d4dde49a4b6..af6d1b74e74 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SpanDescriptionExtractor.java @@ -72,8 +72,8 @@ private OtelSpanInfo descriptionForHttpMethod( final @Nullable String httpTarget = attributes.get(HttpIncubatingAttributes.HTTP_TARGET); final @Nullable String httpRoute = attributes.get(HttpAttributes.HTTP_ROUTE); @Nullable String httpPath = httpRoute; - if (httpPath == null) { - httpPath = httpTarget; + if (httpPath == null && httpTarget != null) { + httpPath = UrlUtils.parse(httpTarget).getUrl(); } final @NotNull String op = opBuilder.toString(); diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt index 04de1e97078..5100ff715bb 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/test/kotlin/SpanDescriptionExtractorTest.kt @@ -132,7 +132,7 @@ class SpanDescriptionExtractorTest { } @Test - fun `uses HTTP_TARGET for description`() { + fun `uses HTTP_ROUTE over HTTP_TARGET for description`() { givenSpanKind(SpanKind.SERVER) givenAttributes( mapOf( @@ -150,6 +150,23 @@ class SpanDescriptionExtractorTest { assertEquals(TransactionNameSource.ROUTE, info.transactionNameSource) } + @Test + fun `removes query and fragment from HTTP_TARGET description`() { + givenSpanKind(SpanKind.SERVER) + givenAttributes( + mapOf( + HttpAttributes.HTTP_REQUEST_METHOD to "GET", + HttpIncubatingAttributes.HTTP_TARGET to "/checkout?page=1&token=secret#details", + ) + ) + + val info = whenExtractingSpanInfo() + + assertEquals("http.server", info.op) + assertEquals("GET /checkout", info.description) + assertEquals(TransactionNameSource.URL, info.transactionNameSource) + } + @Test fun `uses span name as description fallback`() { givenSpanKind(SpanKind.SERVER)