Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
b6a7773
feat(core): Support truncation for LangChain integration request mess…
nicohrubec Nov 11, 2025
3be2092
test(browser-integration): Fix incorrect tag value assertions (#18162)
Lms24 Nov 11, 2025
a36b672
test(profiling): Add test utils to validate Profile Chunk envelope (#…
s1gr1d Nov 11, 2025
8267561
Merge pull request #18174 from getsentry/master
github-actions[bot] Nov 11, 2025
9d99c99
fix(core): Decrease number of Sentry stack frames for messages from `…
Lms24 Nov 12, 2025
0f4c190
ref(e2e-ember): Remove `@embroider/addon-shim` override (#18180)
s1gr1d Nov 12, 2025
679a02c
ref(core): Optimize `Scope.setTag` bundle size and adjust test (#18182)
Lms24 Nov 12, 2025
5c184f4
fix(nextjs): Avoid wrapping middleware files when in standalone mode …
logaretm Nov 12, 2025
0cb306e
fix(browser): Add `ok` status to succesful `idleSpan`s (#18139)
onurtemizkan Nov 12, 2025
2406e90
feat(node-core): Add mechanism to prevent wrapping ai providers multi…
RulaKhaled Nov 12, 2025
4f71c94
ref(core): Move ai integrations from utils to tracing (#18185)
nicohrubec Nov 12, 2025
2deb000
ref(browserprofiling): Move and rename profiler class to UIProfiler (…
s1gr1d Nov 12, 2025
090a3e3
fix(node): `tracingChannel` export missing in older node versions (#1…
timfish Nov 12, 2025
7efb1d2
feat(replay): Bump limit for minReplayDuration (#18190)
chargome Nov 13, 2025
c8ca286
fix(node): Fix Spotlight configuration precedence to match specificat…
BYK Nov 13, 2025
b947281
fix(core): Flatten gen_ai.request.available_tools in google-genai (#1…
nicohrubec Nov 14, 2025
ea3183f
fix(core): Stringify available tools sent from vercelai (#18197)
nicohrubec Nov 14, 2025
fcf35f6
fix(core/vue): Detect and skip normalizing Vue `VNode` objects with h…
logaretm Nov 14, 2025
74822de
ref(react-router): Deprecate ErrorBoundary exports (#18208)
andreiborza Nov 14, 2025
e403d89
fix(core): Ensure logs past `MAX_LOG_BUFFER_SIZE` are not swallowed (…
andreiborza Nov 17, 2025
e3ef3f2
fix(core): Ensure metrics past `MAX_METRIC_BUFFER_SIZE` are not swall…
andreiborza Nov 17, 2025
84ef78b
chore(react-router): Fix casing on deprecation notices (#18221)
andreiborza Nov 17, 2025
ad0ce51
fix(core): Fix logs and metrics flush timeout starvation with continu…
andreiborza Nov 17, 2025
8efeeeb
fix(core): Emit processed metric (#18222)
chargome Nov 17, 2025
f9e714f
feat(core): Instrument LangGraph Agent (#18114)
RulaKhaled Nov 17, 2025
5a5e091
ref(browser): Move trace lifecycle listeners to class function (#18231)
s1gr1d Nov 17, 2025
fb67650
fix(core): Check `fetch` support with data URL (#18225)
s1gr1d Nov 17, 2025
4ad4d92
chore: move tip about prioritizing issues (#18071)
OrbisK Nov 17, 2025
1679d80
fix(nextjs): Drop meta trace tags if rendered page is ISR (#18192)
logaretm Nov 17, 2025
60a198e
fix(nextjs): use LRU map instead of map for ISR route cache (#18234)
logaretm Nov 17, 2025
ccfda39
chore: Fix missing changelog quote we use for attribution placement (…
andreiborza Nov 18, 2025
9ce440c
fix(react): Prevent navigation span leaks for consecutive navigations…
onurtemizkan Nov 18, 2025
d729cdb
feat(nextjs): Add URL to server-side transaction events (#18230)
logaretm Nov 18, 2025
9482a02
fix(nextjs): Respect PORT variable for dev error symbolication (#18227)
chargome Nov 18, 2025
610ae69
feat(browser-utils): bump web-vitals to 5.1.0 (#18091)
logaretm Nov 18, 2025
935ef55
feat(core): Support OpenAI embeddings API (#18224)
nicohrubec Nov 18, 2025
d12ba2e
feat(metrics): Add default `server.address` attribute on server runti…
chargome Nov 18, 2025
584d4bc
feat(cloudflare/vercel-edge): Add manual instrumentation for LangGrap…
RulaKhaled Nov 19, 2025
b3bf56d
feat(node): Add OpenAI SDK v6 support and integration tests (#18244)
RulaKhaled Nov 19, 2025
be29c56
chore(e2e): Bump zod in e2e tests (#18251)
andreiborza Nov 19, 2025
be12569
meta(changelog): Update changelog for 10.26.0
logaretm Nov 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,14 @@ body:
id: additional
attributes:
label: Additional Context
description:
Add any other context here. Please keep the pre-filled text, which helps us manage issue prioritization.
value: |-
<sub>Tip: React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1` or `me too`, to help us triage it.</sub>
description: Add any other context here.
validations:
required: false
- type: markdown
- type: dropdown
attributes:
value: |-
## Thanks 🙏
label: 'Priority'
description: Please keep the pre-filled option, which helps us manage issue prioritization.
default: 0
options:
- <sub>React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1`
or `me too`, to help us triage it.</sub>
16 changes: 8 additions & 8 deletions .github/ISSUE_TEMPLATE/feature.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ body:
id: additional
attributes:
label: Additional Context
description:
Add any other context here. Please keep the pre-filled text, which helps us manage feature prioritization.
value: |-
<sub>Tip: React with 👍 to help prioritize this improvement. Please use comments to provide useful context, avoiding `+1` or `me too`, to help us triage it.</sub>
description: Add any other context here.
validations:
required: false
- type: markdown
- type: dropdown
attributes:
value: |-
## Thanks 🙏
Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
label: 'Priority'
description: Please keep the pre-filled option, which helps us manage issue prioritization.
default: 0
options:
- <sub>React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1`
or `me too`, to help us triage it.</sub>
8 changes: 4 additions & 4 deletions .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ module.exports = [
path: 'packages/browser/build/npm/esm/prod/index.js',
import: createImport('init', 'browserTracingIntegration'),
gzip: true,
limit: '41.3 KB',
limit: '41.38 KB',
},
{
name: '@sentry/browser (incl. Tracing, Profiling)',
Expand Down Expand Up @@ -127,7 +127,7 @@ module.exports = [
import: createImport('init', 'ErrorBoundary', 'reactRouterV6BrowserTracingIntegration'),
ignore: ['react/jsx-runtime'],
gzip: true,
limit: '43.3 KB',
limit: '43.33 KB',
},
// Vue SDK (ESM)
{
Expand All @@ -142,7 +142,7 @@ module.exports = [
path: 'packages/vue/build/esm/index.js',
import: createImport('init', 'browserTracingIntegration'),
gzip: true,
limit: '43.1 KB',
limit: '43.2 KB',
},
// Svelte SDK (ESM)
{
Expand Down Expand Up @@ -240,7 +240,7 @@ module.exports = [
import: createImport('init'),
ignore: [...builtinModules, ...nodePrefixedBuiltinModules],
gzip: true,
limit: '158 KB',
limit: '160 KB',
},
{
name: '@sentry/node - without tracing',
Expand Down
96 changes: 96 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,102 @@

- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott

## 10.26.0

### Important Changes

- **feat(core): Instrument LangGraph Agent ([#18114](https://github.com/getsentry/sentry-javascript/pull/18114))**

Adds support for instrumenting LangGraph StateGraph operations in Node. The LangGraph integration can be configured as follows:

```js
Sentry.init({
dsn: '__DSN__',
sendDefaultPii: false, // Even with PII disabled globally
integrations: [
Sentry.langGraphIntegration({
recordInputs: true, // Force recording input messages
recordOutputs: true, // Force recording response text
}),
],
});
```

- **feat(cloudflare/vercel-edge): Add manual instrumentation for LangGraph ([#18112](https://github.com/getsentry/sentry-javascript/pull/18112))**

Instrumentation for LangGraph in Cloudflare Workers and Vercel Edge environments is supported by manually calling `instrumentLangGraph`:

```js
import * as Sentry from '@sentry/cloudflare'; // or '@sentry/vercel-edge'
import { StateGraph, START, END, MessagesAnnotation } from '@langchain/langgraph';

// Create and instrument the graph
const graph = new StateGraph(MessagesAnnotation)
.addNode('agent', agentFn)
.addEdge(START, 'agent')
.addEdge('agent', END);

Sentry.instrumentLangGraph(graph, {
recordInputs: true,
recordOutputs: true,
});

const compiled = graph.compile({ name: 'weather_assistant' });

await compiled.invoke({
messages: [{ role: 'user', content: 'What is the weather in SF?' }],
});
```

- **feat(node): Add OpenAI SDK v6 support ([#18244](https://github.com/getsentry/sentry-javascript/pull/18244))**

### Other Changes

- feat(core): Support OpenAI embeddings API ([#18224](https://github.com/getsentry/sentry-javascript/pull/18224))
- feat(browser-utils): bump web-vitals to 5.1.0 ([#18091](https://github.com/getsentry/sentry-javascript/pull/18091))
- feat(core): Support truncation for LangChain integration request messages ([#18157](https://github.com/getsentry/sentry-javascript/pull/18157))
- feat(metrics): Add default `server.address` attribute on server runtimes ([#18242](https://github.com/getsentry/sentry-javascript/pull/18242))
- feat(nextjs): Add URL to server-side transaction events ([#18230](https://github.com/getsentry/sentry-javascript/pull/18230))
- feat(node-core): Add mechanism to prevent wrapping ai providers multiple times([#17972](https://github.com/getsentry/sentry-javascript/pull/17972))
- feat(replay): Bump limit for minReplayDuration ([#18190](https://github.com/getsentry/sentry-javascript/pull/18190))
- fix(browser): Add `ok` status to successful `idleSpan`s ([#18139](https://github.com/getsentry/sentry-javascript/pull/18139))
- fix(core): Check `fetch` support with data URL ([#18225](https://github.com/getsentry/sentry-javascript/pull/18225))
- fix(core): Decrease number of Sentry stack frames for messages from `captureConsoleIntegration` ([#18096](https://github.com/getsentry/sentry-javascript/pull/18096))
- fix(core): Emit processed metric ([#18222](https://github.com/getsentry/sentry-javascript/pull/18222))
- fix(core): Ensure logs past `MAX_LOG_BUFFER_SIZE` are not swallowed ([#18207](https://github.com/getsentry/sentry-javascript/pull/18207))
- fix(core): Ensure metrics past `MAX_METRIC_BUFFER_SIZE` are not swallowed ([#18212](https://github.com/getsentry/sentry-javascript/pull/18212))
- fix(core): Fix logs and metrics flush timeout starvation with continuous logging ([#18211](https://github.com/getsentry/sentry-javascript/pull/18211))
- fix(core): Flatten gen_ai.request.available_tools in google-genai ([#18194](https://github.com/getsentry/sentry-javascript/pull/18194))
- fix(core): Stringify available tools sent from vercelai ([#18197](https://github.com/getsentry/sentry-javascript/pull/18197))
- fix(core/vue): Detect and skip normalizing Vue `VNode` objects with high `normalizeDepth` ([#18206](https://github.com/getsentry/sentry-javascript/pull/18206))
- fix(nextjs): Avoid wrapping middleware files when in standalone mode ([#18172](https://github.com/getsentry/sentry-javascript/pull/18172))
- fix(nextjs): Drop meta trace tags if rendered page is ISR ([#18192](https://github.com/getsentry/sentry-javascript/pull/18192))
- fix(nextjs): Respect PORT variable for dev error symbolication ([#18227](https://github.com/getsentry/sentry-javascript/pull/18227))
- fix(nextjs): use LRU map instead of map for ISR route cache ([#18234](https://github.com/getsentry/sentry-javascript/pull/18234))
- fix(node): `tracingChannel` export missing in older node versions ([#18191](https://github.com/getsentry/sentry-javascript/pull/18191))
- fix(node): Fix Spotlight configuration precedence to match specification ([#18195](https://github.com/getsentry/sentry-javascript/pull/18195))
- fix(react): Prevent navigation span leaks for consecutive navigations ([#18098](https://github.com/getsentry/sentry-javascript/pull/18098))
- ref(react-router): Deprecate ErrorBoundary exports ([#18208](https://github.com/getsentry/sentry-javascript/pull/18208))

<details>
<summary> <strong>Internal Changes</strong> </summary>

- chore: Fix missing changelog quote we use for attribution placement ([#18237](https://github.com/getsentry/sentry-javascript/pull/18237))
- chore: move tip about prioritizing issues ([#18071](https://github.com/getsentry/sentry-javascript/pull/18071))
- chore(e2e): Pin `@embroider/addon-shim` to 1.10.0 for the e2e ember-embroider ([#18173](https://github.com/getsentry/sentry-javascript/pull/18173))
- chore(react-router): Fix casing on deprecation notices ([#18221](https://github.com/getsentry/sentry-javascript/pull/18221))
- chore(test): Use correct `testTimeout` field in bundler-tests vitest config
- chore(e2e): Bump zod in e2e tests ([#18251](https://github.com/getsentry/sentry-javascript/pull/18251))
- test(browser-integration): Fix incorrect tag value assertions ([#18162](https://github.com/getsentry/sentry-javascript/pull/18162))
- test(profiling): Add test utils to validate Profile Chunk envelope ([#18170](https://github.com/getsentry/sentry-javascript/pull/18170))
- ref(e2e-ember): Remove `@embroider/addon-shim` override ([#18180](https://github.com/getsentry/sentry-javascript/pull/18180))
- ref(browser): Move trace lifecycle listeners to class function ([#18231](https://github.com/getsentry/sentry-javascript/pull/18231))
- ref(browserprofiling): Move and rename profiler class to UIProfiler ([#18187](https://github.com/getsentry/sentry-javascript/pull/18187))
- ref(core): Move ai integrations from utils to tracing ([#18185](https://github.com/getsentry/sentry-javascript/pull/18185))
- ref(core): Optimize `Scope.setTag` bundle size and adjust test ([#18182](https://github.com/getsentry/sentry-javascript/pull/18182))

</details>

## 10.25.0

- feat(browser): Include Spotlight in development bundles ([#18078](https://github.com/getsentry/sentry-javascript/pull/18078))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
shouldSkipTracingTest,
waitForTransactionRequestOnUrl,
} from '../../../utils/helpers';
import { validateProfile } from '../test-utils';

sentryTest(
'does not send profile envelope when document-policy is not set',
Expand Down Expand Up @@ -41,79 +42,16 @@ sentryTest('sends profile envelope in legacy mode', async ({ page, getLocalTestU
const profile = profileEvent.profile;
expect(profileEvent.profile).toBeDefined();

expect(profile.samples).toBeDefined();
expect(profile.stacks).toBeDefined();
expect(profile.frames).toBeDefined();
expect(profile.thread_metadata).toBeDefined();

// Samples
expect(profile.samples.length).toBeGreaterThanOrEqual(2);
for (const sample of profile.samples) {
expect(typeof sample.elapsed_since_start_ns).toBe('string');
expect(sample.elapsed_since_start_ns).toMatch(/^\d+$/); // Numeric string
expect(parseInt(sample.elapsed_since_start_ns, 10)).toBeGreaterThanOrEqual(0);

expect(typeof sample.stack_id).toBe('number');
expect(sample.stack_id).toBeGreaterThanOrEqual(0);
expect(sample.thread_id).toBe('0'); // Should be main thread
}

// Stacks
expect(profile.stacks.length).toBeGreaterThan(0);
for (const stack of profile.stacks) {
expect(Array.isArray(stack)).toBe(true);
for (const frameIndex of stack) {
expect(typeof frameIndex).toBe('number');
expect(frameIndex).toBeGreaterThanOrEqual(0);
expect(frameIndex).toBeLessThan(profile.frames.length);
}
}

// Frames
expect(profile.frames.length).toBeGreaterThan(0);
for (const frame of profile.frames) {
expect(frame).toHaveProperty('function');
expect(typeof frame.function).toBe('string');

if (frame.function !== 'fetch' && frame.function !== 'setTimeout') {
expect(frame).toHaveProperty('abs_path');
expect(frame).toHaveProperty('lineno');
expect(frame).toHaveProperty('colno');
expect(typeof frame.abs_path).toBe('string');
expect(typeof frame.lineno).toBe('number');
expect(typeof frame.colno).toBe('number');
}
}

const functionNames = profile.frames.map(frame => frame.function).filter(name => name !== '');

if ((process.env.PW_BUNDLE || '').endsWith('min')) {
// Function names are minified in minified bundles
expect(functionNames.length).toBeGreaterThan(0);
expect((functionNames as string[]).every(name => name?.length > 0)).toBe(true); // Just make sure they're not empty strings
} else {
expect(functionNames).toEqual(
expect.arrayContaining([
'_startRootSpan',
'withScope',
'createChildOrRootSpan',
'startSpanManual',
'startProfileForSpan',
'startJSSelfProfile',
]),
);
}

expect(profile.thread_metadata).toHaveProperty('0');
expect(profile.thread_metadata['0']).toHaveProperty('name');
expect(profile.thread_metadata['0'].name).toBe('main');

// Test that profile duration makes sense (should be > 20ms based on test setup)
const startTime = parseInt(profile.samples[0].elapsed_since_start_ns, 10);
const endTime = parseInt(profile.samples[profile.samples.length - 1].elapsed_since_start_ns, 10);
const durationNs = endTime - startTime;
const durationMs = durationNs / 1_000_000; // Convert ns to ms

// Should be at least 20ms based on our setTimeout(21) in the test
expect(durationMs).toBeGreaterThan(20);
validateProfile(profile, {
expectedFunctionNames: [
'_startRootSpan',
'withScope',
'createChildOrRootSpan',
'startSpanManual',
'startProfileForSpan',
'startJSSelfProfile',
],
minSampleDurationMs: 20,
isChunkFormat: false,
});
});
Loading
Loading