diff --git a/packages/tanstackstart-react/src/client/sdk.ts b/packages/tanstackstart-react/src/client/sdk.ts index 0998c027f112..2f86766df520 100644 --- a/packages/tanstackstart-react/src/client/sdk.ts +++ b/packages/tanstackstart-react/src/client/sdk.ts @@ -18,5 +18,16 @@ export function init(options: ReactBrowserOptions): Client | undefined { applyTunnelRouteOption(sentryOptions); applySdkMetadata(sentryOptions, 'tanstackstart-react', ['tanstackstart-react', 'react']); + sentryOptions.ignoreSpans = [ + ...(sentryOptions.ignoreSpans || []), + /\/node_modules\//, + /\/favicon\.ico/, + /\/@id\//, + /\/@react-refresh/, + /\/@tanstack-start\//, + /\/@fs\//, + /\/@vite\//, + ]; + return initReactSDK(sentryOptions); } diff --git a/packages/tanstackstart-react/src/server/sdk.ts b/packages/tanstackstart-react/src/server/sdk.ts index 1bf2b5e65be2..5f0d5a5a29df 100644 --- a/packages/tanstackstart-react/src/server/sdk.ts +++ b/packages/tanstackstart-react/src/server/sdk.ts @@ -13,5 +13,13 @@ export function init(options: NodeOptions): NodeClient | undefined { applySdkMetadata(sentryOptions, 'tanstackstart-react', ['tanstackstart-react', 'node']); + sentryOptions.ignoreSpans = [ + ...(sentryOptions.ignoreSpans || []), + /\/node_modules\//, + /\/@id\//, + /\/@react-refresh/, + /\/@vite\//, + ]; + return initNodeSdk(sentryOptions); } diff --git a/packages/tanstackstart-react/test/client/sdk.test.ts b/packages/tanstackstart-react/test/client/sdk.test.ts index 400bbe877dc1..b8add33b4984 100644 --- a/packages/tanstackstart-react/test/client/sdk.test.ts +++ b/packages/tanstackstart-react/test/client/sdk.test.ts @@ -43,6 +43,37 @@ describe('TanStack Start React Client SDK', () => { expect(init({})).not.toBeUndefined(); }); + it('sets ignoreSpans to filter low-quality spans', () => { + init({ dsn: 'https://public@dsn.ingest.sentry.io/1337' }); + + expect(reactInit).toHaveBeenCalledWith( + expect.objectContaining({ + ignoreSpans: expect.arrayContaining([ + /\/node_modules\//, + /\/favicon\.ico/, + /\/@id\//, + /\/@react-refresh/, + /\/@tanstack-start\//, + /\/@fs\//, + /\/@vite\//, + ]), + }), + ); + }); + + it('preserves user-defined ignoreSpans', () => { + init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + ignoreSpans: [/custom-pattern/], + }); + + expect(reactInit).toHaveBeenCalledWith( + expect.objectContaining({ + ignoreSpans: expect.arrayContaining([/custom-pattern/, /\/favicon\.ico/]), + }), + ); + }); + it('applies the managed tunnel route when no runtime tunnel is provided', () => { vi.stubGlobal('__SENTRY_TANSTACKSTART_TUNNEL_ROUTE__', '/managed-tunnel'); diff --git a/packages/tanstackstart-react/test/server/sdk.test.ts b/packages/tanstackstart-react/test/server/sdk.test.ts index f95d970ce8cc..889c43fff513 100644 --- a/packages/tanstackstart-react/test/server/sdk.test.ts +++ b/packages/tanstackstart-react/test/server/sdk.test.ts @@ -38,5 +38,28 @@ describe('TanStack Start React Server SDK', () => { it('returns client from init', () => { expect(init({})).not.toBeUndefined(); }); + + it('sets ignoreSpans to filter low-quality transactions', () => { + init({ dsn: 'https://public@dsn.ingest.sentry.io/1337' }); + + expect(nodeInit).toHaveBeenCalledWith( + expect.objectContaining({ + ignoreSpans: expect.arrayContaining([/\/node_modules\//, /\/@id\//, /\/@react-refresh/, /\/@vite\//]), + }), + ); + }); + + it('preserves user-defined ignoreSpans', () => { + init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + ignoreSpans: [/custom-pattern/], + }); + + expect(nodeInit).toHaveBeenCalledWith( + expect.objectContaining({ + ignoreSpans: expect.arrayContaining([/custom-pattern/, /\/@vite\//]), + }), + ); + }); }); });