meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

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

meta(changelog): Update changelog for 9.16.0 - #16207

Merged
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0
May 7, 2025
Merged

meta(changelog): Update changelog for 9.16.0#16207
RulaKhaled merged 33 commits into
masterfrom
prepare-release/9.16.0

Conversation

@RulaKhaled

Copy link
Copy Markdown
Collaborator

Update changelog for 9.16.0

stephanie-andersonand others added 23 commits April 29, 2025 18:48
To test logs for the alpha we used a standardized `otel_log` envelope
item.
Now that the logs protocol is more stable, we are switching to the
sentry specific envelope item. This is fully documented here:
https://develop.sentry.dev/sdk/telemetry/logs/
[Gitflow] Merge master into develop
Today, we do not have a lot of esm-specific node integration tests. Our
tests make it possible to test ESM, but we only use it very rarely,
sticking to cjs tests across the suite mostly. This means that we have a
bunch of gaps around our ESM support.
This PR introduces a new test utility to make it easier to test stuff in
ESM and CJS:
```js
createEsmAndCjsTests(
__dirname,
'scenario.mjs',
'instrument.mjs',
(createRunner, test) => {
test('it works when importing the http module', async () => {
const runner = createRunner(); // normal test as before
});
});
```
This has a few limitations based on how this works - we can make this
more robust in the future, but for now it should be "OK":
1. It requires a .mjs based instrument file as well as an .mjs based
scenario
2. No relative imports are supported (all content must be in these two
files)
3. It simply regex replaces the esm imports with require for the CJS
tests. not perfect, but it kind of works
For tests that are known to fail on e.g. esm or cjs, you can configure
`failsOnEsm: true`. In this case, it will fail if the test _does not
fail_ (by using `test.fails()` to ensure test failure). This way we can
ensure we find out if stuff starts to fail etc.
To make this work, I had to re-write the test runner code a bit, because
it had issues with vitest unhandled rejection handling. Due to the way
we handled test completion with a promise, `test.fails` was not working
as expected, because the test indeed succeeded when it failed, but the
overall test run still failed because an unhandled rejection bubbled up.
Now, this should work as expected...
I re-wrote a few tests already to show how it works, plus added a new
test that shows an ESM test failure when importing http module (😭 )
chore: Update GH issue templates for Linear compatibility
This removes usage of `axios` in our node-integration-test runner, in
favor of just using `fetch`.
Similar to #16165
Ensures we have logs support for the Next.js Edge Runtime.
resolves#16151
An internal user reported seeing "NotFoundError: Failed to execute
'removeChild' on 'Node': The node to be removed is not a child of this
node." and the replay of their session confirms it:
https://sentry.sentry.io/explore/replays/127444034ae84099a84b524458b6dd90/
However, there is no matching JS error to give more clues.
What I think happened is that after interacting with the Feedback SDK
the widget got into a state where it was no longer mounted into the
page, but we called `removeFromDom()` anyway.
Looking at the replay i saw the moment when the feedback dom was aded to
the page, but it wasn't visible, only this got added at 18:51:
<img width="265" alt="SCR-20250411-lsav"
src="https://github.com/user-attachments/assets/1f65a174-1a8a-405c-8ce4-be0a10d09a64"
/>
So something prevented it from opening all the way up.
Fixesgetsentry/sentry#89424
This PR introduces a new `instrumentDurableObjectWithSentry` method to
the SDK, which instruments durable objects. We capture both traces and
errors automatically.
Usage:
```ts
class MyDurableObjectBase extends DurableObject<Env> {
// impl
}
// Export your named class as defined in your wrangler config
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
// need to define options again because durable objects can be in a separate instance
// to the cloudflare worker (env) => ({
dsn: env.SENTRY_DSN,
tracesSampleRate: 1.0,
}),
MyDurableObjectBase,
);
```
This should work with websockets, and thus
https://github.com/getsentry/sentry-mcp as well.
This PR also refactors some types in
`packages/cloudflare/src/handler.ts` with the `withSentry` method, which
should prevent type errors in some situations.
resolves#15975
resolves https://linear.app/getsentry/issue/JS-285resolves#16182
resolves https://linear.app/getsentry/issue/JS-398
…16143)
Based on the docs work for the issue
getsentry/sentry-docs#13407, I went through
the repository and looked for places where a conditional check for
`sendDefaultPii` might be missing.
- Adds client-side instrumentation for react router's `HydratedRouter`
(which is basically a `DataRouter` enhanced with ssr data)
- Updates pageloads to have parameterized transaction names
- Adds parameterized navigation payloads
- Adds `reactRouterTracingIntegration` which needs to be used instead of
`browserTracingIntegration` (this in turn inits the router
instrumentation)
- Logs a warning whenever `browserTracingIntegration` is used within
this package
closes#16160
…#16183)
If users manually pass in `sentry-trace` and `baggage` headers, we
previously overwrote the values with the ones we computed. With this patch, we:
- still check for pre-existing sentry headers, but do nothing if we find
them instead of replacing them
- still ensure that we merge pre-existing non-sentry baggage values with
our baggage values
- add a bunch of unit tests for the various header and request types (I
feel like I wrote these before but couldn't find em)
- add an integration test to demonstrate that manually passed in headers
are still taken
…ests (#16184)
Analogously to #16183 for `fetch`, this patch ensures that manually set
`sentry-trace` and `baggage` headers in XHR requests are respected by
our XHR instrumentation and not overwritten.
This patch also fixes a bug where we'd append multiple `sentry-trace` or
`baggage` values in case the header was somehow set more than once
(analogously to
#13907 for `fetch`)
@s1gr1d and @Lms24 figured out that the duplicate spans we sometimes see
are related to esm and the http module. Especially, it seems to be
related to us using the `stealthWrap` function to wrap `server.emit` for
request isolation purposes.
While we still don't really know _why_ this is making such problems,
this PR seems to fix it (at least in integration tests) by avoiding
using import-in-the-middle here, and instead using diagnostics channel
with good old-fashioned monkey patching on the passed-in `server`
instance.
Some note: We need to make sure to still call this in the otel-wrapping
code of `init()`, otherwise there are weird timing issues in
top-level-import scenarios 😬
Hopefully fixes#15830, and fixes#15803
---------
Co-authored-by: Andrei <168741329+andreiborza@users.noreply.github.com>
Implement consistent sampling across traces in browser SDKs.
Concrete changes:
- Add `consistentTraceSampling` option
- Emit `beforeSampling` hook before sampling and creating `SentrySpan`'s
in the coreSDK (this hook is already called in Otel-based spans).
- Allow `beforeSampling` hook subscribers to alter span `attributes` and
`parentSampled` flag
- Subscribe to `beforeSampling` hook when `consistentTraceSampling` is
enabled and `linkPreviousTrace` is not disabled
- modify attributes and `parentSampled` flag based on the sampling
decision, sample rate and sample rand of the previous trace
- this will ensure that the newly started trace is sampled
postitively/negatively depending on the decision of the previous trace
- we also directly modify the propagation context to ensure that the
previous trace's sampling decision, rate and rand are propagated
correctly to downstream services and in the `trace` envelope header.
This is necessary to ensure correct span metrics extrapolation.
- sampling decisions from `<meta>` tags still have precedence for the
first pageload over the previous trace's sampling decision. This is
necessary because we need to prioritize inter-trace completeness over
intra-trace completeness
- explicit sampling decisions from `tracesSampler` still have precedence
over the previous trace's sampling decision
- added a bunch of browser integration tests describing the behaviour in
various edge cases and sampling configurations
resolves#15989
resolves https://linear.app/getsentry/issue/JS-270
Adds logs exports to the cloudflare SDK.
The cloudflare SDK is implemented on top of the `ServerRuntimeClient`,
so it has all the flushing improvements we added to the Node.js SDK.
feat(react-router): Create a Vite plugin that injects sentryConfig into the global vite config
@RulaKhaled
RulaKhaled requested review from a team as code ownersMay 6, 2025 13:32
@RulaKhaled
RulaKhaled requested review from Lms24 and mydeaMay 6, 2025 13:32
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
@github-actions

github-actionsBot commented May 6, 2025

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser23.35 KBaddedadded
@sentry/browser - with treeshaking flags23.19 KBaddedadded
@sentry/browser (incl. Tracing)37.25 KBaddedadded
@sentry/browser (incl. Tracing, Replay)74.47 KBaddedadded
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags68.34 KBaddedadded
@sentry/browser (incl. Tracing, Replay with Canvas)79.12 KBaddedadded
@sentry/browser (incl. Tracing, Replay, Feedback)90.93 KBaddedadded
@sentry/browser (incl. Feedback)39.75 KBaddedadded
@sentry/browser (incl. sendFeedback)27.98 KBaddedadded
@sentry/browser (incl. FeedbackAsync)32.74 KBaddedadded
@sentry/react25.16 KBaddedadded
@sentry/react (incl. Tracing)39.24 KBaddedadded
@sentry/vue27.63 KBaddedadded
@sentry/vue (incl. Tracing)39.01 KBaddedadded
@sentry/svelte23.38 KBaddedadded
CDN Bundle24.55 KBaddedadded
CDN Bundle (incl. Tracing)37.29 KBaddedadded
CDN Bundle (incl. Tracing, Replay)72.33 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback)77.64 KBaddedadded
CDN Bundle - uncompressed71.62 KBaddedadded
CDN Bundle (incl. Tracing) - uncompressed110.34 KBaddedadded
CDN Bundle (incl. Tracing, Replay) - uncompressed221.63 KBaddedadded
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed234.15 KBaddedadded
@sentry/nextjs (client)40.84 KBaddedadded
@sentry/sveltekit (client)37.73 KBaddedadded
@sentry/node144.43 KBaddedadded
@sentry/node - without tracing96.3 KBaddedadded
@sentry/aws-serverless120.66 KBaddedadded

Comment threadCHANGELOG.md Outdated
mydea added 2 commits May 6, 2025 18:00
As pre-work for
#16178, actually add
a test for this (kind of). This showed that there was actually a
fundamental flaw here, as we looked as the `req` not the `res`, oops.
@RulaKhaled
RulaKhaled requested a review from lforstMay 7, 2025 11:34
mydeaand others added 2 commits May 7, 2025 13:56
This can be configured like this:
```js
httpIntegration({
dropSpansForIncomingRequestStatusCodes: [404, [300,399]]
})
```
It defaults to `[404]`. Closes#16193
resolves#16110
Stores the Client to LogBuffer WeakMap onto the global object so logs
can be retrieved correctly during flushing. Previously, the WeakMap
reference would be different at flush time, causing no logs to be found
for any given client.
Adds an express e2e tests to ensure logs are flushed correctly.
Lms24and others added 5 commits May 7, 2025 09:32
This PR enables reading the `SENTRY_RELEASE` variable from the CF `env`
that users should pass to their `withSentry` worker wrapper. This is
quite similar to how we'd usually access env variables in Node-based
SDKs.
We need this for uploading release-based source maps for CF worker
functions being bundled and deployed by wrangler.
see
getsentry/sentry-wizard#824 (comment)
ref
https://linear.app/getsentry/issue/WIZARD-36/improve-sentrywizard-i-sourcemaps-for-cloudflarewrangler
---------
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
Co-authored-by: Charly Gomez <charly.gomez@sentry.io>
@RulaKhaled
RulaKhaledforce-pushed the prepare-release/9.16.0 branch from 73a9c95 to 2687d26CompareMay 7, 2025 13:57
@RulaKhaled
RulaKhaled merged commit 681742c into masterMay 7, 2025
@RulaKhaled
RulaKhaled deleted the prepare-release/9.16.0 branch May 7, 2025 14:12
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.

9 participants

@RulaKhaled@AbhiPrasad@chargome@stephanie-anderson@mydea@ryan953@s1gr1d@Lms24@andreiborza