-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Is there an existing issue for this?
- I have checked for existing issues https://github.com/getsentry/sentry-javascript/issues
- I have reviewed the documentation https://docs.sentry.io/
- I am using the latest SDK release https://github.com/getsentry/sentry-javascript/releases
How do you use Sentry?
Sentry Saas (sentry.io)
Which SDK are you using?
@sentry/nextjs
SDK Version
9.5.0
Framework Version
Link to Sentry event
No response
Reproduction Example/SDK Setup
Sentry.init({
dsn: process.env["SENTRY_DSN"] ?? "",
enabled: Boolean(process.env["SENTRY_DSN"]),
});
Steps to Reproduce
-
Create a Next.js app
-
Open
next.config.ts
and configurepageExtensions
(e.g.pageExtensions: ["page.tsx", "handler.ts"]
) -
Create
instrumentation.handler.ts
orsrc/instrumentation.handler.ts
(if.handler.
suffix is specified, the file is ignored by Next.js) -
Init and configure Sentry
-
Run
pnpm dev --turbopack=false
Expected Result
No warnings (because Turbopack is off)
Actual Result
A false-positive warning:
[@sentry/nextjs] Could not find a Next.js instrumentation file. This indicates an incomplete configuration
of the Sentry SDK. An instrumentation file is required for the Sentry SDK to be initialized on the server:
https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#create-initialization-config-files
(you can suppress this warning by setting SENTRY_SUPPRESS_INSTRUMENTATION_FILE_WARNING=1
as environment variable)
Additional context
The bug originates from #15488:
sentry-javascript/packages/nextjs/src/config/webpack.ts
Lines 452 to 499 in 48ed271
function warnAboutMissingOnRequestErrorHandler(projectDir: string): void { | |
const instrumentationPaths = [ | |
['src', 'instrumentation.ts'], | |
['src', 'instrumentation.js'], | |
['instrumentation.ts'], | |
['instrumentation.js'], | |
]; | |
const instrumentationFile = instrumentationPaths | |
.map(pathSegments => path.resolve(projectDir, ...pathSegments)) | |
.find(function exists(filePath: string): string | null { | |
try { | |
fs.accessSync(filePath, fs.constants.F_OK); | |
return filePath; | |
} catch (error) { | |
return null; | |
} | |
}); | |
function hasOnRequestErrorHandler(absolutePath: string): boolean { | |
try { | |
const content = fs.readFileSync(absolutePath, 'utf8'); | |
return content.includes('onRequestError'); | |
} catch (error) { | |
return false; | |
} | |
} | |
if (!instrumentationFile) { | |
if (!process.env.SENTRY_SUPPRESS_INSTRUMENTATION_FILE_WARNING) { | |
// eslint-disable-next-line no-console | |
console.warn( | |
chalk.yellow( | |
'[@sentry/nextjs] Could not find a Next.js instrumentation file. This indicates an incomplete configuration of the Sentry SDK. An instrumentation file is required for the Sentry SDK to be initialized on the server: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#create-initialization-config-files (you can suppress this warning by setting SENTRY_SUPPRESS_INSTRUMENTATION_FILE_WARNING=1 as environment variable)', | |
), | |
); | |
} | |
return; | |
} | |
if (!hasOnRequestErrorHandler(instrumentationFile)) { | |
// eslint-disable-next-line no-console | |
console.warn( | |
chalk.yellow( | |
'[@sentry/nextjs] Could not find `onRequestError` hook in instrumentation file. This indicates outdated configuration of the Sentry SDK. Use `Sentry.captureRequestError` to instrument the `onRequestError` hook: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#errors-from-nested-react-server-components', | |
), | |
); | |
} | |
} |
↑ The list of paths for instrumentation files is hard-coded so custom page extensions are not respected. It seems that the warning does not affect the actual runtime, but I’m not 100% about this.
Good news is that page extensions are already resolved in this file:
sentry-javascript/packages/nextjs/src/config/webpack.ts
Lines 113 to 115 in 48ed271
// Default page extensions per https://github.com/vercel/next.js/blob/f1dbc9260d48c7995f6c52f8fbcc65f08e627992/packages/next/server/config-shared.ts#L161 | |
const pageExtensions = userNextConfig.pageExtensions || ['tsx', 'ts', 'jsx', 'js']; | |
const dotPrefixedPageExtensions = pageExtensions.map(ext => `.${ext}`); |
Metadata
Metadata
Assignees
Labels
Type
Projects
Status