diff --git a/docs/02-app/02-api-reference/02-file-conventions/instrumentation.mdx b/docs/02-app/02-api-reference/02-file-conventions/instrumentation.mdx index 1714b40652fdb2..2c64b0c2e2cc5a 100644 --- a/docs/02-app/02-api-reference/02-file-conventions/instrumentation.mdx +++ b/docs/02-app/02-api-reference/02-file-conventions/instrumentation.mdx @@ -110,7 +110,7 @@ The function accepts three parameters: `error`, `request`, and `context`. export function onRequestError( error: { digest: string } & Error, request: { - url: string // full URL + path: string // resource path, e.g. /blog?name=foo method: string // request method. e.g. GET, POST, etc headers: { [key: string]: string } }, diff --git a/packages/next/src/build/templates/middleware.ts b/packages/next/src/build/templates/middleware.ts index b86e976970f2f5..43eb1862916d9a 100644 --- a/packages/next/src/build/templates/middleware.ts +++ b/packages/next/src/build/templates/middleware.ts @@ -27,10 +27,12 @@ function errorHandledHandler(fn: AdapterOptions['handler']) { return await fn(...args) } catch (err) { const req = args[0] + const url = new URL(req.url) + const resource = url.pathname + url.search await edgeInstrumentationOnRequestError( err, { - url: req.url, + path: resource, method: req.method, headers: Object.fromEntries(req.headers.entries()), }, diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts index a4fca462b9e0c7..3bf81ca9430394 100644 --- a/packages/next/src/server/base-server.ts +++ b/packages/next/src/server/base-server.ts @@ -843,7 +843,7 @@ export default abstract class Server< await this.instrumentation.onRequestError?.( err, { - url: req.url || '', + path: req.url || '', method: req.method || 'GET', // Normalize middleware headers and other server request headers headers: diff --git a/packages/next/src/server/instrumentation/types.ts b/packages/next/src/server/instrumentation/types.ts index 1c260cf79fb4e7..51b1917a94b308 100644 --- a/packages/next/src/server/instrumentation/types.ts +++ b/packages/next/src/server/instrumentation/types.ts @@ -12,8 +12,8 @@ export type RequestErrorContext = { export type InstrumentationOnRequestError = ( error: unknown, errorRequest: Readonly<{ + path: string method: string - url: string headers: NodeJS.Dict }>, errorContext: Readonly diff --git a/test/e2e/on-request-error/basic/basic.test.ts b/test/e2e/on-request-error/basic/basic.test.ts index 0af57ce7077a95..7637fcad2da12e 100644 --- a/test/e2e/on-request-error/basic/basic.test.ts +++ b/test/e2e/on-request-error/basic/basic.test.ts @@ -18,12 +18,10 @@ describe('on-request-error - basic', () => { errorMessage, url, renderSource, - isMiddleware = false, }: { errorMessage: string url: string renderSource: string | undefined - isMiddleware?: boolean }) { // Assert the instrumentation is called await retry(async () => { @@ -40,14 +38,8 @@ describe('on-request-error - basic', () => { const { payload } = record const { request } = payload - if (isMiddleware) { - // For middleware, the URL is absolute url with host - expect(request.url).toMatch(/^http:\/\//) - expect(request.url).toMatch(url) - } else { - expect(request.url).toBe(url) - } + expect(request.path).toBe(url) expect(record).toMatchObject({ count: 1, payload: { @@ -164,7 +156,6 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ errorMessage: 'middleware-error', url: '/middleware-error', - isMiddleware: true, renderSource: undefined, }) }) diff --git a/test/e2e/on-request-error/dynamic-routes/dynamic-routes.test.ts b/test/e2e/on-request-error/dynamic-routes/dynamic-routes.test.ts index a4983de82ea10f..f03ba1c367f64a 100644 --- a/test/e2e/on-request-error/dynamic-routes/dynamic-routes.test.ts +++ b/test/e2e/on-request-error/dynamic-routes/dynamic-routes.test.ts @@ -45,7 +45,7 @@ describe('on-request-error - dynamic-routes', () => { payload: { message: 'server-dynamic-page-node-error', request: { - url: '/app-page/dynamic/123?apple=dope', + path: '/app-page/dynamic/123?apple=dope', }, context: { routerKind: 'App Router', @@ -65,7 +65,7 @@ describe('on-request-error - dynamic-routes', () => { payload: { message: 'server-dynamic-route-node-error', request: { - url: '/app-route/dynamic/123?apple=dope', + path: '/app-route/dynamic/123?apple=dope', }, context: { routerKind: 'App Router', @@ -86,7 +86,7 @@ describe('on-request-error - dynamic-routes', () => { payload: { message: 'server-suspense-page-node-error', request: { - url: '/app-page/suspense', + path: '/app-page/suspense', }, context: { routerKind: 'App Router', @@ -109,7 +109,7 @@ describe('on-request-error - dynamic-routes', () => { payload: { message: 'pages-page-node-error', request: { - url: '/pages-page/dynamic/123?apple=dope', + path: '/pages-page/dynamic/123?apple=dope', }, context: { routerKind: 'Pages Router', @@ -130,7 +130,7 @@ describe('on-request-error - dynamic-routes', () => { payload: { message: 'pages-api-node-error', request: { - url: '/api/dynamic/123?apple=dope', + path: '/api/dynamic/123?apple=dope', }, context: { routerKind: 'Pages Router', diff --git a/test/e2e/on-request-error/server-action-error/server-action-error.test.ts b/test/e2e/on-request-error/server-action-error/server-action-error.test.ts index 33f45afa9e652f..d35c4b7b05d0b2 100644 --- a/test/e2e/on-request-error/server-action-error/server-action-error.test.ts +++ b/test/e2e/on-request-error/server-action-error/server-action-error.test.ts @@ -40,7 +40,7 @@ describe('on-request-error - server-action-error', () => { payload: { message: errorMessage, request: { - url, + path: url, method: 'POST', headers: expect.objectContaining({ accept: 'text/x-component',