diff --git a/packages/ember/addon/index.ts b/packages/ember/addon/index.ts index 76248bf7a219..388d5dd1ab4e 100644 --- a/packages/ember/addon/index.ts +++ b/packages/ember/addon/index.ts @@ -5,26 +5,33 @@ import { next } from '@ember/runloop'; import { assert, warn } from '@ember/debug'; import Ember from 'ember'; import { timestampWithMs } from '@sentry/utils'; -import { OwnConfig } from './types'; +import { GlobalConfig, OwnConfig } from './types'; +import { getGlobalObject } from '@sentry/utils'; declare module '@ember/debug' { export function assert(desc: string, test: unknown): void; } +function _getSentryInitConfig() { + const _global = getGlobalObject(); + _global.__sentryEmberConfig = _global.__sentryEmberConfig ?? {}; + return _global.__sentryEmberConfig; +} + export function InitSentryForEmber(_runtimeConfig: BrowserOptions | undefined) { - const config = getOwnConfig().sentryConfig; + const environmentConfig = getOwnConfig().sentryConfig; - assert('Missing configuration.', config); - assert('Missing configuration for Sentry.', config.sentry || _runtimeConfig); + assert('Missing configuration.', environmentConfig); + assert('Missing configuration for Sentry.', environmentConfig.sentry || _runtimeConfig); - if (!config.sentry) { + if (!environmentConfig.sentry) { // If environment config is not specified but the above assertion passes, use runtime config. - config.sentry = { ..._runtimeConfig } as any; + environmentConfig.sentry = { ..._runtimeConfig } as any; } - // Permanently merge options into config, preferring runtime config - Object.assign(config.sentry, _runtimeConfig || {}); - const initConfig = Object.assign({}, config.sentry); + // Merge runtime config into environment config, preferring runtime. + Object.assign(environmentConfig.sentry, _runtimeConfig || {}); + const initConfig = Object.assign({}, environmentConfig.sentry); initConfig._metadata = initConfig._metadata || {}; initConfig._metadata.sdk = { @@ -38,10 +45,14 @@ export function InitSentryForEmber(_runtimeConfig: BrowserOptions | undefined) { version: SDK_VERSION, }; + // Persist Sentry init options so they are identical when performance initializers call init again. + const sentryInitConfig = _getSentryInitConfig(); + Object.assign(sentryInitConfig, initConfig); + Sentry.init(initConfig); if (macroCondition(isDevelopingApp())) { - if (config.ignoreEmberOnErrorWarning) { + if (environmentConfig.ignoreEmberOnErrorWarning) { return; } next(null, function() { diff --git a/packages/ember/addon/instance-initializers/sentry-performance.ts b/packages/ember/addon/instance-initializers/sentry-performance.ts index 36b6c705d6dd..9c36b158c886 100644 --- a/packages/ember/addon/instance-initializers/sentry-performance.ts +++ b/packages/ember/addon/instance-initializers/sentry-performance.ts @@ -5,12 +5,16 @@ import * as Sentry from '@sentry/browser'; import { Span, Transaction, Integration } from '@sentry/types'; import { EmberRunQueues } from '@ember/runloop/-private/types'; import { getActiveTransaction } from '..'; -import { browserPerformanceTimeOrigin, timestampWithMs } from '@sentry/utils'; +import { browserPerformanceTimeOrigin, getGlobalObject, timestampWithMs } from '@sentry/utils'; import { macroCondition, isTesting, getOwnConfig } from '@embroider/macros'; -import { EmberSentryConfig, OwnConfig } from '../types'; +import { EmberSentryConfig, GlobalConfig, OwnConfig } from '../types'; function getSentryConfig() { - return getOwnConfig().sentryConfig; + const _global = getGlobalObject(); + _global.__sentryEmberConfig = _global.__sentryEmberConfig ?? {}; + const environmentConfig = getOwnConfig().sentryConfig; + Object.assign(environmentConfig.sentry, _global.__sentryEmberConfig); + return environmentConfig; } export function initialize(appInstance: ApplicationInstance): void { diff --git a/packages/ember/addon/types.ts b/packages/ember/addon/types.ts index 7aa20d00af4a..7490bb2d8129 100644 --- a/packages/ember/addon/types.ts +++ b/packages/ember/addon/types.ts @@ -18,3 +18,7 @@ export type EmberSentryConfig = { export type OwnConfig = { sentryConfig: EmberSentryConfig; }; + +export type GlobalConfig = { + __sentryEmberConfig: EmberSentryConfig['sentry']; +};