diff --git a/packages/nextjs/src/client/index.ts b/packages/nextjs/src/client/index.ts index c2d512b3ef00..27eb57858e40 100644 --- a/packages/nextjs/src/client/index.ts +++ b/packages/nextjs/src/client/index.ts @@ -4,6 +4,7 @@ import { configureScope, init as reactInit, Integrations } from '@sentry/react'; import { BrowserTracing, defaultRequestInstrumentationOptions, hasTracingEnabled } from '@sentry/tracing'; import type { EventProcessor } from '@sentry/types'; +import { getVercelEnv } from '../common/getVercelEnv'; import { buildMetadata } from '../common/metadata'; import { addOrUpdateIntegration } from '../common/userIntegrations'; import { nextRouterInstrumentation } from './performance'; @@ -38,7 +39,9 @@ const globalWithInjectedValues = global as typeof global & { export function init(options: BrowserOptions): void { applyTunnelRouteOption(options); buildMetadata(options, ['nextjs', 'react']); - options.environment = options.environment || process.env.NODE_ENV; + + options.environment = options.environment || getVercelEnv(true) || process.env.NODE_ENV; + addClientIntegrations(options); reactInit(options); diff --git a/packages/nextjs/src/common/getVercelEnv.ts b/packages/nextjs/src/common/getVercelEnv.ts new file mode 100644 index 000000000000..98755c91409d --- /dev/null +++ b/packages/nextjs/src/common/getVercelEnv.ts @@ -0,0 +1,9 @@ +/** + * Returns an environment setting value determined by Vercel's `VERCEL_ENV` environment variable. + * + * @param isClient Flag to indicate whether to use the `NEXT_PUBLIC_` prefixed version of the environment variable. + */ +export function getVercelEnv(isClient: boolean): string | undefined { + const vercelEnvVar = isClient ? process.env.NEXT_PUBLIC_VERCEL_ENV : process.env.VERCEL_ENV; + return vercelEnvVar ? `vercel-${vercelEnvVar}` : undefined; +} diff --git a/packages/nextjs/src/edge/index.ts b/packages/nextjs/src/edge/index.ts index 9bfd7046474f..087e0a1482d5 100644 --- a/packages/nextjs/src/edge/index.ts +++ b/packages/nextjs/src/edge/index.ts @@ -10,6 +10,7 @@ import { stackParserFromStackParserOptions, } from '@sentry/utils'; +import { getVercelEnv } from '../common/getVercelEnv'; import { EdgeClient } from './edgeclient'; import { makeEdgeTransport } from './transport'; @@ -46,9 +47,8 @@ export function init(options: EdgeOptions = {}): void { } } - if (options.environment === undefined && process.env.SENTRY_ENVIRONMENT) { - options.environment = process.env.SENTRY_ENVIRONMENT; - } + options.environment = + options.environment || process.env.SENTRY_ENVIRONMENT || getVercelEnv(false) || process.env.NODE_ENV; if (options.autoSessionTracking === undefined && options.dsn !== undefined) { options.autoSessionTracking = true; diff --git a/packages/nextjs/src/server/index.ts b/packages/nextjs/src/server/index.ts index 9afdedd9ae91..b27d07d11733 100644 --- a/packages/nextjs/src/server/index.ts +++ b/packages/nextjs/src/server/index.ts @@ -9,6 +9,7 @@ import { escapeStringForRegex, logger } from '@sentry/utils'; import * as domainModule from 'domain'; import * as path from 'path'; +import { getVercelEnv } from '../common/getVercelEnv'; import { buildMetadata } from '../common/metadata'; import type { IntegrationWithExclusionOption } from '../common/userIntegrations'; import { addOrUpdateIntegration } from '../common/userIntegrations'; @@ -79,7 +80,10 @@ export function init(options: NodeOptions): void { } buildMetadata(options, ['nextjs', 'node']); - options.environment = options.environment || process.env.NODE_ENV; + + options.environment = + options.environment || process.env.SENTRY_ENVIRONMENT || getVercelEnv(false) || process.env.NODE_ENV; + addServerIntegrations(options); // Right now we only capture frontend sessions for Next.js options.autoSessionTracking = false;