Skip to content

False positive in "Could not find a Next.js instrumentation file" (when pageExtensions are used in Next) #15652

Closed
@kachkaev

Description

@kachkaev

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/nextjs

SDK Version

9.5.0

Framework Version

[email protected]

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

  1. Create a Next.js app

  2. Open next.config.ts and configure pageExtensions (e.g. pageExtensions: ["page.tsx", "handler.ts"])

  3. Create instrumentation.handler.ts or src/instrumentation.handler.ts (if .handler. suffix is specified, the file is ignored by Next.js)

  4. Init and configure Sentry

  5. 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:

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:

// 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

No one assigned

    Labels

    Package: nextjsIssues related to the Sentry Nextjs SDK

    Type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions