fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza
, '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

fix(nextjs): Set parameterized transaction name for non-transaction events - #19316

Merged
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization
Feb 13, 2026
Merged

fix(nextjs): Set parameterized transaction name for non-transaction events#19316
chargome merged 6 commits into
developfrom
cg/turbo-tx-parameterization

Conversation

@chargome

@chargomechargome commented Feb 13, 2026

Copy link
Copy Markdown
Member

Calls to Sentry.captureException() inside a Next.js App Router route handler, lead to unparameterized transaction names

  • This happens because non-transaction events read their transaction from the isolation scope's transactionName, which is set to the raw URL by httpServerIntegration. On turbopack, the webpack wrapping loader doesn't run, so wrapRouteHandlerWithSentry (which sets the parameterized name on the current scope) is never called.
  • The fix updates handleOnSpanStart to also set the parameterized route on the isolation scope when hoisting the next.route attribute to the root span. This ensures manually captured events get the parameterized route regardless of bundler.
  • Adds E2E tests for route handler errors (throw), captureException, and captureMessage with parameterized routes in the nextjs-16 test app.

closes#19312

@chargomechargome self-assigned this Feb 13, 2026
@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

Copy link
Copy Markdown
Contributor

Codecov Results 📊

✅ Patch coverage is 100.00%. Project has 14 uncovered lines.
✅ Project coverage is 83.13%. Comparing base (base) to head (head).

Files with missing lines (2)
FilePatch %Lines
mute.js79.10%⚠️ 14 Missing and 7 partials
etoa.js100.00%⚠️ 1 partials
Coverage diff
@@ Coverage Diff @@## main #PR +/-##
==========================================
+ Coverage 60.31% 83.13% +22.82%
==========================================
Files 756 2 -754
Lines 41847 83 -41764
Branches 7996 57 -7939
==========================================
+ Hits 25248 69 -25179- Misses 16599 14 -16585- Partials 82 8 -74

Generated by Codecov Action

@chargomechargome changed the title test(nextjs): Add parameterization tests for errors in route handlersfix(nextjs): Set parameterized transaction name for non-transaction eventsFeb 13, 2026
@chargome
chargome marked this pull request as ready for review February 13, 2026 10:29

@andreiborzaandreiborza 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.

LGTM

Comment threadpackages/nextjs/src/server/handleOnSpanStart.ts

@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.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

handled: false,
type: 'auto.function.nextjs.on_request_error',
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Test uses conditional instead of separate test cases

Low Severity

The test at line 69 uses if (process.env.TEST_ENV === 'development') to conditionally run assertions for nextjs context and mechanism. Per the project review rules, conditionals within a single test case are discouraged — the recommendation is to split the test into separate test cases for each environment path. This ensures both paths are always visible in test results and avoids silently skipping assertions.

Fix in CursorFix in Web

Triggered by project rule: PR Review Guidelines for Cursor Bot

@chargome
chargome merged commit 337f538 into developFeb 13, 2026
68 checks passed
@chargome
chargome deleted the cg/turbo-tx-parameterization branch February 13, 2026 12:54
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.

Context transaction name is not parametrized anymore

2 participants

@chargome@andreiborza