From 0a11c45065627e64d5c5c1a402f07dcf8fac3a61 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Wed, 20 Aug 2025 09:27:51 +0200 Subject: [PATCH] perf: Only run Sentry in production (#23167) * Only run Sentry in production * Only run Sentry in production for instrumentation-client --------- Co-authored-by: Keith Williams --- apps/web/instrumentation-client.ts | 72 ++++++++++++++++-------------- apps/web/instrumentation.ts | 23 +++++++--- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/apps/web/instrumentation-client.ts b/apps/web/instrumentation-client.ts index 5236834ace..1743d3615b 100644 --- a/apps/web/instrumentation-client.ts +++ b/apps/web/instrumentation-client.ts @@ -3,42 +3,48 @@ // https://docs.sentry.io/platforms/javascript/guides/nextjs/ import * as Sentry from "@sentry/nextjs"; -Sentry.init({ - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN_CLIENT, +if (process.env.NODE_ENV === "production") { + Sentry.init({ + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN_CLIENT, - sampleRate: parseFloat(process.env.SENTRY_SAMPLE_RATE ?? "1.0") || 1.0, - // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control. - tracesSampleRate: parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE ?? "0.0") || 0.0, + sampleRate: parseFloat(process.env.SENTRY_SAMPLE_RATE ?? "1.0") || 1.0, + // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control. + tracesSampleRate: parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE ?? "0.0") || 0.0, - // Define how likely Replay events are sampled. - // This sets the sample rate to be 10%. You may want this to be 100% while - // in development and sample at a lower rate in production - // replaysSessionSampleRate: parseFloat(process.env.SENTRY_REPLAYS_SESSION_SAMPLE_RATE ?? "0.0") || 0.0, + // Define how likely Replay events are sampled. + // This sets the sample rate to be 10%. You may want this to be 100% while + // in development and sample at a lower rate in production + // replaysSessionSampleRate: parseFloat(process.env.SENTRY_REPLAYS_SESSION_SAMPLE_RATE ?? "0.0") || 0.0, - // Define how likely Replay events are sampled when an error occurs. - // replaysOnErrorSampleRate: parseFloat(process.env.SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE ?? "0.0") || 0.0, + // Define how likely Replay events are sampled when an error occurs. + // replaysOnErrorSampleRate: parseFloat(process.env.SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE ?? "0.0") || 0.0, - // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: !!process.env.SENTRY_DEBUG, - beforeSend(event) { - if ( - event.exception?.values?.some( - (e) => - // Ignore fake error "UnhandledRejection: Non-Error promise rejection captured with value: Object Not Found Matching Id:3, MethodName:update, ParamCount:4" - // Raised GH issue: https://github.com/getsentry/sentry-javascript/issues/3440 - e.value?.includes("Non-Error promise rejection captured with") || - e.value?.includes("Object Not Found Matching Id") - ) - ) { - return null; - } + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: !!process.env.SENTRY_DEBUG, + beforeSend(event) { + if ( + event.exception?.values?.some( + (e) => + // Ignore fake error "UnhandledRejection: Non-Error promise rejection captured with value: Object Not Found Matching Id:3, MethodName:update, ParamCount:4" + // Raised GH issue: https://github.com/getsentry/sentry-javascript/issues/3440 + e.value?.includes("Non-Error promise rejection captured with") || + e.value?.includes("Object Not Found Matching Id") + ) + ) { + return null; + } - event.tags = { - ...event.tags, - errorSource: "client", - }; - return event; - }, -}); + event.tags = { + ...event.tags, + errorSource: "client", + }; + return event; + }, + }); +} -export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; +export function onRouterTransitionStart(url: string, navigationType: "push" | "replace" | "traverse") { + if (process.env.NODE_ENV === "production") { + Sentry.captureRouterTransitionStart(url, navigationType); + } +} diff --git a/apps/web/instrumentation.ts b/apps/web/instrumentation.ts index fc315874de..f13161b6cc 100644 --- a/apps/web/instrumentation.ts +++ b/apps/web/instrumentation.ts @@ -1,13 +1,22 @@ +import { type Instrumentation } from 'next' + import * as Sentry from "@sentry/nextjs"; export async function register() { - if (process.env.NEXT_PUBLIC_SENTRY_DSN && process.env.NEXT_RUNTIME === "nodejs") { - await import("./sentry.server.config"); - } - - if (process.env.NEXT_PUBLIC_SENTRY_DSN && process.env.NEXT_RUNTIME === "edge") { - await import("./sentry.edge.config"); + if (process.env.NODE_ENV === "production") { + if (process.env.NEXT_PUBLIC_SENTRY_DSN && process.env.NEXT_RUNTIME === "nodejs") { + await import("./sentry.server.config"); + } + if (process.env.NEXT_PUBLIC_SENTRY_DSN && process.env.NEXT_RUNTIME === "edge") { + await import("./sentry.edge.config"); + } } } -export const onRequestError = Sentry.captureRequestError; +export const onRequestError: Instrumentation.onRequestError = ( err, + request, + context) => { + if (process.env.NODE_ENV === "production") { + Sentry.captureRequestError(err, request, context); + } +};