From bdad8181a637bf8d51f072036a889b5f3d36fecc Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Sun, 14 Dec 2025 18:21:35 +0100 Subject: [PATCH 01/19] Fix e2e version to minimally supported --- .../test-applications/tanstackstart-react/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json b/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json index 5df2d237445e..0076ccf22dc8 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json @@ -13,8 +13,8 @@ }, "dependencies": { "@sentry/tanstackstart-react": "latest || *", - "@tanstack/react-start": "^1.139.12", - "@tanstack/react-router": "^1.139.12", + "@tanstack/react-start": "^1.136.0", + "@tanstack/react-router": "^1.136.0", "react": "^19.2.0", "react-dom": "^19.2.0" }, From a3f5e05a7bf5c1e52199a1641c40765391277199 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 10:04:37 +0100 Subject: [PATCH 02/19] Add default server entry with some logs to e2e test --- .../tanstackstart-react/src/server.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts new file mode 100644 index 000000000000..3675281b6446 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts @@ -0,0 +1,12 @@ +import handler, { createServerEntry } from '@tanstack/react-start/server-entry' +import type { ServerEntry } from '@tanstack/react-start/server-entry' + +const requestHandler: ServerEntry = { + fetch(request: Request) { + console.log('requestHandler fetch') + console.log(request) + return handler.fetch(request) + }, +} + +export default createServerEntry(requestHandler); From 320aa98fb280fec270be6a2709cf18870280084c Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 10:27:36 +0100 Subject: [PATCH 03/19] add basic failing transaction test --- .../tests/transaction.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts new file mode 100644 index 000000000000..7b0a0eada51e --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -0,0 +1,20 @@ +import { expect, test } from '@playwright/test'; +import { waitForTransaction } from '@sentry-internal/test-utils'; + +test('Sends a server function transaction', async ({ page }) => { + const transactionEventPromise = waitForTransaction('tanstackstart-react', transactionEvent => { + return transactionEvent?.contexts?.trace?.op === 'http.server' && transactionEvent?.transaction === 'GET /'; + }); + + await page.goto('/'); + + await expect(page.locator('button').filter({ hasText: 'Break server function' })).toBeVisible(); + + await page.locator('button').filter({ hasText: 'Break server function' }).click(); + + const transactionEvent = await transactionEventPromise; + + // TODO: verify correct span data + expect(Array.isArray(transactionEvent?.spans)).toBe(true); + expect(transactionEvent?.spans?.length).toBeGreaterThan(0); +}); From c1d5251c10431cac04881dfda7bb73af9e0f9228 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 13:01:48 +0100 Subject: [PATCH 04/19] proxy fetch with withSentry --- .../tanstackstart-react/src/server.ts | 10 +++-- .../tanstackstart-react/src/server/index.ts | 1 + .../src/server/withSentry.ts | 37 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 packages/tanstackstart-react/src/server/withSentry.ts diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts index 3675281b6446..4561cdff6778 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts @@ -1,12 +1,14 @@ -import handler, { createServerEntry } from '@tanstack/react-start/server-entry' -import type { ServerEntry } from '@tanstack/react-start/server-entry' +import { withSentry } from '@sentry/tanstackstart-react'; -const requestHandler: ServerEntry = { +import handler, { createServerEntry } from '@tanstack/react-start/server-entry'; +import type { ServerEntry } from '@tanstack/react-start/server-entry'; + +const requestHandler: ServerEntry = withSentry({ fetch(request: Request) { console.log('requestHandler fetch') console.log(request) return handler.fetch(request) }, -} +}); export default createServerEntry(requestHandler); diff --git a/packages/tanstackstart-react/src/server/index.ts b/packages/tanstackstart-react/src/server/index.ts index b91a89ed9482..895722f1cd09 100644 --- a/packages/tanstackstart-react/src/server/index.ts +++ b/packages/tanstackstart-react/src/server/index.ts @@ -4,6 +4,7 @@ export * from '@sentry/node'; export { init } from './sdk'; +export { withSentry } from './withSentry'; /** * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts new file mode 100644 index 000000000000..328932f0cc00 --- /dev/null +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -0,0 +1,37 @@ +import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node'; + +export type ServerEntry = { fetch?: (request: Request) => Promise } + +/** + * + * @param serverEntry - server entry function to wrap + * @returns - wrapped server entry function + */ +export function withSentry(serverEntry: ServerEntry): ServerEntry { + if (serverEntry.fetch) { + serverEntry.fetch = new Proxy(serverEntry.fetch, { + apply: async (target, thisArg, args) => { + console.log(args[0].url?.toString()); + console.log('serverFn: ',args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')) + if (args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')) { + const op = 'function.tanstackstart'; + console.log('fetch with startSpan') + return await startSpan( + { + op: op, + name: 'server.fetch', // TODO: use the actual server function name + attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.serverFn', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op + }, + }, + async () => { return await target.apply(thisArg, args) } + ); + } + + return await target.apply(thisArg, args) + }, + }); + } + return serverEntry; +} From 8dd117a7c4753d3ef02aed614c15f0b86c38f5bb Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 13:06:08 +0100 Subject: [PATCH 05/19] lint --- .../tanstackstart-react/src/server.ts | 6 +++--- .../tanstackstart-react/tests/transaction.test.ts | 2 ++ .../tanstackstart-react/src/server/withSentry.ts | 14 ++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts index 4561cdff6778..74d7e6639050 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts @@ -5,9 +5,9 @@ import type { ServerEntry } from '@tanstack/react-start/server-entry'; const requestHandler: ServerEntry = withSentry({ fetch(request: Request) { - console.log('requestHandler fetch') - console.log(request) - return handler.fetch(request) + console.log('requestHandler fetch'); + console.log(request); + return handler.fetch(request); }, }); diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index 7b0a0eada51e..396852ed677f 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -14,6 +14,8 @@ test('Sends a server function transaction', async ({ page }) => { const transactionEvent = await transactionEventPromise; + console.log('transactionEvent: ', transactionEvent); + // TODO: verify correct span data expect(Array.isArray(transactionEvent?.spans)).toBe(true); expect(transactionEvent?.spans?.length).toBeGreaterThan(0); diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 328932f0cc00..baf61dcd4d1d 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -1,6 +1,6 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node'; -export type ServerEntry = { fetch?: (request: Request) => Promise } +export type ServerEntry = { fetch?: (request: Request) => Promise }; /** * @@ -12,24 +12,26 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { serverEntry.fetch = new Proxy(serverEntry.fetch, { apply: async (target, thisArg, args) => { console.log(args[0].url?.toString()); - console.log('serverFn: ',args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')) + console.log('serverFn: ', args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')); if (args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')) { const op = 'function.tanstackstart'; - console.log('fetch with startSpan') + console.log('fetch with startSpan'); return await startSpan( { op: op, name: 'server.fetch', // TODO: use the actual server function name attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.serverFn', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, }, }, - async () => { return await target.apply(thisArg, args) } + async () => { + return await target.apply(thisArg, args); + }, ); } - return await target.apply(thisArg, args) + return await target.apply(thisArg, args); }, }); } From 6de88160970ecf1798a546b254c1aae176410600 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 13:35:30 +0100 Subject: [PATCH 06/19] make it work --- .../src/routes/test-serverFn.tsx | 27 ++++++++++++++++++ .../tests/transaction.test.ts | 28 +++++++++++++------ .../src/server/withSentry.ts | 1 + 3 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx new file mode 100644 index 000000000000..66796f830df7 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx @@ -0,0 +1,27 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { createServerFn } from '@tanstack/react-start'; + +const testLog = createServerFn().handler(async () => { + console.log('Test log from server function'); + return { message: 'Log created' }; +}); + +export const Route = createFileRoute('/test-serverFn')({ + component: TestLog, +}); + +function TestLog() { + return ( +
+

Test Log Page

+ +
+ ); +} diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index 396852ed677f..69852a50937a 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -3,20 +3,32 @@ import { waitForTransaction } from '@sentry-internal/test-utils'; test('Sends a server function transaction', async ({ page }) => { const transactionEventPromise = waitForTransaction('tanstackstart-react', transactionEvent => { - return transactionEvent?.contexts?.trace?.op === 'http.server' && transactionEvent?.transaction === 'GET /'; + return ( + transactionEvent?.contexts?.trace?.op === 'http.server' && + !!transactionEvent?.transaction?.startsWith('GET /_serverFn') + ); }); - await page.goto('/'); + await page.goto('/test-serverFn'); - await expect(page.locator('button').filter({ hasText: 'Break server function' })).toBeVisible(); + await expect(page.getByText('Call server function')).toBeVisible(); - await page.locator('button').filter({ hasText: 'Break server function' }).click(); + await page.getByText('Call server function').click(); const transactionEvent = await transactionEventPromise; - console.log('transactionEvent: ', transactionEvent); - - // TODO: verify correct span data expect(Array.isArray(transactionEvent?.spans)).toBe(true); - expect(transactionEvent?.spans?.length).toBeGreaterThan(0); + expect(transactionEvent?.spans).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + description: 'server.fetch', + op: 'function.tanstackstart', + origin: 'auto.function.tanstackstart.serverFn', + data: { + 'sentry.op': 'function.tanstackstart', + 'sentry.origin': 'auto.function.tanstackstart.serverFn', + }, + }), + ]), + ); }); diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index baf61dcd4d1d..259605adb019 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -31,6 +31,7 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { ); } + console.log('fetch without startSpan'); return await target.apply(thisArg, args); }, }); From 0f425fd19eeeb3341017b5531e5cf08390306271 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 14:00:43 +0100 Subject: [PATCH 07/19] stuff works --- .../tanstackstart-react/src/server.ts | 2 -- .../tests/transaction.test.ts | 2 +- .../src/server/withSentry.ts | 34 ++++++++++++++----- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts index 74d7e6639050..09256cd65543 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts @@ -5,8 +5,6 @@ import type { ServerEntry } from '@tanstack/react-start/server-entry'; const requestHandler: ServerEntry = withSentry({ fetch(request: Request) { - console.log('requestHandler fetch'); - console.log(request); return handler.fetch(request); }, }); diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index 69852a50937a..bcd4a3475c1f 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -21,7 +21,7 @@ test('Sends a server function transaction', async ({ page }) => { expect(transactionEvent?.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - description: 'server.fetch', + description: expect.stringContaining('/_serverFn/'), op: 'function.tanstackstart', origin: 'auto.function.tanstackstart.serverFn', data: { diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 259605adb019..571c4412de8c 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -3,23 +3,42 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSp export type ServerEntry = { fetch?: (request: Request) => Promise }; /** + * This function can be used to wrap the server entry request handler to add tracing to server-side functionality. + * You must explicitly define a server entry point in your application for this to work. This is done by passing the request handler to the `createServerEntry` function. + * For more information about the server entry point, see the [TanStack Start documentation](https://tanstack.com/start/docs/server-entry). * - * @param serverEntry - server entry function to wrap - * @returns - wrapped server entry function + * @example + * ```ts + * import { withSentry } from '@sentry/tanstackstart-react'; + * + * import handler, { createServerEntry } from '@tanstack/react-start/server-entry'; + * import type { ServerEntry } from '@tanstack/react-start/server-entry'; + * + * const requestHandler: ServerEntry = withSentry({ + * fetch(request: Request) { + * return handler.fetch(request); + * }, + * }); + * + * export default serverEntry = createServerEntry(requestHandler); + * ``` + * + * @param serverEntry - request handler to wrap + * @returns - wrapped request handler */ export function withSentry(serverEntry: ServerEntry): ServerEntry { if (serverEntry.fetch) { serverEntry.fetch = new Proxy(serverEntry.fetch, { apply: async (target, thisArg, args) => { - console.log(args[0].url?.toString()); - console.log('serverFn: ', args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')); - if (args[0].url?.includes('_serverFn') || args[0].url?.includes('createServerFn')) { + const request: Request = args[0]; + + // instrument server functions + if (request.url?.includes('_serverFn') || request.url?.includes('createServerFn')) { const op = 'function.tanstackstart'; - console.log('fetch with startSpan'); return await startSpan( { op: op, - name: 'server.fetch', // TODO: use the actual server function name + name: request.url, attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.serverFn', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, @@ -31,7 +50,6 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { ); } - console.log('fetch without startSpan'); return await target.apply(thisArg, args); }, }); From 076dc796dc1b444de5f2af6addd9971ec9473c96 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 14:02:46 +0100 Subject: [PATCH 08/19] remove redundant awaits --- packages/tanstackstart-react/src/server/withSentry.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 571c4412de8c..9a3c61357bd1 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -35,7 +35,7 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { // instrument server functions if (request.url?.includes('_serverFn') || request.url?.includes('createServerFn')) { const op = 'function.tanstackstart'; - return await startSpan( + return startSpan( { op: op, name: request.url, @@ -45,12 +45,12 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { }, }, async () => { - return await target.apply(thisArg, args); + return target.apply(thisArg, args); }, ); } - return await target.apply(thisArg, args); + return target.apply(thisArg, args); }, }); } From d7f246d1fc1c4b6aed4a93595ebf38d93e478971 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 15:11:15 +0100 Subject: [PATCH 09/19] fix ServerEntry type and remove async --- packages/tanstackstart-react/src/server/withSentry.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 9a3c61357bd1..3470dd43a2ce 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -1,6 +1,8 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node'; -export type ServerEntry = { fetch?: (request: Request) => Promise }; +export type ServerEntry = { + fetch: (request: Request, opts?: unknown) => Promise | Response +}; /** * This function can be used to wrap the server entry request handler to add tracing to server-side functionality. @@ -27,13 +29,16 @@ export type ServerEntry = { fetch?: (request: Request) => Promise }; * @returns - wrapped request handler */ export function withSentry(serverEntry: ServerEntry): ServerEntry { + console.log('withSentry called!'); if (serverEntry.fetch) { serverEntry.fetch = new Proxy(serverEntry.fetch, { apply: async (target, thisArg, args) => { const request: Request = args[0]; + console.log('request: ', request); // instrument server functions if (request.url?.includes('_serverFn') || request.url?.includes('createServerFn')) { + console.log('server function called!'); const op = 'function.tanstackstart'; return startSpan( { @@ -44,7 +49,7 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, }, }, - async () => { + () => { return target.apply(thisArg, args); }, ); From 2cb31a849a272f16e3a3294d21a242e5de2fc689 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 15:24:50 +0100 Subject: [PATCH 10/19] clean out logs --- packages/tanstackstart-react/src/server/withSentry.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 3470dd43a2ce..dde0f520195e 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -29,16 +29,13 @@ export type ServerEntry = { * @returns - wrapped request handler */ export function withSentry(serverEntry: ServerEntry): ServerEntry { - console.log('withSentry called!'); if (serverEntry.fetch) { serverEntry.fetch = new Proxy(serverEntry.fetch, { apply: async (target, thisArg, args) => { const request: Request = args[0]; - console.log('request: ', request); // instrument server functions if (request.url?.includes('_serverFn') || request.url?.includes('createServerFn')) { - console.log('server function called!'); const op = 'function.tanstackstart'; return startSpan( { From c5246a6e818a0a99d9e932fd9ca74da028c99e4a Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Mon, 15 Dec 2025 17:18:42 +0100 Subject: [PATCH 11/19] Add test for nested server functions --- .../src/routes/test-serverFn.tsx | 18 +++++ .../tests/transaction.test.ts | 65 ++++++++++++++++++- .../src/server/withSentry.ts | 2 +- 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx index 66796f830df7..894ff4e85ee3 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/routes/test-serverFn.tsx @@ -1,11 +1,21 @@ import { createFileRoute } from '@tanstack/react-router'; import { createServerFn } from '@tanstack/react-start'; +import { startSpan } from '@sentry/tanstackstart-react'; const testLog = createServerFn().handler(async () => { console.log('Test log from server function'); return { message: 'Log created' }; }); +const testNestedLog = createServerFn().handler(async () => { + await startSpan({ name: 'testNestedLog' }, async () => { + await testLog(); + }); + + console.log('Outer test log from server function'); + return { message: 'Nested log created' }; +}); + export const Route = createFileRoute('/test-serverFn')({ component: TestLog, }); @@ -22,6 +32,14 @@ function TestLog() { > Call server function + ); } diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index bcd4a3475c1f..f2494cd8dae0 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; import { waitForTransaction } from '@sentry-internal/test-utils'; -test('Sends a server function transaction', async ({ page }) => { +test('Sends a server function transaction with auto-instrumentation', async ({ page }) => { const transactionEventPromise = waitForTransaction('tanstackstart-react', transactionEvent => { return ( transactionEvent?.contexts?.trace?.op === 'http.server' && @@ -11,12 +11,13 @@ test('Sends a server function transaction', async ({ page }) => { await page.goto('/test-serverFn'); - await expect(page.getByText('Call server function')).toBeVisible(); + await expect(page.getByText('Call server function', { exact: true })).toBeVisible(); - await page.getByText('Call server function').click(); + await page.getByText('Call server function', { exact: true }).click(); const transactionEvent = await transactionEventPromise; + // Check for the auto-instrumented server function span expect(Array.isArray(transactionEvent?.spans)).toBe(true); expect(transactionEvent?.spans).toEqual( expect.arrayContaining([ @@ -32,3 +33,61 @@ test('Sends a server function transaction', async ({ page }) => { ]), ); }); + +test('Sends a server function transaction for a nested server function only if it is manually instrumented', async ({ + page, +}) => { + const transactionEventPromise = waitForTransaction('tanstackstart-react', transactionEvent => { + return ( + transactionEvent?.contexts?.trace?.op === 'http.server' && + !!transactionEvent?.transaction?.startsWith('GET /_serverFn') + ); + }); + + await page.goto('/test-serverFn'); + + await expect(page.getByText('Call server function nested')).toBeVisible(); + + await page.getByText('Call server function nested').click(); + + const transactionEvent = await transactionEventPromise; + + expect(Array.isArray(transactionEvent?.spans)).toBe(true); + + // Check for the auto-instrumented server function span + expect(transactionEvent?.spans).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + description: expect.stringContaining('/_serverFn/'), + op: 'function.tanstackstart', + origin: 'auto.function.tanstackstart.serverFn', + status: 'ok', + }), + ]), + ); + + // Check for the manually instrumented nested span + expect(transactionEvent?.spans).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + description: 'testNestedLog', + origin: 'manual', + status: 'ok', + }), + ]), + ); + + // Verify that the auto span is the parent of the nested span + const autoSpan = transactionEvent?.spans?.find( + (span: { op?: string; origin?: string }) => + span.op === 'function.tanstackstart' && span.origin === 'auto.function.tanstackstart.serverFn', + ); + const nestedSpan = transactionEvent?.spans?.find( + (span: { description?: string; origin?: string }) => + span.description === 'testNestedLog' && span.origin === 'manual', + ); + + expect(autoSpan).toBeDefined(); + expect(nestedSpan).toBeDefined(); + expect(nestedSpan?.parent_span_id).toBe(autoSpan?.span_id); +}); diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index dde0f520195e..d983b652d43b 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -1,7 +1,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node'; export type ServerEntry = { - fetch: (request: Request, opts?: unknown) => Promise | Response + fetch: (request: Request, opts?: unknown) => Promise | Response; }; /** From fb4736e687fa3f66bc772b222e5af93b9bbfa0b2 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Tue, 16 Dec 2025 14:54:26 +0100 Subject: [PATCH 12/19] Origin is now server instead of serverFn --- .../tanstackstart-react/tests/transaction.test.ts | 13 +++++++++---- .../tanstackstart-react/src/server/withSentry.ts | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index f2494cd8dae0..43a48b554f85 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -24,11 +24,12 @@ test('Sends a server function transaction with auto-instrumentation', async ({ p expect.objectContaining({ description: expect.stringContaining('/_serverFn/'), op: 'function.tanstackstart', - origin: 'auto.function.tanstackstart.serverFn', + origin: 'auto.function.tanstackstart.server', data: { 'sentry.op': 'function.tanstackstart', - 'sentry.origin': 'auto.function.tanstackstart.serverFn', + 'sentry.origin': 'auto.function.tanstackstart.server', }, + status: 'ok', }), ]), ); @@ -60,7 +61,11 @@ test('Sends a server function transaction for a nested server function only if i expect.objectContaining({ description: expect.stringContaining('/_serverFn/'), op: 'function.tanstackstart', - origin: 'auto.function.tanstackstart.serverFn', + origin: 'auto.function.tanstackstart.server', + data: { + 'sentry.op': 'function.tanstackstart', + 'sentry.origin': 'auto.function.tanstackstart.server', + }, status: 'ok', }), ]), @@ -80,7 +85,7 @@ test('Sends a server function transaction for a nested server function only if i // Verify that the auto span is the parent of the nested span const autoSpan = transactionEvent?.spans?.find( (span: { op?: string; origin?: string }) => - span.op === 'function.tanstackstart' && span.origin === 'auto.function.tanstackstart.serverFn', + span.op === 'function.tanstackstart' && span.origin === 'auto.function.tanstackstart.server', ); const nestedSpan = transactionEvent?.spans?.find( (span: { description?: string; origin?: string }) => diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index d983b652d43b..7f744cfe4fff 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -42,7 +42,7 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { op: op, name: request.url, attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.serverFn', + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, }, }, From f14b8a31557bcb56fe31929eb9470c06ed7f4d42 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Tue, 16 Dec 2025 15:01:41 +0100 Subject: [PATCH 13/19] Remove async --- packages/tanstackstart-react/src/server/withSentry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 7f744cfe4fff..4f54856bfa15 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -31,7 +31,7 @@ export type ServerEntry = { export function withSentry(serverEntry: ServerEntry): ServerEntry { if (serverEntry.fetch) { serverEntry.fetch = new Proxy(serverEntry.fetch, { - apply: async (target, thisArg, args) => { + apply: (target, thisArg, args) => { const request: Request = args[0]; // instrument server functions From 3a1c4a2abc0b7032b3d57d564af026d45f61ee12 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Tue, 16 Dec 2025 17:19:05 +0100 Subject: [PATCH 14/19] Improve span name: add request method name and use path name instead of full url --- .../tanstackstart-react/tests/transaction.test.ts | 4 ++-- packages/tanstackstart-react/src/server/withSentry.ts | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index 43a48b554f85..7e71104ae8fd 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -22,7 +22,7 @@ test('Sends a server function transaction with auto-instrumentation', async ({ p expect(transactionEvent?.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - description: expect.stringContaining('/_serverFn/'), + description: expect.stringContaining('GET /_serverFn/'), op: 'function.tanstackstart', origin: 'auto.function.tanstackstart.server', data: { @@ -59,7 +59,7 @@ test('Sends a server function transaction for a nested server function only if i expect(transactionEvent?.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - description: expect.stringContaining('/_serverFn/'), + description: expect.stringContaining('GET /_serverFn/'), op: 'function.tanstackstart', origin: 'auto.function.tanstackstart.server', data: { diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 4f54856bfa15..93f49f396a47 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -33,14 +33,16 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { serverEntry.fetch = new Proxy(serverEntry.fetch, { apply: (target, thisArg, args) => { const request: Request = args[0]; + const url = new URL(request.url); + const method = request.method || 'GET'; // instrument server functions - if (request.url?.includes('_serverFn') || request.url?.includes('createServerFn')) { + if (url.pathname.includes('_serverFn') || url.pathname.includes('createServerFn')) { const op = 'function.tanstackstart'; return startSpan( { op: op, - name: request.url, + name: `${method} ${url.pathname}`, attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, From 6eedc35db0a832ce300c2dba4229bd72688d9f7a Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 17 Dec 2025 10:19:52 +0100 Subject: [PATCH 15/19] Add server function sha256 as span attribute --- .../tanstackstart-react/tests/transaction.test.ts | 2 ++ packages/tanstackstart-react/src/server/utils.ts | 13 +++++++++++++ .../tanstackstart-react/src/server/withSentry.ts | 15 +++++++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 packages/tanstackstart-react/src/server/utils.ts diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts index 7e71104ae8fd..d2ebbffb0ec0 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/transaction.test.ts @@ -28,6 +28,7 @@ test('Sends a server function transaction with auto-instrumentation', async ({ p data: { 'sentry.op': 'function.tanstackstart', 'sentry.origin': 'auto.function.tanstackstart.server', + 'tanstackstart.function.hash.sha256': expect.any(String), }, status: 'ok', }), @@ -65,6 +66,7 @@ test('Sends a server function transaction for a nested server function only if i data: { 'sentry.op': 'function.tanstackstart', 'sentry.origin': 'auto.function.tanstackstart.server', + 'tanstackstart.function.hash.sha256': expect.any(String), }, status: 'ok', }), diff --git a/packages/tanstackstart-react/src/server/utils.ts b/packages/tanstackstart-react/src/server/utils.ts new file mode 100644 index 000000000000..1cdb642ca9fd --- /dev/null +++ b/packages/tanstackstart-react/src/server/utils.ts @@ -0,0 +1,13 @@ +/** + * Extracts the SHA-256 hash from a server function pathname. + * Server function pathnames are structured as `/_serverFn/`. + * This function matches the pattern and returns the hash if found. + * + * @param pathname - the pathname of the server function + * @returns the sha256 of the server function + */ +export function extractServerFunctionSha256(pathname: string): string | undefined { + const serverFnMatch = pathname.match(/\/_serverFn\/([a-f0-9]{64})/); + const functionSha256 = serverFnMatch ? serverFnMatch[1] : undefined; + return functionSha256; +} diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 93f49f396a47..96d86244eb1e 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -1,4 +1,5 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/node'; +import { extractServerFunctionSha256 } from './utils'; export type ServerEntry = { fetch: (request: Request, opts?: unknown) => Promise | Response; @@ -38,15 +39,21 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { // instrument server functions if (url.pathname.includes('_serverFn') || url.pathname.includes('createServerFn')) { + const functionSha256 = extractServerFunctionSha256(url.pathname); const op = 'function.tanstackstart'; + + const serverFunctionSpanAttributes = { + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, + 'tanstackstart.function.hash.sha256': functionSha256, + }; + + return startSpan( { op: op, name: `${method} ${url.pathname}`, - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.tanstackstart.server', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, - }, + attributes: serverFunctionSpanAttributes, }, () => { return target.apply(thisArg, args); From 4d9b2cb341fdb981d1e52d28d34c7a2da966edaf Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 17 Dec 2025 10:23:26 +0100 Subject: [PATCH 16/19] yarn fix --- packages/tanstackstart-react/src/server/withSentry.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/withSentry.ts index 96d86244eb1e..5905fdcdd0e1 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/withSentry.ts @@ -48,7 +48,6 @@ export function withSentry(serverEntry: ServerEntry): ServerEntry { 'tanstackstart.function.hash.sha256': functionSha256, }; - return startSpan( { op: op, From 09ba63c712d027d8e9e20594c06b6d80eaaa9577 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 17 Dec 2025 10:36:45 +0100 Subject: [PATCH 17/19] make sha256 extraction more defensive to never be undefined + add unit tests --- .../tanstackstart-react/src/server/utils.ts | 7 ++-- .../test/server/utils.test.ts | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 packages/tanstackstart-react/test/server/utils.test.ts diff --git a/packages/tanstackstart-react/src/server/utils.ts b/packages/tanstackstart-react/src/server/utils.ts index 1cdb642ca9fd..a3ebbd118910 100644 --- a/packages/tanstackstart-react/src/server/utils.ts +++ b/packages/tanstackstart-react/src/server/utils.ts @@ -6,8 +6,7 @@ * @param pathname - the pathname of the server function * @returns the sha256 of the server function */ -export function extractServerFunctionSha256(pathname: string): string | undefined { - const serverFnMatch = pathname.match(/\/_serverFn\/([a-f0-9]{64})/); - const functionSha256 = serverFnMatch ? serverFnMatch[1] : undefined; - return functionSha256; +export function extractServerFunctionSha256(pathname: string): string { + const serverFnMatch = pathname.match(/\/_serverFn\/([a-f0-9]{64})/i); + return serverFnMatch?.[1] ?? 'unknown'; } diff --git a/packages/tanstackstart-react/test/server/utils.test.ts b/packages/tanstackstart-react/test/server/utils.test.ts new file mode 100644 index 000000000000..974c2d22a948 --- /dev/null +++ b/packages/tanstackstart-react/test/server/utils.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from 'vitest'; +import { extractServerFunctionSha256 } from '../../src/server/utils'; + +describe('extractServerFunctionSha256', () => { + it('extracts SHA256 hash from valid server function pathname', () => { + const pathname = '/_serverFn/1ac31c23f613ec7e58631cf789642e2feb86c58e3128324cf00d746474a044bf'; + const result = extractServerFunctionSha256(pathname); + expect(result).toBe('1ac31c23f613ec7e58631cf789642e2feb86c58e3128324cf00d746474a044bf'); + }); + + it('extracts SHA256 hash from valid server function pathname that is a subpath', () => { + const pathname = '/api/_serverFn/1ac31c23f613ec7e58631cf789642e2feb86c58e3128324cf00d746474a044bf'; + const result = extractServerFunctionSha256(pathname); + expect(result).toBe('1ac31c23f613ec7e58631cf789642e2feb86c58e3128324cf00d746474a044bf'); + }); + + it('extracts SHA256 hash from valid server function pathname with query parameters', () => { + const pathname = '/_serverFn/1ac31c23f613ec7e58631cf789642e2feb86c58e3128324cf00d746474a044bf?param=value'; + const result = extractServerFunctionSha256(pathname); + expect(result).toBe('1ac31c23f613ec7e58631cf789642e2feb86c58e3128324cf00d746474a044bf'); + }); + + it('extracts SHA256 hash with uppercase hex characters', () => { + const pathname = '/_serverFn/1AC31C23F613EC7E58631CF789642E2FEB86C58E3128324CF00D746474A044BF'; + const result = extractServerFunctionSha256(pathname); + expect(result).toBe('1AC31C23F613EC7E58631CF789642E2FEB86C58E3128324CF00D746474A044BF'); + }); + + it('returns unknown for pathname without server function pattern', () => { + const pathname = '/api/users/123'; + const result = extractServerFunctionSha256(pathname); + expect(result).toBe('unknown'); + }); + + it('returns unknown for pathname with incomplete hash', () => { + // Hash is too short (only 32 chars instead of 64) + const pathname = '/_serverFn/1ac31c23f613ec7e58631cf789642e2f'; + const result = extractServerFunctionSha256(pathname); + expect(result).toBe('unknown'); + }); +}); + From 9dc3d24f44403de60a9ce14f0686bb290b2c4544 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 17 Dec 2025 10:57:12 +0100 Subject: [PATCH 18/19] yarn fix --- packages/tanstackstart-react/test/server/utils.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tanstackstart-react/test/server/utils.test.ts b/packages/tanstackstart-react/test/server/utils.test.ts index 974c2d22a948..f9dd652bd9b1 100644 --- a/packages/tanstackstart-react/test/server/utils.test.ts +++ b/packages/tanstackstart-react/test/server/utils.test.ts @@ -39,4 +39,3 @@ describe('extractServerFunctionSha256', () => { expect(result).toBe('unknown'); }); }); - From 59a790d2a88f67cad8cd982e8e91381f2aac617c Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 17 Dec 2025 11:07:36 +0100 Subject: [PATCH 19/19] withSentry becomes wrapFetchWithSentry --- .../test-applications/tanstackstart-react/src/server.ts | 4 ++-- packages/tanstackstart-react/src/server/index.ts | 2 +- .../src/server/{withSentry.ts => wrapFetchWithSentry.ts} | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename packages/tanstackstart-react/src/server/{withSentry.ts => wrapFetchWithSentry.ts} (91%) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts index 09256cd65543..b10a3bc1e37b 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/src/server.ts @@ -1,9 +1,9 @@ -import { withSentry } from '@sentry/tanstackstart-react'; +import { wrapFetchWithSentry } from '@sentry/tanstackstart-react'; import handler, { createServerEntry } from '@tanstack/react-start/server-entry'; import type { ServerEntry } from '@tanstack/react-start/server-entry'; -const requestHandler: ServerEntry = withSentry({ +const requestHandler: ServerEntry = wrapFetchWithSentry({ fetch(request: Request) { return handler.fetch(request); }, diff --git a/packages/tanstackstart-react/src/server/index.ts b/packages/tanstackstart-react/src/server/index.ts index 895722f1cd09..299f1cd85ea9 100644 --- a/packages/tanstackstart-react/src/server/index.ts +++ b/packages/tanstackstart-react/src/server/index.ts @@ -4,7 +4,7 @@ export * from '@sentry/node'; export { init } from './sdk'; -export { withSentry } from './withSentry'; +export { wrapFetchWithSentry } from './wrapFetchWithSentry'; /** * A passthrough error boundary for the server that doesn't depend on any react. Error boundaries don't catch SSR errors diff --git a/packages/tanstackstart-react/src/server/withSentry.ts b/packages/tanstackstart-react/src/server/wrapFetchWithSentry.ts similarity index 91% rename from packages/tanstackstart-react/src/server/withSentry.ts rename to packages/tanstackstart-react/src/server/wrapFetchWithSentry.ts index 5905fdcdd0e1..22d218ef0b48 100644 --- a/packages/tanstackstart-react/src/server/withSentry.ts +++ b/packages/tanstackstart-react/src/server/wrapFetchWithSentry.ts @@ -12,12 +12,12 @@ export type ServerEntry = { * * @example * ```ts - * import { withSentry } from '@sentry/tanstackstart-react'; + * import { wrapFetchWithSentry } from '@sentry/tanstackstart-react'; * * import handler, { createServerEntry } from '@tanstack/react-start/server-entry'; * import type { ServerEntry } from '@tanstack/react-start/server-entry'; * - * const requestHandler: ServerEntry = withSentry({ + * const requestHandler: ServerEntry = wrapFetchWithSentry({ * fetch(request: Request) { * return handler.fetch(request); * }, @@ -29,7 +29,7 @@ export type ServerEntry = { * @param serverEntry - request handler to wrap * @returns - wrapped request handler */ -export function withSentry(serverEntry: ServerEntry): ServerEntry { +export function wrapFetchWithSentry(serverEntry: ServerEntry): ServerEntry { if (serverEntry.fetch) { serverEntry.fetch = new Proxy(serverEntry.fetch, { apply: (target, thisArg, args) => {