Skip to content

Commit d33c795

Browse files
authored
Merge pull request #18249 from getsentry/prepare-release/10.26.0
meta(changelog): Update changelog for 10.26.0
2 parents 8e4fb8c + be12569 commit d33c795

File tree

213 files changed

+7071
-951
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

213 files changed

+7071
-951
lines changed

.github/ISSUE_TEMPLATE/bug.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,14 @@ body:
136136
id: additional
137137
attributes:
138138
label: Additional Context
139-
description:
140-
Add any other context here. Please keep the pre-filled text, which helps us manage issue prioritization.
141-
value: |-
142-
<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>
139+
description: Add any other context here.
143140
validations:
144141
required: false
145-
- type: markdown
142+
- type: dropdown
146143
attributes:
147-
value: |-
148-
## Thanks 🙏
144+
label: 'Priority'
145+
description: Please keep the pre-filled option, which helps us manage issue prioritization.
146+
default: 0
147+
options:
148+
- <sub>React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1`
149+
or `me too`, to help us triage it.</sub>

.github/ISSUE_TEMPLATE/feature.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ body:
2727
id: additional
2828
attributes:
2929
label: Additional Context
30-
description:
31-
Add any other context here. Please keep the pre-filled text, which helps us manage feature prioritization.
32-
value: |-
33-
<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>
30+
description: Add any other context here.
3431
validations:
3532
required: false
36-
- type: markdown
33+
- type: dropdown
3734
attributes:
38-
value: |-
39-
## Thanks 🙏
40-
Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
35+
label: 'Priority'
36+
description: Please keep the pre-filled option, which helps us manage issue prioritization.
37+
default: 0
38+
options:
39+
- <sub>React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1`
40+
or `me too`, to help us triage it.</sub>

.size-limit.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ module.exports = [
3838
path: 'packages/browser/build/npm/esm/prod/index.js',
3939
import: createImport('init', 'browserTracingIntegration'),
4040
gzip: true,
41-
limit: '41.3 KB',
41+
limit: '41.38 KB',
4242
},
4343
{
4444
name: '@sentry/browser (incl. Tracing, Profiling)',
@@ -127,7 +127,7 @@ module.exports = [
127127
import: createImport('init', 'ErrorBoundary', 'reactRouterV6BrowserTracingIntegration'),
128128
ignore: ['react/jsx-runtime'],
129129
gzip: true,
130-
limit: '43.3 KB',
130+
limit: '43.33 KB',
131131
},
132132
// Vue SDK (ESM)
133133
{
@@ -142,7 +142,7 @@ module.exports = [
142142
path: 'packages/vue/build/esm/index.js',
143143
import: createImport('init', 'browserTracingIntegration'),
144144
gzip: true,
145-
limit: '43.1 KB',
145+
limit: '43.2 KB',
146146
},
147147
// Svelte SDK (ESM)
148148
{
@@ -240,7 +240,7 @@ module.exports = [
240240
import: createImport('init'),
241241
ignore: [...builtinModules, ...nodePrefixedBuiltinModules],
242242
gzip: true,
243-
limit: '158 KB',
243+
limit: '160 KB',
244244
},
245245
{
246246
name: '@sentry/node - without tracing',

CHANGELOG.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,102 @@
44

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

7+
## 10.26.0
8+
9+
### Important Changes
10+
11+
- **feat(core): Instrument LangGraph Agent ([#18114](https://github.com/getsentry/sentry-javascript/pull/18114))**
12+
13+
Adds support for instrumenting LangGraph StateGraph operations in Node. The LangGraph integration can be configured as follows:
14+
15+
```js
16+
Sentry.init({
17+
dsn: '__DSN__',
18+
sendDefaultPii: false, // Even with PII disabled globally
19+
integrations: [
20+
Sentry.langGraphIntegration({
21+
recordInputs: true, // Force recording input messages
22+
recordOutputs: true, // Force recording response text
23+
}),
24+
],
25+
});
26+
```
27+
28+
- **feat(cloudflare/vercel-edge): Add manual instrumentation for LangGraph ([#18112](https://github.com/getsentry/sentry-javascript/pull/18112))**
29+
30+
Instrumentation for LangGraph in Cloudflare Workers and Vercel Edge environments is supported by manually calling `instrumentLangGraph`:
31+
32+
```js
33+
import * as Sentry from '@sentry/cloudflare'; // or '@sentry/vercel-edge'
34+
import { StateGraph, START, END, MessagesAnnotation } from '@langchain/langgraph';
35+
36+
// Create and instrument the graph
37+
const graph = new StateGraph(MessagesAnnotation)
38+
.addNode('agent', agentFn)
39+
.addEdge(START, 'agent')
40+
.addEdge('agent', END);
41+
42+
Sentry.instrumentLangGraph(graph, {
43+
recordInputs: true,
44+
recordOutputs: true,
45+
});
46+
47+
const compiled = graph.compile({ name: 'weather_assistant' });
48+
49+
await compiled.invoke({
50+
messages: [{ role: 'user', content: 'What is the weather in SF?' }],
51+
});
52+
```
53+
54+
- **feat(node): Add OpenAI SDK v6 support ([#18244](https://github.com/getsentry/sentry-javascript/pull/18244))**
55+
56+
### Other Changes
57+
58+
- feat(core): Support OpenAI embeddings API ([#18224](https://github.com/getsentry/sentry-javascript/pull/18224))
59+
- feat(browser-utils): bump web-vitals to 5.1.0 ([#18091](https://github.com/getsentry/sentry-javascript/pull/18091))
60+
- feat(core): Support truncation for LangChain integration request messages ([#18157](https://github.com/getsentry/sentry-javascript/pull/18157))
61+
- feat(metrics): Add default `server.address` attribute on server runtimes ([#18242](https://github.com/getsentry/sentry-javascript/pull/18242))
62+
- feat(nextjs): Add URL to server-side transaction events ([#18230](https://github.com/getsentry/sentry-javascript/pull/18230))
63+
- feat(node-core): Add mechanism to prevent wrapping ai providers multiple times([#17972](https://github.com/getsentry/sentry-javascript/pull/17972))
64+
- feat(replay): Bump limit for minReplayDuration ([#18190](https://github.com/getsentry/sentry-javascript/pull/18190))
65+
- fix(browser): Add `ok` status to successful `idleSpan`s ([#18139](https://github.com/getsentry/sentry-javascript/pull/18139))
66+
- fix(core): Check `fetch` support with data URL ([#18225](https://github.com/getsentry/sentry-javascript/pull/18225))
67+
- fix(core): Decrease number of Sentry stack frames for messages from `captureConsoleIntegration` ([#18096](https://github.com/getsentry/sentry-javascript/pull/18096))
68+
- fix(core): Emit processed metric ([#18222](https://github.com/getsentry/sentry-javascript/pull/18222))
69+
- fix(core): Ensure logs past `MAX_LOG_BUFFER_SIZE` are not swallowed ([#18207](https://github.com/getsentry/sentry-javascript/pull/18207))
70+
- fix(core): Ensure metrics past `MAX_METRIC_BUFFER_SIZE` are not swallowed ([#18212](https://github.com/getsentry/sentry-javascript/pull/18212))
71+
- fix(core): Fix logs and metrics flush timeout starvation with continuous logging ([#18211](https://github.com/getsentry/sentry-javascript/pull/18211))
72+
- fix(core): Flatten gen_ai.request.available_tools in google-genai ([#18194](https://github.com/getsentry/sentry-javascript/pull/18194))
73+
- fix(core): Stringify available tools sent from vercelai ([#18197](https://github.com/getsentry/sentry-javascript/pull/18197))
74+
- fix(core/vue): Detect and skip normalizing Vue `VNode` objects with high `normalizeDepth` ([#18206](https://github.com/getsentry/sentry-javascript/pull/18206))
75+
- fix(nextjs): Avoid wrapping middleware files when in standalone mode ([#18172](https://github.com/getsentry/sentry-javascript/pull/18172))
76+
- fix(nextjs): Drop meta trace tags if rendered page is ISR ([#18192](https://github.com/getsentry/sentry-javascript/pull/18192))
77+
- fix(nextjs): Respect PORT variable for dev error symbolication ([#18227](https://github.com/getsentry/sentry-javascript/pull/18227))
78+
- fix(nextjs): use LRU map instead of map for ISR route cache ([#18234](https://github.com/getsentry/sentry-javascript/pull/18234))
79+
- fix(node): `tracingChannel` export missing in older node versions ([#18191](https://github.com/getsentry/sentry-javascript/pull/18191))
80+
- fix(node): Fix Spotlight configuration precedence to match specification ([#18195](https://github.com/getsentry/sentry-javascript/pull/18195))
81+
- fix(react): Prevent navigation span leaks for consecutive navigations ([#18098](https://github.com/getsentry/sentry-javascript/pull/18098))
82+
- ref(react-router): Deprecate ErrorBoundary exports ([#18208](https://github.com/getsentry/sentry-javascript/pull/18208))
83+
84+
<details>
85+
<summary> <strong>Internal Changes</strong> </summary>
86+
87+
- chore: Fix missing changelog quote we use for attribution placement ([#18237](https://github.com/getsentry/sentry-javascript/pull/18237))
88+
- chore: move tip about prioritizing issues ([#18071](https://github.com/getsentry/sentry-javascript/pull/18071))
89+
- chore(e2e): Pin `@embroider/addon-shim` to 1.10.0 for the e2e ember-embroider ([#18173](https://github.com/getsentry/sentry-javascript/pull/18173))
90+
- chore(react-router): Fix casing on deprecation notices ([#18221](https://github.com/getsentry/sentry-javascript/pull/18221))
91+
- chore(test): Use correct `testTimeout` field in bundler-tests vitest config
92+
- chore(e2e): Bump zod in e2e tests ([#18251](https://github.com/getsentry/sentry-javascript/pull/18251))
93+
- test(browser-integration): Fix incorrect tag value assertions ([#18162](https://github.com/getsentry/sentry-javascript/pull/18162))
94+
- test(profiling): Add test utils to validate Profile Chunk envelope ([#18170](https://github.com/getsentry/sentry-javascript/pull/18170))
95+
- ref(e2e-ember): Remove `@embroider/addon-shim` override ([#18180](https://github.com/getsentry/sentry-javascript/pull/18180))
96+
- ref(browser): Move trace lifecycle listeners to class function ([#18231](https://github.com/getsentry/sentry-javascript/pull/18231))
97+
- ref(browserprofiling): Move and rename profiler class to UIProfiler ([#18187](https://github.com/getsentry/sentry-javascript/pull/18187))
98+
- ref(core): Move ai integrations from utils to tracing ([#18185](https://github.com/getsentry/sentry-javascript/pull/18185))
99+
- ref(core): Optimize `Scope.setTag` bundle size and adjust test ([#18182](https://github.com/getsentry/sentry-javascript/pull/18182))
100+
101+
</details>
102+
7103
## 10.25.0
8104

9105
- feat(browser): Include Spotlight in development bundles ([#18078](https://github.com/getsentry/sentry-javascript/pull/18078))

dev-packages/browser-integration-tests/suites/profiling/legacyMode/test.ts

Lines changed: 13 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
shouldSkipTracingTest,
77
waitForTransactionRequestOnUrl,
88
} from '../../../utils/helpers';
9+
import { validateProfile } from '../test-utils';
910

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

44-
expect(profile.samples).toBeDefined();
45-
expect(profile.stacks).toBeDefined();
46-
expect(profile.frames).toBeDefined();
47-
expect(profile.thread_metadata).toBeDefined();
48-
49-
// Samples
50-
expect(profile.samples.length).toBeGreaterThanOrEqual(2);
51-
for (const sample of profile.samples) {
52-
expect(typeof sample.elapsed_since_start_ns).toBe('string');
53-
expect(sample.elapsed_since_start_ns).toMatch(/^\d+$/); // Numeric string
54-
expect(parseInt(sample.elapsed_since_start_ns, 10)).toBeGreaterThanOrEqual(0);
55-
56-
expect(typeof sample.stack_id).toBe('number');
57-
expect(sample.stack_id).toBeGreaterThanOrEqual(0);
58-
expect(sample.thread_id).toBe('0'); // Should be main thread
59-
}
60-
61-
// Stacks
62-
expect(profile.stacks.length).toBeGreaterThan(0);
63-
for (const stack of profile.stacks) {
64-
expect(Array.isArray(stack)).toBe(true);
65-
for (const frameIndex of stack) {
66-
expect(typeof frameIndex).toBe('number');
67-
expect(frameIndex).toBeGreaterThanOrEqual(0);
68-
expect(frameIndex).toBeLessThan(profile.frames.length);
69-
}
70-
}
71-
72-
// Frames
73-
expect(profile.frames.length).toBeGreaterThan(0);
74-
for (const frame of profile.frames) {
75-
expect(frame).toHaveProperty('function');
76-
expect(typeof frame.function).toBe('string');
77-
78-
if (frame.function !== 'fetch' && frame.function !== 'setTimeout') {
79-
expect(frame).toHaveProperty('abs_path');
80-
expect(frame).toHaveProperty('lineno');
81-
expect(frame).toHaveProperty('colno');
82-
expect(typeof frame.abs_path).toBe('string');
83-
expect(typeof frame.lineno).toBe('number');
84-
expect(typeof frame.colno).toBe('number');
85-
}
86-
}
87-
88-
const functionNames = profile.frames.map(frame => frame.function).filter(name => name !== '');
89-
90-
if ((process.env.PW_BUNDLE || '').endsWith('min')) {
91-
// Function names are minified in minified bundles
92-
expect(functionNames.length).toBeGreaterThan(0);
93-
expect((functionNames as string[]).every(name => name?.length > 0)).toBe(true); // Just make sure they're not empty strings
94-
} else {
95-
expect(functionNames).toEqual(
96-
expect.arrayContaining([
97-
'_startRootSpan',
98-
'withScope',
99-
'createChildOrRootSpan',
100-
'startSpanManual',
101-
'startProfileForSpan',
102-
'startJSSelfProfile',
103-
]),
104-
);
105-
}
106-
107-
expect(profile.thread_metadata).toHaveProperty('0');
108-
expect(profile.thread_metadata['0']).toHaveProperty('name');
109-
expect(profile.thread_metadata['0'].name).toBe('main');
110-
111-
// Test that profile duration makes sense (should be > 20ms based on test setup)
112-
const startTime = parseInt(profile.samples[0].elapsed_since_start_ns, 10);
113-
const endTime = parseInt(profile.samples[profile.samples.length - 1].elapsed_since_start_ns, 10);
114-
const durationNs = endTime - startTime;
115-
const durationMs = durationNs / 1_000_000; // Convert ns to ms
116-
117-
// Should be at least 20ms based on our setTimeout(21) in the test
118-
expect(durationMs).toBeGreaterThan(20);
45+
validateProfile(profile, {
46+
expectedFunctionNames: [
47+
'_startRootSpan',
48+
'withScope',
49+
'createChildOrRootSpan',
50+
'startSpanManual',
51+
'startProfileForSpan',
52+
'startJSSelfProfile',
53+
],
54+
minSampleDurationMs: 20,
55+
isChunkFormat: false,
56+
});
11957
});

0 commit comments

Comments
 (0)