From ccfa2a4f9fdbce1c19dca9d547f6fb960e6884d5 Mon Sep 17 00:00:00 2001 From: k-fish Date: Fri, 9 Jul 2021 11:17:23 -0400 Subject: [PATCH] fix(ember): Fix runtime config options not being merged Runtime options can be ignored in production mode because of @embroider macros differs between dev and production. Instead of relying on the config object reference being provided, we'll use a global instead to hold on to the merged config between the init call and the performance initializer code. --- packages/ember/addon/index.ts | 31 +++++++++++++------ .../sentry-performance.ts | 10 ++++-- packages/ember/addon/types.ts | 4 +++ 3 files changed, 32 insertions(+), 13 deletions(-) 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']; +};