From 886c5b78541bb1d558916e910c494d3915968eb0 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 19 Jun 2026 15:18:05 +0200 Subject: [PATCH] fix(browser): Ensure `url.full` and `http.url` attributes have the same values on `http.client` spans --- .../suites/integrations/graphqlClient/fetch/test.ts | 1 + .../graphqlClient/persistedQuery-fetch/test.ts | 1 + .../graphqlClient/persistedQuery-xhr/test.ts | 1 + .../suites/integrations/graphqlClient/xhr/test.ts | 1 + .../suites/tracing/request/fetch-data-url/test.ts | 1 + .../suites/tracing/request/fetch-immediate/test.ts | 1 + .../tracing/request/fetch-relative-url/test.ts | 1 + .../suites/tracing/request/fetch-streamed/test.ts | 1 + .../request/fetch-strip-query-and-fragment/test.ts | 4 ++++ .../suites/tracing/request/fetch/test.ts | 1 + .../suites/tracing/request/xhr-data-url/test.ts | 1 + .../suites/tracing/request/xhr-relative-url/test.ts | 1 + .../suites/tracing/request/xhr-streamed/test.ts | 1 + .../request/xhr-strip-query-and-fragment/test.ts | 4 ++++ .../suites/tracing/request/xhr/test.ts | 1 + packages/browser/src/tracing/request.ts | 12 ++++++++++-- 16 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/fetch/test.ts b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/fetch/test.ts index db3758706737..1d91e558afc8 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/fetch/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/fetch/test.ts @@ -50,6 +50,7 @@ sentryTest('should update spans for GraphQL fetch requests', async ({ getLocalTe type: 'fetch', 'http.method': 'POST', 'http.url': 'http://sentry-test.io/foo', + 'url.full': 'http://sentry-test.io/foo', url: 'http://sentry-test.io/foo', 'server.address': 'sentry-test.io', 'sentry.op': 'http.client', diff --git a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-fetch/test.ts b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-fetch/test.ts index 14003c708574..48571bab503f 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-fetch/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-fetch/test.ts @@ -44,6 +44,7 @@ sentryTest('should update spans for GraphQL persisted query fetch requests', asy type: 'fetch', 'http.method': 'POST', 'http.url': 'http://sentry-test.io/graphql', + 'url.full': 'http://sentry-test.io/graphql', url: 'http://sentry-test.io/graphql', 'server.address': 'sentry-test.io', 'sentry.op': 'http.client', diff --git a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-xhr/test.ts b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-xhr/test.ts index ad62475fa841..c7eda0d5bb00 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-xhr/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/persistedQuery-xhr/test.ts @@ -44,6 +44,7 @@ sentryTest('should update spans for GraphQL persisted query XHR requests', async type: 'xhr', 'http.method': 'POST', 'http.url': 'http://sentry-test.io/graphql', + 'url.full': 'http://sentry-test.io/graphql', url: 'http://sentry-test.io/graphql', 'server.address': 'sentry-test.io', 'sentry.op': 'http.client', diff --git a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/xhr/test.ts b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/xhr/test.ts index 3f0a37771c66..5d49fff05a05 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/xhr/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/graphqlClient/xhr/test.ts @@ -50,6 +50,7 @@ sentryTest('should update spans for GraphQL XHR requests', async ({ getLocalTest type: 'xhr', 'http.method': 'POST', 'http.url': 'http://sentry-test.io/foo', + 'url.full': 'http://sentry-test.io/foo', url: 'http://sentry-test.io/foo', 'server.address': 'sentry-test.io', 'sentry.op': 'http.client', diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-data-url/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-data-url/test.ts index 46995dd6c152..a763e21f3919 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-data-url/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-data-url/test.ts @@ -32,4 +32,5 @@ sentryTest('sanitizes data URLs in fetch span name and attributes', async ({ get }); expect(span?.data?.['http.url']).toBe(sanitizedUrl); + expect(span?.data?.['url.full']).toBe(sanitizedUrl); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-immediate/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-immediate/test.ts index f73689554e91..ca594b323223 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-immediate/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-immediate/test.ts @@ -32,6 +32,7 @@ sentryTest('should create spans for fetch requests called directly after init', data: { 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/0', + 'url.full': 'http://sentry-test-site.example/0', url: 'http://sentry-test-site.example/0', 'server.address': 'sentry-test-site.example', type: 'fetch', diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-relative-url/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-relative-url/test.ts index 0473f01e5015..3033a1edc729 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-relative-url/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-relative-url/test.ts @@ -30,6 +30,7 @@ sentryTest('should create spans for fetch requests', async ({ getLocalTestUrl, p data: { 'http.method': 'GET', 'http.url': `${TEST_HOST}/test-req/${index}`, + 'url.full': `${TEST_HOST}/test-req/${index}`, url: `/test-req/${index}`, 'server.address': 'sentry-test.io', type: 'fetch', diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-streamed/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-streamed/test.ts index 49865da46140..6e93d04c9b85 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-streamed/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-streamed/test.ts @@ -38,6 +38,7 @@ sentryTest('creates spans for fetch requests', async ({ getLocalTestUrl, page }) attributes: expect.objectContaining({ 'http.method': { type: 'string', value: 'GET' }, 'http.url': { type: 'string', value: `http://sentry-test-site.example/${index}` }, + 'url.full': { type: 'string', value: `http://sentry-test-site.example/${index}` }, url: { type: 'string', value: `http://sentry-test-site.example/${index}` }, 'server.address': { type: 'string', value: 'sentry-test-site.example' }, type: { type: 'string', value: 'fetch' }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-strip-query-and-fragment/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-strip-query-and-fragment/test.ts index 0ac0731d3537..e2b3e346a214 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-strip-query-and-fragment/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-strip-query-and-fragment/test.ts @@ -31,6 +31,7 @@ sentryTest('strips query params in fetch request spans', async ({ getLocalTestUr data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/0?id=123;page=5', + 'url.full': 'http://sentry-test-site.example/0?id=123;page=5', 'http.query': '?id=123;page=5', 'http.response.status_code': 200, 'http.response_content_length': 2, @@ -74,6 +75,7 @@ sentryTest('strips hash fragment in fetch request spans', async ({ getLocalTestU data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/1#fragment', + 'url.full': 'http://sentry-test-site.example/1#fragment', 'http.fragment': '#fragment', 'http.response.status_code': 200, 'http.response_content_length': 2, @@ -117,6 +119,7 @@ sentryTest('strips hash fragment and query params in fetch request spans', async data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/2?id=1#fragment', + 'url.full': 'http://sentry-test-site.example/2?id=1#fragment', 'http.query': '?id=1', 'http.fragment': '#fragment', 'http.response.status_code': 200, @@ -161,6 +164,7 @@ sentryTest( data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test.io/api/users?id=1#fragment', + 'url.full': 'http://sentry-test.io/api/users?id=1#fragment', 'http.query': '?id=1', 'http.fragment': '#fragment', 'http.response.status_code': 200, diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts index 7955676bf0c8..f208e2c6e620 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts @@ -33,6 +33,7 @@ sentryTest('should create spans for fetch requests', async ({ getLocalTestUrl, p data: { 'http.method': 'GET', 'http.url': `http://sentry-test-site.example/${index}`, + 'url.full': `http://sentry-test-site.example/${index}`, url: `http://sentry-test-site.example/${index}`, 'server.address': 'sentry-test-site.example', type: 'fetch', diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-data-url/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-data-url/test.ts index 88bce31e1753..f115b687e05f 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-data-url/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-data-url/test.ts @@ -27,4 +27,5 @@ sentryTest('sanitizes data URLs in XHR span name and attributes', async ({ getLo }); expect(span?.data?.['http.url']).toBe(sanitizedUrl); + expect(span?.data?.['url.full']).toBe(sanitizedUrl); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-relative-url/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-relative-url/test.ts index e207d3db04b2..0970c762ba3c 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-relative-url/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-relative-url/test.ts @@ -30,6 +30,7 @@ sentryTest('should create spans for xhr requests', async ({ getLocalTestUrl, pag data: { 'http.method': 'GET', 'http.url': `${TEST_HOST}/test-req/${index}`, + 'url.full': `${TEST_HOST}/test-req/${index}`, url: `/test-req/${index}`, 'server.address': 'sentry-test.io', type: 'xhr', diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-streamed/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-streamed/test.ts index 50442d6840ce..42ec27cb9674 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-streamed/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-streamed/test.ts @@ -34,6 +34,7 @@ sentryTest('creates spans for XHR requests', async ({ getLocalTestUrl, page }) = attributes: expect.objectContaining({ 'http.method': { type: 'string', value: 'GET' }, 'http.url': { type: 'string', value: `http://sentry-test-site.example/${index}` }, + 'url.full': { type: 'string', value: `http://sentry-test-site.example/${index}` }, url: { type: 'string', value: `http://sentry-test-site.example/${index}` }, 'server.address': { type: 'string', value: 'sentry-test-site.example' }, type: { type: 'string', value: 'xhr' }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-strip-query-and-fragment/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-strip-query-and-fragment/test.ts index fb96465b8b5b..30c08c5cb61b 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-strip-query-and-fragment/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-strip-query-and-fragment/test.ts @@ -31,6 +31,7 @@ sentryTest('strips query params in XHR request spans', async ({ getLocalTestUrl, data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/0?id=123;page=5', + 'url.full': 'http://sentry-test-site.example/0?id=123;page=5', 'http.query': '?id=123;page=5', 'http.response.status_code': 200, 'sentry.op': 'http.client', @@ -73,6 +74,7 @@ sentryTest('strips hash fragment in XHR request spans', async ({ getLocalTestUrl data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/1#fragment', + 'url.full': 'http://sentry-test-site.example/1#fragment', 'http.fragment': '#fragment', 'http.response.status_code': 200, 'sentry.op': 'http.client', @@ -115,6 +117,7 @@ sentryTest('strips hash fragment and query params in XHR request spans', async ( data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test-site.example/2?id=1#fragment', + 'url.full': 'http://sentry-test-site.example/2?id=1#fragment', 'http.query': '?id=1', 'http.fragment': '#fragment', 'http.response.status_code': 200, @@ -158,6 +161,7 @@ sentryTest( data: expect.objectContaining({ 'http.method': 'GET', 'http.url': 'http://sentry-test.io/api/users?id=1#fragment', + 'url.full': 'http://sentry-test.io/api/users?id=1#fragment', 'http.query': '?id=1', 'http.fragment': '#fragment', 'http.response.status_code': 200, diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts index ccf40203281a..400e0395eaf8 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts @@ -28,6 +28,7 @@ sentryTest('should create spans for XHR requests', async ({ getLocalTestUrl, pag data: { 'http.method': 'GET', 'http.url': `http://sentry-test-site.example/${index}`, + 'url.full': `http://sentry-test-site.example/${index}`, url: `http://sentry-test-site.example/${index}`, 'server.address': 'sentry-test-site.example', type: 'xhr', diff --git a/packages/browser/src/tracing/request.ts b/packages/browser/src/tracing/request.ts index ebb58062e617..f4e6b3d184a9 100644 --- a/packages/browser/src/tracing/request.ts +++ b/packages/browser/src/tracing/request.ts @@ -169,8 +169,12 @@ export function instrumentOutgoingRequests(client: Client, _options?: Partial