Skip to content

fix(core): Replace regex with string check in stack parser to prevent main thread blocking#20089

Draft
chargome wants to merge 3 commits intodevelopfrom
cg/fix-stack-parser
Draft

fix(core): Replace regex with string check in stack parser to prevent main thread blocking#20089
chargome wants to merge 3 commits intodevelopfrom
cg/fix-stack-parser

Conversation

@chargome
Copy link
Copy Markdown
Member

@chargome chargome commented Apr 2, 2026

The stack parser used the regex /\S*Error: / to skip error description lines (e.g. "TypeError: foo") when parsing stack traces. The \S* quantifier causes O(n²) backtracking on long lines without whitespace, which are common in minified bundle stack traces.

In apps using thirdPartyErrorFilterIntegration, the stack parser is invoked on every _sentryModuleMetadata entry on the first error event. In large Next.js apps with many bundled chunks, this caused 1s+ main thread blocking.

Replacing .match(/\S*Error: /) with .includes('Error: ') which is O(n) and semantically equivalent — the \S* prefix could match zero characters, so it never affected which lines were matched.

Fixes #20052

@chargome chargome self-assigned this Apr 2, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 2, 2026

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Deps

  • Bump lodash.template from 4.5.0 to 4.18.1 by dependabot in #20085
  • Bump @xmldom/xmldom from 0.8.3 to 0.8.12 by dependabot in #20066

Other

  • (core) Support embeddings in langchain by nicohrubec in #20017
  • (core, node) Portable Express integration by isaacs in #19928
  • (deno) Add denoRuntimeMetricsIntegration by chargome in #20023
  • (node, bun) Enforce minimum collection interval in runtime metrics integrations by chargome in #20068

Bug Fixes 🐛

  • (aws-serverless) Add timeout to _endSpan forceFlush to prevent Lambda hanging by logaretm in #20064
  • (cloudflare) Ensure every request instruments functions by JPeer264 in #20044
  • (core) Replace regex with string check in stack parser to prevent main thread blocking by chargome in #20089
  • (gatsby) Fix errorHandler signature to match bundler-plugin-core API by JPeer264 in #20048

Internal Changes 🔧

Core

  • Do not emit spans for chats.create in google-genai by nicohrubec in #19990
  • Unify .do* span ops to gen_ai.generate_content by nicohrubec in #20074
  • Simplify addResponseAttributes in openai integration by nicohrubec in #20013
  • Extract shared endStreamSpan for AI integrations by nicohrubec in #20021
  • Remove provider-specific AI span attributes in favor of gen_ai attributes in sentry conventions by nicohrubec in #20011

Deps

  • Bump mshick/add-pr-comment from dd126dd8c253650d181ad9538d8b4fa218fc31e8 to e7516d74559b5514092f5b096ed29a629a1237c6 by dependabot in #20078
  • Bump getsentry/craft/.github/workflows/changelog-preview.yml from 2.24.1 to 2.25.2 by dependabot in #20081

Other

  • (node) Add node integration tests for Vercel ToolLoopAgent by nicohrubec in #20087
  • Update validate-pr workflow by stephanie-anderson in #20072
  • Remove unused tsconfig-template folder by mydea in #20067

🤖 This preview updates automatically when you update the PR.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 2, 2026

size-limit report 📦

⚠️ Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

Path Size % Change Change
@sentry/browser 25.64 kB +0.01% +2 B 🔺
@sentry/browser - with treeshaking flags 24.13 kB - -
@sentry/browser (incl. Tracing) 42.15 kB +0.01% +3 B 🔺
@sentry/browser (incl. Tracing, Profiling) 46.77 kB +0.01% +4 B 🔺
@sentry/browser (incl. Tracing, Replay) 80.94 kB +0.01% +1 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 70.56 kB +0.01% +1 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas) 85.65 kB +0.01% +3 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback) 97.91 kB +0.01% +2 B 🔺
@sentry/browser (incl. Feedback) 42.42 kB +0.01% +4 B 🔺
@sentry/browser (incl. sendFeedback) 30.31 kB +0.02% +4 B 🔺
@sentry/browser (incl. FeedbackAsync) 35.3 kB +0.05% +15 B 🔺
@sentry/browser (incl. Metrics) 26.95 kB +0.01% +2 B 🔺
@sentry/browser (incl. Logs) 27.1 kB +0.01% +2 B 🔺
@sentry/browser (incl. Metrics & Logs) 27.78 kB +0.02% +3 B 🔺
@sentry/react 27.41 kB +0.02% +3 B 🔺
@sentry/react (incl. Tracing) 44.48 kB +0.01% +3 B 🔺
@sentry/vue 30.08 kB +0.01% +1 B 🔺
@sentry/vue (incl. Tracing) 44.05 kB +0.01% +3 B 🔺
@sentry/svelte 25.67 kB +0.01% +2 B 🔺
CDN Bundle 28.32 kB +0.04% +10 B 🔺
CDN Bundle (incl. Tracing) 43.12 kB +0.05% +21 B 🔺
CDN Bundle (incl. Logs, Metrics) 29.69 kB +0.04% +11 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) 44.17 kB +0.04% +15 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) 68.49 kB +0.02% +13 B 🔺
CDN Bundle (incl. Tracing, Replay) 80.01 kB +0.02% +15 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 81.06 kB +0.02% +13 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) 85.55 kB +0.02% +11 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 86.59 kB +0.02% +12 B 🔺
CDN Bundle - uncompressed 82.72 kB +0.07% +54 B 🔺
CDN Bundle (incl. Tracing) - uncompressed 127.86 kB +0.05% +54 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed 86.86 kB +0.07% +54 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 131.27 kB +0.05% +54 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 209.84 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed 244.74 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 248.13 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 257.65 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 261.04 kB +0.03% +54 B 🔺
@sentry/nextjs (client) 46.89 kB +0.01% +4 B 🔺
@sentry/sveltekit (client) 42.62 kB +0.01% +3 B 🔺
@sentry/node-core 55.76 kB +0.02% +11 B 🔺
@sentry/node 172.41 kB -0.2% -341 B 🔽
@sentry/node - without tracing 96.04 kB +0.03% +28 B 🔺
@sentry/aws-serverless 112.85 kB +0.07% +75 B 🔺

View base workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 2, 2026

node-overhead report 🧳

Note: This is a synthetic benchmark with a minimal express app and does not necessarily reflect the real-world performance impact in an application.

Scenario Requests/s % of Baseline Prev. Requests/s Change %
GET Baseline 8,475 - 11,137 -24%
GET With Sentry 1,710 20% 1,952 -12%
GET With Sentry (error only) 6,005 71% 7,510 -20%
POST Baseline 1,184 - 1,142 +4%
POST With Sentry 583 49% 561 +4%
POST With Sentry (error only) 1,044 88% 1,020 +2%
MYSQL Baseline 3,120 - 3,939 -21%
MYSQL With Sentry 445 14% 435 +2%
MYSQL With Sentry (error only) 2,596 83% 3,093 -16%

View base workflow run

Sign up for free to 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.

RegEx stack parsing 1s+ main thread block

1 participant