feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(ember)!: Update to v2 addon format - #23252

Merged
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased
Aug 12, 2026
Merged

feat(ember)!: Update to v2 addon format#23252
mydea merged 14 commits into
developfrom
feat/ember-v2-format-rebased

Conversation

@mydea

Copy link
Copy Markdown
Member

Rebased continuation of #19229 (original author @aklkv) onto current develop, with merge conflicts resolved and the failing tests fixed.

Migrates @sentry/ember from the legacy v1 addon format to the Ember v2 addon format, so the package works with both classic Ember builds and Embroider-optimized builds and no longer depends on @embroider/macros at runtime. See #19229 for the full description of the migration.

Why a new branch

The original PR was ~1900 commits behind develop and conflicting. Rather than resolve the same conflicts twice across its two commits, I squashed them into one and rebased against the final state once.

The subtle part: the migration renamed packages/ember/addon/src/. Git therefore saw develop's later behavioral changes to those files as edits to deleted files and did not surface them as conflicts. Several develop-side changes had to be ported into the new src/ files by hand:

Build/tooling reconciliation

  • Re-added the nested typescript: ~5.8.0 devDependency pin. develop upgraded to TypeScript 7 (the native compiler, which drops typescript/lib/tsc), and glint's declaration build needs the classic JS compiler — the same stop-gap develop already applies to ember (see chore(v11): Upgrade to TypeScript 7.0 #19435). Without the pin the declaration build fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
  • Bumped @sentry/browser / @sentry/core from the PR's stale 10.53.1 to 10.67.0 and added @sentry/conventions (now imported by the ported instrumentation).
  • Removed the PR's import/no-unresolved oxlint rule (doesn't exist in this repo's oxlint 1.75) and wrapped URL_FULL in filterCollectedUrl() for the sdk/no-unfiltered-url-attributes rule, which now applies since the code lives under src/**.

Test fixes

The originally-failing tests came down to three things:

  • Span-op port above — fixed the captures correct spans for navigation assertions.
  • Missing traceLifecycle: 'static' in the two new e2e apps (ember-strict-resolver, ember-vite). develop made span-streaming the default and disables it in the ember test apps (test: Disable span streaming in remaining tests #22588); the new apps predated that, so their performance tests hung waiting for transaction events that never arrived under streaming.
  • Stale assertions in ember-strict-resolver's sentry-performance.test.ts, updated from the old ui.ember.* op schema to the new router / function / ui.task ops.

All four ember e2e apps pass (ember-classic 6/6, ember-embroider 6/6, ember-strict-resolver 10/10, ember-vite 5/5), along with the ember unit tests, lint, and build.

Supersedes #19229.

@mydeamydea mentioned this pull request Aug 11, 2026
3 tasks
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
const globalsPerformanceConfig = {
disableRunloopPerformance: options.disableRunloopPerformance ?? false,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration,
minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idle timeout default dropped

Medium Severity

The Ember integration no longer sets idleTimeout to 5000. It now inherits the browser default of 1000ms. Quiet stretches during a transition (for example a slow model hook without child spans) can finish the navigation/pageload span early, truncating Ember route timing that previously waited up to 5 seconds.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 1f20412. Configure here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems fine

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch 3 times, most recently from 4b990e8 to 4dcd6deCompareAugust 11, 2026 08:53
Comment threadpackages/ember/src/utils/instrumentEmberGlobals.ts Outdated
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser30.29 kB--
@sentry/browser - with treeshaking flags28.47 kB--
@sentry/browser - with treeshaking flags tracing without tracing26.81 kB--
@sentry/browser (incl. Tracing)48.53 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.55 kB--
@sentry/browser (incl. Tracing, Profiling)51.43 kB--
@sentry/browser (incl. Tracing, Replay)87.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags77.34 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)92.64 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)105.34 kB--
@sentry/browser (incl. Feedback)47.62 kB--
@sentry/browser (incl. sendFeedback)35.12 kB--
@sentry/browser (incl. FeedbackAsync)40.27 kB--
@sentry/browser (incl. Metrics)31.28 kB--
@sentry/browser (incl. Logs)31.54 kB--
@sentry/browser (incl. Metrics & Logs)32.21 kB--
@sentry/react32.09 kB--
@sentry/react (incl. Tracing)50.72 kB--
@sentry/vue35.3 kB--
@sentry/vue (incl. Tracing)50.48 kB--
@sentry/svelte30.31 kB--
CDN Bundle31.6 kB--
CDN Bundle (incl. Tracing)48.85 kB--
CDN Bundle (incl. Logs, Metrics)33.82 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)50.81 kB--
CDN Bundle (incl. Replay, Logs, Metrics)74.35 kB--
CDN Bundle (incl. Tracing, Replay)86.44 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)88.31 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)92.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)94.13 kB--
CDN Bundle - uncompressed93.83 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed100.23 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed152.45 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed229.17 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.92 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed271.7 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.62 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed285.39 kB--
@sentry/nextjs (client)53.27 kB--
@sentry/sveltekit (client)48.94 kB--
@sentry/core/server65.41 kB--
@sentry/core/browser51.77 kB--
@sentry/node117.95 kB-0.01%-1 B 🔽
@sentry/node/import (ESM hook with diagnostics-channel injection)0 Baddedadded
@sentry/node - without tracing82.05 kB-0.01%-2 B 🔽
@sentry/aws-serverless91.45 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified213.88 kB--
@sentry/cloudflare (withSentry)528.3 kB--

View base workflow run

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 4dcd6de to 6884073CompareAugust 11, 2026 09:15
Comment threadyarn.lock

"@babel/plugin-transform-runtime@7.18.10", "@babel/plugin-transform-runtime@^7.13.9":
"@babel/plugin-transform-runtime@7.18.10":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical severity vulnerability may affect your project—review required:
Line 2594 lists a dependency (@babel/plugin-transform-runtime) with a known Critical severity vulnerability.

ℹ️ Why this matters

Affected versions of @babel/traverse and babel-traverse are vulnerable to Incomplete List of Disallowed Inputs / Incorrect Comparison. Compiling untrusted code with Babel using plugins that invoke the internal path.evaluate() or path.evaluateTruthy() methods (for example @babel/plugin-transform-runtime, @babel/preset-env with useBuiltIns, or any polyfill‐provider plugin) allows a maliciously crafted AST to execute arbitrary code on the build machine during compilation.

References: GHSA, CVE

To resolve this comment:
Check if you use Babel to compile untrusted JavaScript.

💬 Ignore this finding

To ignore this, reply with:

  • /fp <comment> for false positive
  • /ar <comment> for acceptable risk
  • /other <comment> for all other reasons

You can view more details on this finding in the Semgrep AppSec Platform here.

@mydea
mydea marked this pull request as ready for review August 11, 2026 09:36
@mydea
mydea requested a review from a team as a code ownerAugust 11, 2026 09:36
@mydea
mydea requested review from chargome and s1gr1d and removed request for a teamAugust 11, 2026 09:36
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 8a593fd to 01de976CompareAugust 11, 2026 11:17
@mydea
mydea changed the base branch from develop to fn/remove-astro-scriptAugust 11, 2026 11:17
Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment threadpackages/ember/package.json Outdated
"@embroider/addon-dev": "^8.3.0",
"@embroider/compat": "^4.1.17",
"@embroider/core": "^4.4.7",
"@embroider/macros": "^1.20.2",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is e.g. still used in browserTracingIntegration, why was this moved to devDep?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true!

Comment threadpackages/ember/package.json Outdated
Comment on lines +35 to +36
"lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware",
"lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we do OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I think we had this when this was written originally but since removed it 👍


### FastBoot / SSR

The performance instrumentation automatically detects FastBoot and disables client-side instrumentation during server rendering. No changes needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: How is this done? The packages/ember/addon/instance-initializers/sentry-performance.ts was removed and it looks like this was responsible for this part?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jup, true, I re-added the check to skip this in instrumentAppInstancePerformance

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts
Comment on lines -13 to -14
// TODO(v11): make this required
appInstance?: ApplicationInstance;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this change be added in the migration guide?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this generally needs an entry in migration guide, let me add one!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see most of the test files are deleted: are those cases covered in E2E or somewhere else now?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this test app was moved to e2e app instead of running inside of the package itself.

Base automatically changed from fn/remove-astro-script to developAugust 11, 2026 12:18
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from daf2510 to cdc0622CompareAugust 11, 2026 12:18
const { fromRoute, toRoute } = getTransitionInformation(transition, routerService);

// Store this here to be used, even if the active span has ended
getCurrentScope().setTransactionName(`route:${toRoute}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoidable getCurrentScope usage

Low Severity

This is more of an "is this necessary" check than a hard rule violation: getCurrentScope() is used here to set the transaction name. In multi-client setups that can touch the wrong scope or create an unintended current scope. A client/scope reference already available in this instrumentation path would be safer.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

Reviewed by Cursor Bugbot for commit cdc0622. Configure here.

Comment threadpackages/ember/src/utils/browserTracingIntegration.ts Outdated
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from cdc0622 to b4f2a29CompareAugust 11, 2026 12:46
Comment threadpackages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts Outdated

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just the dataCollection change otherwise LGTM

@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from b4f2a29 to 5ed4189CompareAugust 12, 2026 08:03
Comment threadpackages/ember/README.md

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

import { getBackburner } from './utils.ts';

// Ember runloop queue names
type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dead initial-load instrumentation

Low Severity

contentFor initial-load scripts were removed, but _instrumentInitialLoad() still runs and looks for @sentry/ember:initial-load-* performance marks that are never written now. The related disableInitialLoadInstrumentation option is therefore effectively inert dead code left behind by the migration.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 5ed4189. Configure here.

mydeaand others added 13 commits August 12, 2026 10:31
Squashed from PR #19229 (getsentry/sentry-javascript).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Squashed and rebased continuation of PR #19229 (original author @aklkv) onto current develop.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mydea
mydeaforce-pushed the feat/ember-v2-format-rebased branch from 5ed4189 to a6851acCompareAugust 12, 2026 08:32
Comment on lines +144 to +146
routerService.on('routeDidChange', transition => {
if (!transitionSpan || !activeRootSpan || transitionIsIntermediate(transition)) {
return;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: When instrumentNavigation is false, the routeDidChange handler exits prematurely, preventing the pageload span from being closed and causing a span leak.
Severity: MEDIUM

Suggested Fix

Modify the early exit condition in the routeDidChange handler. The logic should be adjusted to ensure that the backburner callback, which finalizes activeRootSpan, is registered even when transitionSpan is not defined. This will correctly close the pageload span in configurations where navigation instrumentation is disabled.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts#L144-L146
Potential issue: When `instrumentNavigation` is set to `false` while page load
instrumentation is enabled, a logic flaw causes a pageload span leak. On initial load, a
pageload span (`activeRootSpan`) is created. The `routeWillChange` handler does not end
it. Subsequently, the `routeDidChange` handler returns early because `transitionSpan` is
undefined (due to `instrumentNavigation: false`). This early exit prevents the
registration of a `backburner` callback, which is the sole mechanism responsible for
closing `activeRootSpan`. Consequently, the pageload span remains open indefinitely,
leading to a resource leak.

Comment on lines +57 to +63
instrumentEmberAppInstanceForPerformance(
client,
appInstance,
appInstancePerformanceConfig,
startBrowserTracingPageLoadSpan,
startBrowserTracingNavigationSpan,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The instrumentEmberAppInstanceForPerformance function is no longer guarded against re-initialization in tests, causing duplicate router event listeners to be registered in test suites.
Severity: MEDIUM

Suggested Fix

Move the instrumentEmberAppInstanceForPerformance() call inside the if (macroCondition(isTesting())) { if (_initialized) return; } guard. This ensures the function is only executed once during test runs, preventing the registration of duplicate event listeners.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/ember/src/utils/browserTracingIntegration.ts#L57-L63
Potential issue: The `instrumentEmberAppInstanceForPerformance` call was moved outside
of the `_initialized` guard that prevents re-initialization in test environments.
Consequently, if tests re-initialize the integration, router event listeners for
`routeWillChange` and `routeDidChange` will be registered multiple times. This causes
duplicate event handler executions for each route transition, leading to the creation of
duplicate spans and potential test failures.

@mydea
mydea merged commit 1f4522f into developAug 12, 2026
275 of 277 checks passed
@mydea
mydea deleted the feat/ember-v2-format-rebased branch August 12, 2026 09:20
JPeer264 pushed a commit that referenced this pull request Aug 12, 2026
Rebased continuation of #19229 (original author @aklkv) onto current
`develop`, with merge conflicts resolved and the failing tests fixed.
Migrates `@sentry/ember` from the legacy v1 addon format to the [Ember
v2 addon format](https://rfcs.emberjs.com/id/0507-embroider-addons), so
the package works with both classic Ember builds and Embroider-optimized
builds and no longer depends on `@embroider/macros` at runtime. See
#19229 for the full description of the migration.
## Why a new branch
The original PR was ~1900 commits behind `develop` and conflicting.
Rather than resolve the same conflicts twice across its two commits, I
squashed them into one and rebased against the final state once.
The subtle part: the migration renamed `packages/ember/addon/` → `src/`.
Git therefore saw develop's later behavioral changes to those files as
edits to *deleted* files and did **not** surface them as conflicts.
Several develop-side changes had to be ported into the new `src/` files
by hand:
- **Span ops** (#22669, #23086) — route hooks now emit `op: 'function'`
with a `code.function.name` attribute; the runloop uses `ui.task`; the
transition span uses `router`. `instrumentRoutePerformance.ts` still
carried the old `ui.ember.route.*` ops and had to be updated.
- **URL attributes** (#22095, #22415) — `url.path` / `url.full` /
`url.template` on router spans, reconciled onto the PR's restructured
`instrumentEmberAppInstanceForPerformance.ts`.
## Build/tooling reconciliation
- Re-added the nested `typescript: ~5.8.0` devDependency pin. `develop`
upgraded to TypeScript 7 (the native compiler, which drops
`typescript/lib/tsc`), and glint's declaration build needs the classic
JS compiler — the same stop-gap `develop` already applies to ember (see
#19435). Without the pin the declaration build fails with
`ERR_PACKAGE_PATH_NOT_EXPORTED`.
- Bumped `@sentry/browser` / `@sentry/core` from the PR's stale
`10.53.1` to `10.67.0` and added `@sentry/conventions` (now imported by
the ported instrumentation).
- Removed the PR's `import/no-unresolved` oxlint rule (doesn't exist in
this repo's oxlint 1.75) and wrapped `URL_FULL` in
`filterCollectedUrl()` for the `sdk/no-unfiltered-url-attributes` rule,
which now applies since the code lives under `src/**`.
## Test fixes
The originally-failing tests came down to three things:
- **Span-op port** above — fixed the `captures correct spans for
navigation` assertions.
- **Missing `traceLifecycle: 'static'`** in the two new e2e apps
(`ember-strict-resolver`, `ember-vite`). `develop` made span-streaming
the default and disables it in the ember test apps (#22588); the new
apps predated that, so their performance tests hung waiting for
transaction events that never arrived under streaming.
- **Stale assertions** in `ember-strict-resolver`'s
`sentry-performance.test.ts`, updated from the old `ui.ember.*` op
schema to the new `router` / `function` / `ui.task` ops.
All four ember e2e apps pass (`ember-classic` 6/6, `ember-embroider`
6/6, `ember-strict-resolver` 10/10, `ember-vite` 5/5), along with the
ember unit tests, lint, and build.
Supersedes #19229.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mydea@chargome@s1gr1d