feat(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@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(browser): Add mode option for the browser session integration - #18997

Merged
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode
Feb 10, 2026
Merged

feat(browser): Add mode option for the browser session integration#18997
JPeer264 merged 5 commits into
developfrom
jp/browser-session-mode

Conversation

@JPeer264

@JPeer264JPeer264 commented Jan 27, 2026

Copy link
Copy Markdown
Member

closes#18921
closes JS-1526

This adds a new lifecycle option to the BrowserSessionIntegration.

New explained:

  • pagae: A session is created once when the page is loaded. Session is not updated on navigation. This is useful for webviews or single-page apps where URL changes should not trigger new sessions.
  • route (default): A session is created on page load and on every navigation change

The default is to route to not introduce any breaking change

Merge checklist

  • Add Sentry Docs issue to add this to the docs

@JPeer264
JPeer264 requested review from Lms24 and s1gr1dJanuary 27, 2026 13:24
@JPeer264JPeer264 self-assigned this Jan 27, 2026
@linear

linearBot commented Jan 27, 2026

Copy link
Copy Markdown

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 6dae52a to 85aa5daCompareJanuary 27, 2026 13:26
@github-actions

github-actionsBot commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser25.56 kB+0.12%+29 B 🔺
@sentry/browser - with treeshaking flags24.08 kB+0.1%+24 B 🔺
@sentry/browser (incl. Tracing)42.36 kB+0.02%+6 B 🔺
@sentry/browser (incl. Tracing, Profiling)47.03 kB+0.04%+15 B 🔺
@sentry/browser (incl. Tracing, Replay)81.18 kB+0.06%+42 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags70.8 kB+0.04%+25 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas)85.87 kB+0.04%+27 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback)98.03 kB+0.02%+17 B 🔺
@sentry/browser (incl. Feedback)42.29 kB+0.05%+19 B 🔺
@sentry/browser (incl. sendFeedback)30.23 kB+0.06%+18 B 🔺
@sentry/browser (incl. FeedbackAsync)35.22 kB+0.04%+11 B 🔺
@sentry/browser (incl. Metrics)26.74 kB+0.1%+26 B 🔺
@sentry/browser (incl. Logs)26.88 kB+0.12%+30 B 🔺
@sentry/browser (incl. Metrics & Logs)27.56 kB+0.11%+28 B 🔺
@sentry/react27.33 kB+0.12%+31 B 🔺
@sentry/react (incl. Tracing)44.7 kB+0.07%+27 B 🔺
@sentry/vue30.01 kB+0.09%+24 B 🔺
@sentry/vue (incl. Tracing)44.21 kB+0.03%+13 B 🔺
@sentry/svelte25.58 kB+0.11%+28 B 🔺
CDN Bundle28.11 kB+0.13%+34 B 🔺
CDN Bundle (incl. Tracing)43.2 kB+0.11%+46 B 🔺
CDN Bundle (incl. Logs, Metrics)28.95 kB+0.12%+32 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics)44.03 kB+0.1%+42 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics)68.02 kB+0.05%+31 B 🔺
CDN Bundle (incl. Tracing, Replay)80.07 kB+0.05%+33 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)80.94 kB+0.05%+35 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback)85.5 kB+0.05%+37 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)86.4 kB+0.04%+34 B 🔺
CDN Bundle - uncompressed82.22 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing) - uncompressed127.93 kB+0.08%+97 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed85.05 kB+0.12%+97 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed130.76 kB+0.08%+97 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed208.71 kB+0.05%+97 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed244.81 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed247.63 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed257.61 kB+0.04%+97 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed260.42 kB+0.04%+97 B 🔺
@sentry/nextjs (client)47.04 kB+0.06%+27 B 🔺
@sentry/sveltekit (client)42.81 kB+0.08%+30 B 🔺
@sentry/node-core52.19 kB-0.01%-3 B 🔽
@sentry/node166.53 kB-0.01%-1 B 🔽
@sentry/node - without tracing93.97 kB-0.01%-1 B 🔽
@sentry/aws-serverless109.48 kB-0.01%-2 B 🔽

View base workflow run

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from c45eae4 to 452d0c4CompareJanuary 27, 2026 16:39
*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

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 am not 100% sure about the naming here, as it's only clear when reading the JS doc. A suggestion:

sessionMode: 'navigation'|'only-pageload'

Hm, now that I think more about it, it's probably fine because this is an option in the browserSessionIntegration and it should be clear that this is about the session. So the naming would actually work already (just leaving this to share my thoughts).

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.

uuuuuuh, I actually like only-pageload. However, it seems too technical correct - it could be that "only-pageload" implies that it doesn't track the session further 🤔

@Lms24 wdyt? To get a third opinion here :)

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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.

I gave it now one week of thought. Tbh lifecycle is indeed better. Also because we use lifecycle already in our codebase for such scenarios (e.g. profileLifecycle).

I also thought about naming, I think there is no perfect solution/wording for this one I'm afraid. Let's go for Option 1 of your newest suggestion and see where it leads to.

Comment on lines +38 to +42
await page.locator('#navigate').click();

const sessions = (await sessionsPromise).filter(session => session.init);

expect(sessions.length).toBe(1);

@Lms24Lms24Jan 28, 2026

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.

l: What I like to do when I test that something is not sent, is to await an event after navigating so that we have some time before ending the tests. I guess in this case, we could wait for an error or a transaction event. There's still an assumption here that the session would have been sent before that event but I think that's reasonable and better than not waiting at all or waiting for a a specific time.

We could even make it more deterministic by:

  1. going to the page
  2. awaiting for the init session
  3. registering the request listener for additional sessions
  4. navigating
  5. waiting for the unrelated event
  6. asserting that no more session envelopes have been sent

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.

Those are very valid points. I'll try to implement these

*
* @default 'navigation'
*/
mode?: 'single' | 'navigation';

@Lms24Lms24Jan 28, 2026

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.

hmm yeah, "only-pageload" to me also implies something like "we only track sessions for the pageload and stop afterwards".
Let's think about this, also from a perspective of potentially adding a third mode for persisting the id in sessionStorage in the future. So mentally, it should correlate to "short -> medium -> long".

How about:

  1. lifecycle: 'route' | 'page' | 'tab'
  2. lifecycle: 'navigation' | 'pageload' | 'tab'

1 has the advantage that it's very descriptive, but confusion could come from "page". I think this is minimal and also kinda works anyway because it's primarily relevant for Single Page applications".

2 is a bit more technical but correlates well with established Sentry terms.

I think with the proper JSDoc (which is already there xD), both would work well. Especially if we pair these with lifecycle since this more directly implies session life time than "mode" IMHO. Fully realizing I said other things offline, so sorry for throwing yet more options into the ring. Thoughts?

fwiw, Gemini clearly prefers 1 😅

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

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from 8307b01 to be3044bCompareFebruary 5, 2026 08:27
@JPeer264
JPeer264 requested review from Lms24 and s1gr1dFebruary 5, 2026 08:27
@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from be3044b to 2484c0fCompareFebruary 5, 2026 08:29
@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊


Generated by Codecov Action

@github-actions

github-actionsBot commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

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.

ScenarioRequests/s% of BaselinePrev. Requests/sChange %
GET Baseline8,652-8,882-3%
GET With Sentry1,63919%1,756-7%
GET With Sentry (error only)6,02670%6,178-2%
POST Baseline1,182-1,182-
POST With Sentry57148%592-4%
POST With Sentry (error only)1,03988%1,038+0%
MYSQL Baseline3,251-3,315-2%
MYSQL With Sentry38212%446-14%
MYSQL With Sentry (error only)2,57179%2,680-4%

View base workflow run

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

Thanks for making the changes, LGTM!

@JPeer264
JPeer264force-pushed the jp/browser-session-mode branch from f7824f4 to ef88277CompareFebruary 10, 2026 14:47
@JPeer264
JPeer264 enabled auto-merge (squash) February 10, 2026 14:47
@JPeer264
JPeer264 merged commit e62d70b into developFeb 10, 2026
429 of 432 checks passed
@JPeer264
JPeer264 deleted the jp/browser-session-mode branch February 10, 2026 15:33
Lms24 added a commit to getsentry/sentry-docs that referenced this pull request Feb 18, 2026
…ntegration` (#16428)
<!-- Use this checklist to make sure your PR is ready for merge. You may
delete any sections you don't need. -->
## DESCRIBE YOUR PR
Adds docs for getsentry/sentry-javascript#18997.
I'd like to merge this before
getsentry/sentry-javascript#19341 since it calls
out this page in the changelog.
## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs
to go live.
- [ ] Urgent deadline (GA date, etc.): <!-- ENTER DATE HERE -->
- [ ] Other deadline: <!-- ENTER DATE HERE -->
- [ ] None: Not urgent, can wait up to 1 week+
## SLA
- Teamwork makes the dream work, so please add a reviewer to your PRs.
- Please give the docs team up to 1 week to review your PR unless you've
added an urgent due date to it.
Thanks in advance for your help!
## PRE-MERGE CHECKLIST
*Make sure you've checked the following before merging your changes:*
- [ ] Checked Vercel preview for correctness, including links
- [ ] PR was reviewed and approved by any necessary SMEs (subject matter
experts)
- [ ] PR was reviewed and approved by a member of the [Sentry docs
team](https://github.com/orgs/getsentry/teams/docs)
## LEGAL BOILERPLATE
<!-- Sentry employees and contractors can delete or ignore this section.
-->
Look, I get it. The entity doing business as "Sentry" was incorporated
in the State of Delaware in 2015 as Functional Software, Inc. and is
gonna need some rights from me in order to utilize my contributions in
this here PR. So here's the deal: I retain all rights, title and
interest in and to my contributions, and by keeping this boilerplate
intact I confirm that Sentry can use, modify, copy, and redistribute my
contributions, under Sentry's choice of terms.
## EXTRA RESOURCES
- [Sentry Docs contributor guide](https://docs.sentry.io/contributing/)
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.

Sessions - Provide more options to control session creation

3 participants

@JPeer264@Lms24@s1gr1d