Skip to content

fix(ember): Ensure browser tracing is correctly lazy loaded #11027

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 11, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 26 additions & 11 deletions packages/ember/addon/instance-initializers/sentry-performance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,21 @@ import type RouterService from '@ember/routing/router-service';
import { _backburner, run, scheduleOnce } from '@ember/runloop';
import type { EmberRunQueues } from '@ember/runloop/-private/types';
import { getOwnConfig, isTesting, macroCondition } from '@embroider/macros';
import type { ExtendedBackburner } from '@sentry/ember/runloop';
import type { Span } from '@sentry/types';
import { GLOBAL_OBJ, browserPerformanceTimeOrigin, timestampInSeconds } from '@sentry/utils';

import type { BrowserClient } from '@sentry/browser';
import type {
BrowserClient,
startBrowserTracingNavigationSpan as startBrowserTracingNavigationSpanType,
startBrowserTracingPageLoadSpan as startBrowserTracingPageLoadSpanType,
} from '@sentry/browser';
import {
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
getActiveSpan,
getClient,
startBrowserTracingNavigationSpan,
startBrowserTracingPageLoadSpan,
startInactiveSpan,
} from '@sentry/browser';
import type { ExtendedBackburner } from '@sentry/ember/runloop';
import type { Span } from '@sentry/types';
import { GLOBAL_OBJ, browserPerformanceTimeOrigin, timestampInSeconds } from '@sentry/utils';
import type { EmberRouterMain, EmberSentryConfig, GlobalConfig, OwnConfig } from '../types';

function getSentryConfig(): EmberSentryConfig {
Expand Down Expand Up @@ -99,6 +100,8 @@ export function _instrumentEmberRouter(
routerService: RouterService,
routerMain: EmberRouterMain,
config: EmberSentryConfig,
startBrowserTracingPageLoadSpan: typeof startBrowserTracingPageLoadSpanType,
startBrowserTracingNavigationSpan: typeof startBrowserTracingNavigationSpanType,
): void {
const { disableRunloopPerformance } = config;
const location = routerMain.location;
Expand Down Expand Up @@ -424,7 +427,8 @@ export async function instrumentForPerformance(appInstance: ApplicationInstance)
// Maintaining backwards compatibility with config.browserTracingOptions, but passing it with Sentry options is preferred.
const browserTracingOptions = config.browserTracingOptions || config.sentry.browserTracingOptions || {};

const { browserTracingIntegration } = await import('@sentry/browser');
const { browserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan } =
await import('@sentry/browser');

const idleTimeout = config.transitionTimeout || 5000;

Expand All @@ -444,7 +448,7 @@ export async function instrumentForPerformance(appInstance: ApplicationInstance)
}

// We _always_ call this, as it triggers the page load & navigation spans
_instrumentNavigation(appInstance, config);
_instrumentNavigation(appInstance, config, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan);

// Skip instrumenting the stuff below again in tests, as these are not reset between tests
if (isAlreadyInitialized) {
Expand All @@ -456,7 +460,12 @@ export async function instrumentForPerformance(appInstance: ApplicationInstance)
_instrumentInitialLoad(config);
}

function _instrumentNavigation(appInstance: ApplicationInstance, config: EmberSentryConfig): void {
function _instrumentNavigation(
appInstance: ApplicationInstance,
config: EmberSentryConfig,
startBrowserTracingPageLoadSpan: typeof startBrowserTracingPageLoadSpanType,
startBrowserTracingNavigationSpan: typeof startBrowserTracingNavigationSpanType,
): void {
// eslint-disable-next-line ember/no-private-routing-service
const routerMain = appInstance.lookup('router:main') as EmberRouterMain;
let routerService = appInstance.lookup('service:router') as RouterService & {
Expand All @@ -478,7 +487,13 @@ function _instrumentNavigation(appInstance: ApplicationInstance, config: EmberSe
}

routerService._hasMountedSentryPerformanceRouting = true;
_instrumentEmberRouter(routerService, routerMain, config);
_instrumentEmberRouter(
routerService,
routerMain,
config,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);
}

export default {
Expand Down