Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1108 commits
Select commit Hold shift + click to select a range
02151f5
test(e2e): Port plain browser and bundler E2E apps to span streaming …
msonnb Sep 7, 2026
e57d55c
test(e2e): Port the nestjs-fastify E2E app to span streaming (#24100)
chargome Sep 7, 2026
492b5e1
fix(core): Guard `loadModule` default parameter against ESM scope (#2…
chargome Sep 7, 2026
d54b9fd
test(e2e): Port the nestjs-with-submodules-decorator E2E app to span …
chargome Sep 7, 2026
37118dd
test(e2e): Port the nestjs-basic-with-graphql E2E app to span streami…
chargome Sep 7, 2026
98330de
feat(node): Add first-party Mastra integration (#23823)
RulaKhaled Sep 7, 2026
64d9de9
test(e2e): Port the astro-6-cf-workers E2E app to span streaming (#24…
andreiborza Sep 7, 2026
9851d64
fix(astro): Fall back to `dataCollection.userInfo` for `trackClientIp…
s1gr1d Sep 7, 2026
93b61c8
feat(react): Add `@sentry/react/react-router` entry with automatic Re…
mydea Sep 7, 2026
d12e188
ref(core)!: Remove orphaned deprecated Express patch APIs (#23827)
mydea Sep 7, 2026
a41cabf
fix(deno): Don't throw in Deno.serve wrapper when no client is bound …
JosephDoUrden Sep 7, 2026
a6ab29d
fix(cloudflare): Auto-instrument classes re-exported from the worker …
JPeer264 Sep 7, 2026
59496e0
feat(wasm): patch non-streaming load paths (#23767)
d2anamaria Sep 7, 2026
cba23b3
test(e2e): Port the nestjs-8 E2E app to span streaming (#24097)
chargome Sep 7, 2026
af6b5fd
test(e2e): Restore dropped url attribute assertions in the astro-4 an…
andreiborza Sep 7, 2026
15b8834
test(e2e): Port the astro-7 E2E app to span streaming (#24076)
andreiborza Sep 7, 2026
46d5219
ref(core)!: Make `attributes` in sampling context required (#24153)
mydea Sep 7, 2026
6098938
fix(ember): Guard `routerService.recognize()` against unrecognizable …
aklkv Sep 7, 2026
9596f42
ref(node): Remove two Node <20 leftovers (hrtime.bigint, undici chann…
wittachai-as Sep 7, 2026
0e82bbf
fix(node): Bootstrap Mastra observability under ESM (#24177)
mydea Sep 8, 2026
51b5a95
test(e2e): Migrate Fastify to span streaming (#24159)
msonnb Sep 8, 2026
b7173ce
test(e2e): Migrate Effect to span streaming (#24161)
msonnb Sep 8, 2026
e8b8328
test(e2e): Migrate Firebase and Electron fixtures to span streaming (…
msonnb Sep 8, 2026
fe8a4a3
test(e2e): Port the nestjs-microservices E2E app to span streaming (#…
chargome Sep 8, 2026
c5fce74
test(e2e): Preserve static Express coverage (#24155)
msonnb Sep 8, 2026
85a4d11
test(e2e): Migrate Elysia to span streaming (#24162)
msonnb Sep 8, 2026
c145409
test(e2e): Port the nestjs-bullmq E2E app to span streaming (#24107)
chargome Sep 8, 2026
f52fb3a
test(e2e): Add a sveltekit-2-otlp E2E app (#24184)
chargome Sep 8, 2026
64fb9d1
test(e2e): Port the nestjs-basic E2E app to span streaming (#24099)
chargome Sep 8, 2026
f8619a5
test(e2e): Migrate Hono to span streaming (#24163)
msonnb Sep 8, 2026
668ea47
test(e2e): Update live ingestion verification for span streaming (#24…
msonnb Sep 8, 2026
684c7f2
ci(deps-dev): Bump @sveltejs/kit from 2.52.2 to 2.70.2 in /dev-packag…
dependabot[bot] Sep 8, 2026
046b6d0
fix(server-utils): Gate `gen_ai.tool.definitions` on `dataCollection.…
s1gr1d Sep 8, 2026
8c4c10a
fix(core): Stop `supabaseIntegration` from ending spans twice (#24126)
chargome Sep 8, 2026
2e1fe4c
test(e2e): Cover error, log and metric trace linking in the nextjs-ot…
chargome Sep 8, 2026
f100c7c
test(e2e): Port the nestjs-12 E2E app to span streaming (#24098)
chargome Sep 8, 2026
ac123ed
feat(nextjs)!: Drop `vercel-` prefix from default environment and dep…
chargome Sep 8, 2026
ec50b3e
feat(nuxt)!: Bundle server config into Nitro build (#24094)
s1gr1d Sep 8, 2026
d05feeb
docs: Fix inaccuracies in the v11 migration guide (#24186)
andreiborza Sep 8, 2026
3a3817b
test(e2e): Migrate Koa and Hapi to span streaming (#24160)
msonnb Sep 8, 2026
a53ea7a
test(e2e): Migrate Express ESM variants to span streaming (#24158)
msonnb Sep 8, 2026
a152971
test(e2e): Migrate Express 4 and TSX to span streaming (#24156)
msonnb Sep 8, 2026
6376ee0
test(e2e): Migrate Express 5 and MCP to span streaming (#24157)
msonnb Sep 8, 2026
a6bdd98
fix(server-utils): Keep qualified table names in `db.query.summary` (…
Lms24 Sep 8, 2026
701be20
fix(server-utils): Pass the SQL dialect when summarizing Prisma queri…
Lms24 Sep 8, 2026
05e9fce
fix(remix): Strip trailing underscore from route segments (#24123)
chargome Sep 8, 2026
6e3a4e3
feat(google-cloud-serverless): Emit low cardinality `function.gcp` sp…
Lms24 Sep 8, 2026
960385c
feat(server-utils): Emit low cardinality `function.gcp` span names fo…
Lms24 Sep 8, 2026
03aaf42
feat(aws-serverless): Emit low cardinality `function.aws` span names …
Lms24 Sep 8, 2026
18437c8
docs(deno): Make --preload not experimental (#24215)
JPeer264 Sep 8, 2026
81a3b26
test: Fix flaky nuxt-3 test (#24201)
mydea Sep 9, 2026
e4bf207
fix(browser): Set `user_agent.original` on all spans for consistent f…
Lms24 Sep 9, 2026
c3e0818
fix(nextjs): Keep the Pages Router runtime out of App Router client b…
chargome Sep 9, 2026
516a674
fix(nextjs): Keep router.back/forward navigation type under span stre…
chargome Sep 9, 2026
ee5d353
fix(nuxt): Import from `#imports/server` in `addMiddlewareImports()` …
s1gr1d Sep 9, 2026
8f7542e
Merge remote-tracking branch 'origin/develop' into t3code/eddb549d
s1gr1d Sep 9, 2026
17030c5
test(e2e): Use collectStreamedSpansUntilSegment helper in nitro-3 tests
s1gr1d Sep 9, 2026
3a9c24d
Merge pull request #23946 from getsentry/sig/e2e-tests-nitro-3
s1gr1d Sep 9, 2026
aa191b1
test(e2e): Fix node-firebase span name expectations for span streamin…
Lms24 Sep 9, 2026
52e26df
test(e2e): Tell the two nestjs-basic interceptor specs traces apart (…
chargome Sep 9, 2026
70d4f0c
ref(cloudflare): Add whitespace in warning (#24209)
JPeer264 Sep 9, 2026
a9b50dd
test(e2e): Port the nestjs-distributed-tracing E2E app to span stream…
chargome Sep 9, 2026
4e23004
fix(profiling-node): Bump @sentry/node-cpu-profiler to 2.4.4 (#24229)
chargome Sep 9, 2026
c00a694
fix(sveltekit): Resolve the Cloudflare execution context without `eve…
chargome Sep 9, 2026
e4a55c3
ref(node): Fix flaky ANR stop-and-restart test with deterministic wor…
mydea Sep 9, 2026
9871c8e
fix(server-utils): Always sanitize inline literals out of `db.query.t…
s1gr1d Sep 9, 2026
3cbefca
test(e2e): Migrate nuxt-3-top-level-import to span streaming (#23948)
s1gr1d Sep 9, 2026
4086ff4
fix(browser): End the active idle span on pagehide (#23779)
logaretm Sep 9, 2026
40a6c85
test(e2e): Port the nestjs-with-submodules E2E app to span streaming …
chargome Sep 9, 2026
824ebf3
ref: Add `sanitizeSqlQueryWithSummary` helper and DB bugbot rule (#24…
s1gr1d Sep 9, 2026
1edada7
fix(deno): Gate tracing integrations on hasSpansEnabled (#24070)
JosephDoUrden Sep 9, 2026
67ede89
feat(browser): Report web vitals for soft navigations (#23425)
logaretm Sep 9, 2026
376d6a6
fix(core): Attribute errors to the span they escaped (#23666)
logaretm Sep 10, 2026
51d99e1
fix(node): Distinguish isolated transform failures from bundling in t…
mydea Sep 10, 2026
94a3244
chore(deps): Bump hono from 4.12.34 to 4.13.5 (#24234)
dependabot[bot] Sep 10, 2026
c270736
fix(server-utils): Sanitize PostgreSQL dollar-quoted strings in `db.q…
s1gr1d Sep 10, 2026
dccf25d
test(e2e): Port Ember E2E apps to span streaming (#24168)
RulaKhaled Sep 10, 2026
d3c6689
fix(server-utils): Sanitize SQL Server bracketed identifiers (#24255)
s1gr1d Sep 10, 2026
fa0fb93
test(e2e): Keep a static-lifecycle copy of the Vue 3 E2E app (#24166)
RulaKhaled Sep 10, 2026
b436274
test(e2e): Keep a static-lifecycle copy of the TanStack Start React E…
RulaKhaled Sep 10, 2026
31e0397
test(e2e): Port the Vue 3 E2E app to span streaming (#24169)
RulaKhaled Sep 10, 2026
4e2fa6b
fix(nextjs): Only include emitted chunk directories in Turbopack sour…
chargome Sep 10, 2026
95c7838
chore(deps-dev): Bump next from 15.5.21 to 15.5.24 in /packages/nextj…
chargome Sep 10, 2026
9d373ea
fix(server-utils): Forward `resolveId` options in the orchestrion Rol…
s1gr1d Sep 10, 2026
3eb9e55
docs(react-router): Remove beta label from README (#24300)
chargome Sep 10, 2026
92d3a99
docs: Fix stale AI integration paths and patterns in AGENTS.md and ad…
RulaKhaled Sep 10, 2026
3eeea0e
fix(core): Normalize http header attribute keys according to OTel spe…
Lms24 Sep 10, 2026
290fa7e
test(nuxt): Add ofetch as dependency (#24304)
s1gr1d Sep 10, 2026
56fc088
fix(browser): Release the XHR `virtualError` once the request complet…
logaretm Sep 10, 2026
b75f4bb
test(e2e): Fix stale mysql query-text assertion in tanstackstart-reac…
timfish Sep 10, 2026
207fb91
ci(size-limit): Run size-limit action on node24 (#24308)
mydea Sep 10, 2026
9428d80
fix(node): Register diagnostics-channel injection in `NodeClient` con…
timfish Sep 10, 2026
5569d9a
feat(nestjs): Add `code.function.name` attribute to `function` spans …
Lms24 Sep 10, 2026
0046d17
feat(browser): Start a navigation span for bfcache restores (#23748)
logaretm Sep 10, 2026
0ea2987
feat(browser): Report web vitals for bfcache restores (#23750)
logaretm Sep 10, 2026
433049b
feat(angular): Emit low cardinality `TraceMethod` span name and prese…
Lms24 Sep 10, 2026
29de504
feat(deps): Bump `@sentry/conventions` to 0.23.0 (#24321)
Lms24 Sep 10, 2026
0eb7c04
test(e2e): Port the TanStack Start React E2E app to span streaming (#…
RulaKhaled Sep 11, 2026
413eed2
chore(size-limit-action): Resolve baseline by walking git history (#2…
mydea Sep 11, 2026
00557bf
feat(deno): Add conversationIdIntegration to default integrations (#2…
mydea Sep 11, 2026
7dadc71
docs: Tighten PR-description and comment guidance in AGENTS.md (#24329)
mydea Sep 11, 2026
2a58493
fix(node): Skip registration-only instrumentations in the runtime loa…
mydea Sep 11, 2026
04fecaa
feat(node): Enable dataloader and knex integrations by default (#24312)
mydea Sep 11, 2026
900a5c3
test(e2e): Port the TanStack Start Cloudflare E2E app to span streami…
RulaKhaled Sep 11, 2026
57953fd
feat(solid-start): Add `code.function.name` attribute to solid-start …
Lms24 Sep 11, 2026
b466218
fix(effect): Remove span op fallback to `function` (#24263)
Lms24 Sep 11, 2026
8e89e19
fix(bundler-plugins): Stamp debug IDs onto emitted source maps when `…
msonnb Sep 11, 2026
41c40b3
test(eve): Add e2e test for node-eve (#24228)
mydea Sep 11, 2026
fd00e5d
test(node): Port express error-handling suites to span streaming (#24…
chargome Sep 11, 2026
a16ab3c
test(node): Port express maxIncomingRequestBodySize suite to span str…
chargome Sep 11, 2026
6a68683
test(e2e): Port the Vue TanStack Router E2E app to span streaming (#2…
RulaKhaled Sep 11, 2026
a72af87
feat(core): Accept `CollectBehavior` shorthand for `dataCollection.ht…
chargome Sep 11, 2026
357b211
test(nextjs): Add E2E assertions for `use cache` functions (#24301)
s1gr1d Sep 11, 2026
fb68924
test(vue): Guard no Options API tests so they don't timeout (#24342)
s1gr1d Sep 11, 2026
4977731
feat(nextjs): Record cache spans for `use cache` functions (#24302)
s1gr1d Sep 11, 2026
9d51f92
test(e2e): Migrate nuxt-3-min to span streaming (#23953)
s1gr1d Sep 11, 2026
bd79eb1
ref(browser): Use conventions constants for browser navigation attrib…
logaretm Sep 11, 2026
3ef0960
test(node): Port express tracing suites to span streaming (#24192)
chargome Sep 11, 2026
d958f5e
feat(bun): Capture Bun.serve request bodies with `maxRequestBodySize`…
JosephDoUrden Sep 11, 2026
290bf50
feat(nextjs): Emit low cardinality `function` span names (#24319)
Lms24 Sep 11, 2026
b458319
feat(nextjs): Emit low cardinality `function` span names for server c…
Lms24 Sep 11, 2026
79a412b
feat(cloudflare): Emit low cardinality `function` span names and pres…
Lms24 Sep 11, 2026
aa69e64
feat(sveltekit): Emit low cardinality `function` spans (#24341)
Lms24 Sep 11, 2026
598ee85
feat(deno): instrument outgoing fetch requests (#24121)
psang39 Sep 11, 2026
ac76e42
test(e2e): Add Fastify v6 e2e app (#24245)
chargome Sep 11, 2026
53ce5cf
fix(browser): Keep the best element name captured for an interaction …
logaretm Sep 11, 2026
65631dc
test: Upgrade Playwright to 1.63 and fix the Chromium 153 fallout (#2…
logaretm Sep 11, 2026
eb0f7e8
test(e2e): Cover soft navigation web vitals across router instrumenta…
logaretm Sep 11, 2026
dca0166
feat(browser)!: Report web vitals for bfcache restores by default (#2…
logaretm Sep 11, 2026
1e9d407
feat(node): Add `eveConversationHook()` to link eve sessions as Sentr…
mydea Sep 14, 2026
5cded57
feat(node): Add `getInstrumentedModuleNames()` (#24254)
mydea Sep 14, 2026
b2edcf8
test(e2e/node-eve): Assert a manual span nests under gen_ai.execute_t…
mydea Sep 14, 2026
cedfe2d
chore(size-limit): weekly auto-bump (#24331)
javascript-sdk-gitflow[bot] Sep 14, 2026
2728c65
test(cloudflare): Pin ai-chat on cloudflare-agent tests (#24345)
JPeer264 Sep 14, 2026
519a1a4
fix(nitro): Import from nitro/h3 instead of h3 directly (#24361)
JPeer264 Sep 14, 2026
17c56c7
chore: Add external contributor to CHANGELOG.md (#24264)
javascript-sdk-gitflow[bot] Sep 14, 2026
65fc6d4
test(e2e): Fix header attribute keys in node-fastify-6 tests (#24363)
chargome Sep 14, 2026
4db09b7
chore: Add external contributor to CHANGELOG.md (#24364)
JPeer264 Sep 14, 2026
9bc0881
test(node): Port fastify, koa, hapi, hono and lru-memoizer suites to …
chargome Sep 14, 2026
de1e244
fix(server-utils): Read AI SDK cache token counts in Vercel AI channe…
sergical Sep 14, 2026
f63422b
test(node): Cover Vercel AI v7 cache tokens from the SDK usage object…
mydea Sep 14, 2026
5c478b7
fix(nuxt): Remove setting `moduleSideEffects` in Nuxt 5 / Nitro 3 (#2…
s1gr1d Sep 14, 2026
c05656f
test(node): Add Mastra e2e test app (#24362)
mydea Sep 14, 2026
1c9be8a
fix(react): Don't rename a navigation span with another location's ro…
logaretm Sep 14, 2026
4c64ad6
fix(google-genai): Map messages to the gen_ai conventions (#24352)
logaretm Sep 14, 2026
68a3af5
fix(node): Don't recurse in logAndExitProcess on a broken stdio pipe …
logaretm Sep 14, 2026
f97122f
feat(server-utils): Ensure Mastra tool/model spans are correctly nest…
mydea Sep 15, 2026
f697f0c
feat(server-utils): Add first-party Flue instrumentation (#24265)
RulaKhaled Sep 15, 2026
a1431f2
chore: Ensure new tests are not using transactions (#24380)
mydea Sep 15, 2026
0ce7f6c
feat(effect): Capture errors through the Effect v4 ErrorReporter API …
JPeer264 Sep 15, 2026
982b514
test(e2e): Port the TanStack Router E2E app to span streaming (#24171)
RulaKhaled Sep 15, 2026
ecae057
feat(node): Add Mistral AI integration (#24243)
nicohrubec Sep 15, 2026
77fc816
test(e2e): Add a Mistral E2E app covering both instrumentation paths …
RulaKhaled Sep 15, 2026
77e36ac
chore(browser-utils): Retarget `_trackNavigator` TODO to v12 (#24385)
chargome Sep 15, 2026
2df2ac9
feat(aws-serverless)!: Emit `faas.invocation_id` and `cloud.resource_…
chargome Sep 15, 2026
d7ae1bd
ref: Align ContextLines fallback with dataCollection default (#24390)
chargome Sep 15, 2026
14474fe
feat(browser)!: Record console breadcrumbs via consoleIntegration (#2…
chargome Sep 15, 2026
8cf5d24
feat(deno)!: Record console breadcrumbs via consoleIntegration (#24388)
chargome Sep 15, 2026
5c69b5f
feat(remix): Emit low cardinality `function` span names (#24323)
Lms24 Sep 15, 2026
1ed3384
feat(ember): Give component definition lookups their own span op (#24…
Lms24 Sep 15, 2026
7267c25
fix(core): Set http header span attributes as string arrays (#24231)
Lms24 Sep 15, 2026
54e2202
test(node): Assert express http header attributes as arrays (#24416)
mydea Sep 16, 2026
6d84503
test(e2e): Fix react-send-to-sentry and debug-id-sourcemaps tests (#2…
chargome Sep 16, 2026
e181b61
test(e2e): Speed up Supabase setup (#24394)
Andarist Sep 16, 2026
0fa9f19
chore: Add external contributor to CHANGELOG.md (#24421)
javascript-sdk-gitflow[bot] Sep 16, 2026
0e51f82
feat(server-utils): Capture errors thrown in Mastra (#24374)
mydea Sep 16, 2026
9928748
chore(test): mock @sentry/core in ember test (#24406)
isaacs Sep 16, 2026
06b4550
ref(server-utils)!: Stop setting `koa.name` on Koa spans (#24420)
chargome Sep 16, 2026
8fdb13f
ref(server-utils): Import `messaging.destination_kind` from conventio…
chargome Sep 16, 2026
f7c59da
chore: Retarget `sentry.previous_trace` TODOs to v12 (#24392)
chargome Sep 16, 2026
0b170ee
ref(server-utils): Share `isReadableStream` between AI instrumentatio…
chargome Sep 16, 2026
5c17dbe
feat(cloudflare): Bootstrap Mastra observability in bundled workers (…
mydea Sep 16, 2026
6513765
feat(cloudflare): Instrument module-scope orchestrion channels on wor…
mydea Sep 16, 2026
ab911ab
test(e2e): Expect array header attributes in node-fastify-6 tests (#2…
chargome Sep 16, 2026
013da57
fix(core): Set http cookie header attributes as string arrays (#24435)
JPeer264 Sep 16, 2026
2cbf219
perf(bundler-plugins): Use fast component annotation for all Rollup a…
timfish Sep 16, 2026
14e3a7e
feat(core): consolidate fetch integrations (#24346)
isaacs Sep 16, 2026
471157a
fix(cloudflare): Instrument namespaces returned by jurisdiction() (#2…
msnelling Sep 17, 2026
2b3c3a6
chore: Add external contributor to CHANGELOG.md (#24453)
javascript-sdk-gitflow[bot] Sep 17, 2026
8317107
test(server-utils): Cover the Flue instrumentation (#24266)
RulaKhaled Sep 17, 2026
a6571ee
test(e2e): Add a node-flue end-to-end application (#24377)
RulaKhaled Sep 17, 2026
99d40f8
fix(cloudflare): Capture telemetry from untraced Durable Object RPC c…
msnelling Sep 17, 2026
08fef6d
fix(nextjs): Resolve Next.js version relative to the SDK when cwd dif…
chargome Sep 17, 2026
c94fd11
fix(nuxt): Stop importing h3 in the Nitro error hook (#24283)
s1gr1d Sep 17, 2026
4aa485c
test(node): Run koa integration tests against koa 3 (#24457)
chargome Sep 17, 2026
5dc2165
feat(deps): bump devalue from 5.9.0 to 5.9.2 (#24486)
dependabot[bot] Sep 18, 2026
23fe2c2
feat(node): Add Groq and Together AI integrations (#24454)
mydea Sep 18, 2026
fc7291b
test(test-utils): Add Sentry CLI trace helpers as `test-utils/cli` (#…
JPeer264 Sep 18, 2026
db6a395
test(cloudflare): Add E2E test that deploys a real Worker and sends t…
JPeer264 Sep 18, 2026
7de3c72
fix(hono): Allow @cloudflare/workers-types v5 as peer dependency (#24…
JPeer264 Sep 18, 2026
344be6b
fix(nextjs): Prevent sourceMappingURL stripping from truncating minif…
oesnuj Sep 18, 2026
1e68915
chore: Add external contributor to CHANGELOG.md (#24502)
javascript-sdk-gitflow[bot] Sep 18, 2026
320ac4a
chore(bundler-plugins): move traces sample rate from 1.0 to 0.3 (#24488)
shellmayr Sep 18, 2026
1b2f6bd
fix(core): correct MCP error and request attribution (#24493)
betegon Sep 18, 2026
ceb8517
fix(core): instrument MCP transports before start (#23978)
betegon Sep 18, 2026
ed586c1
feat(remix): Upload source maps from the Vite plugin (#24463)
chargome Sep 18, 2026
61decb7
test(remix): Add source map upload e2e test app (#24464)
chargome Sep 18, 2026
883c344
fix(nextjs): Align tunnel request matching in middleware with tunnel …
chargome Sep 18, 2026
479d918
feat(browser)!: Report `browser.navigation.type` exactly as web-vital…
logaretm Sep 18, 2026
4a458e9
fix(server-runtime-injection): Keep `require()` of JSON working on De…
isaacs Sep 18, 2026
a230b7e
test(e2e): consolidate the deno e2e test applications (#24414)
isaacs Sep 18, 2026
beca211
chore(test): De-flake slow and racy tests (#24452)
isaacs Sep 18, 2026
a220d3c
ref(bundler-plugins)!: Require webpack 5.1 and remove the `webpack5` …
timfish Sep 20, 2026
1af6c9b
test(e2e): Avoid SAM runtime port collisions in aws-serverless tests …
msonnb Sep 21, 2026
9c5dd8c
test(e2e): Add gen-ai-libraries app covering AI libraries via OpenRou…
mydea Sep 21, 2026
566e06a
fix(core): Apply the sensitive denylist to cookie headers and configu…
s1gr1d Sep 21, 2026
74a29aa
feat(cloudflare): Auto-register Flue instrumentation in bundled worke…
RulaKhaled Sep 21, 2026
ad0965f
fix(bun): Respect caller-supplied `runtime` option (#24487)
chiliec Sep 21, 2026
ec43b68
fix(core): Stop sending client reports for breadcrumbs (#24537)
Lms24 Sep 21, 2026
aee21c7
chore(bun): Fix stale comment in `getPerformanceIntegrations` (#24533)
JPeer264 Sep 21, 2026
eaeccd9
chore: Add external contributor to CHANGELOG.md (#24538)
javascript-sdk-gitflow[bot] Sep 21, 2026
7151a17
fix: Remove by accident exported convention (#24542)
JPeer264 Sep 21, 2026
8acce8c
docs: Update MIGRATION.md (#24550)
JPeer264 Sep 21, 2026
c016c09
fix(ember): Add route IDs to pageload and navigation spans (#24372)
ihsraham Sep 21, 2026
ce49d5b
feat(node): Add eveInstrumentation and eveIntegration for eve apps (#…
mydea Sep 21, 2026
d45ea02
feat(browser): Report `browser.navigation.type` on the pageload span …
logaretm Sep 21, 2026
72bc0df
chore: Add external contributor to CHANGELOG.md (#24553)
javascript-sdk-gitflow[bot] Sep 21, 2026
33b0769
test(e2e): Add a cloudflare-flue end-to-end application (#24477)
RulaKhaled Sep 21, 2026
0b1759c
fix(core): avoid retrying failing MCP handlers (#24505)
betegon Sep 21, 2026
5be77ff
ref(browser)!: Remove the web vital report event attribute (#24511)
logaretm Sep 21, 2026
5db16e5
fix(browser): forward uncaught worker errors with their stack (#24210)
d2anamaria Sep 21, 2026
f5c65b6
fix(replay): attach replay ID from when the feedback widget opened (#…
JoshuaKGoldberg Sep 22, 2026
e910cca
fix(server-utils): Surface deferred span-end errors on the channel pa…
Lms24 Sep 22, 2026
0546da5
fix(cloudflare): Enforce flush timeout across Workflow lifecycle (#24…
matthewbjones Sep 22, 2026
ca47d81
chore: Add external contributor to CHANGELOG.md (#24579)
javascript-sdk-gitflow[bot] Sep 22, 2026
97c6e76
ref(cloudflare): Extract one factory for the Vite provider plugins (#…
RulaKhaled Sep 22, 2026
b5d6eca
docs: Sync v10 changelog into develop (#24587)
sentry-junior[bot] Sep 22, 2026
8b31bf1
feat(nextjs)!: Remove middleware bypass for tunnel route requests (#2…
chargome Sep 22, 2026
cef1d49
ref(core): Consolidate cookie parsing into one parser (#24536)
s1gr1d Sep 22, 2026
3ecbb58
feat(vue,nuxt): Record default UI spans without Options API (mixins) …
s1gr1d Sep 22, 2026
4685abb
fix(browser-utils): Fix soft navigation vital correlation race (#24519)
isaacs Sep 22, 2026
94b731e
feat(deps): bump @apm-js-collab/tracing-hooks to 0.13.2 (#24518)
isaacs Sep 22, 2026
bcec99a
feat(react-router): Emit low-cardinality names for `function` spans (…
Lms24 Sep 22, 2026
5b691f0
docs(skills): Cover span descriptions in the port-span-names skill (#…
Lms24 Sep 22, 2026
a37cfcf
test(cloudflare): Cover withSentry and ExecutionContextCompat (#24559)
JPeer264 Sep 22, 2026
b633c81
feat(browser): Emit low cardinality `browser` request timing span nam…
Lms24 Sep 22, 2026
2bff2ea
feat(browser): Report the INP target and interaction type as attribut…
logaretm Sep 22, 2026
fd85225
fix(bundler-plugins): Preserve directive prologues during bundle inje…
Andarist Sep 22, 2026
d93241f
fix(bun): Use namespace imports for `node:http` in `bunHttpServerInte…
JPeer264 Sep 23, 2026
e986e10
feat(core): Send `sentry.is_localhost` on every streamed span (#24597)
Lms24 Sep 23, 2026
4a3af4d
feat(browser): Emit low-cardinality `ui` span names (#24578)
Lms24 Sep 23, 2026
3fd9249
feat(nestjs): Emit low cardinality `@OnEvent` function span name (#24…
Lms24 Sep 23, 2026
e281d82
chore: Remove CLAUDE.md symlink (#24524)
JPeer264 Sep 23, 2026
1960dad
fix(server-utils): Stop the orchestrion Vite plugin from adding an em…
JPeer264 Sep 23, 2026
bf7b9b2
fix(cloudflare): Bind pass-through Queue producer methods to the bind…
JPeer264 Sep 23, 2026
3fdf506
chore: Add external contributor to CHANGELOG.md (#24616)
JPeer264 Sep 23, 2026
6a99951
feat(tanstackstart-react): Emit low-cardinality names for `function` …
Lms24 Sep 23, 2026
84027a1
fix(tanstackstart-react): Reject non-POST requests to the managed tun…
Lms24 Sep 23, 2026
ea27349
docs: Fix Solid, SolidStart, and NestJS README snippets (#24571)
nicohrubec Sep 23, 2026
ed38fe7
meta(changelog): Update changelog for 11.0.0
andreiborza Sep 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
137 changes: 41 additions & 96 deletions .agents/skills/add-ai-integration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,116 +6,61 @@ argument-hint: <provider-name>

# Adding a New AI Integration

## Decision Tree
## Conventions First

```
Does the AI SDK have native OpenTelemetry support?
|- YES -> Does it emit OTel spans automatically?
| |- YES (like Vercel AI) -> Pattern 1: OTel Span Processors
| +- NO -> Pattern 2: OTel Instrumentation (wrap client)
+- NO -> Does the SDK provide hooks/callbacks?
|- YES (like LangChain) -> Pattern 3: Callback/Hook Based
+- NO -> Pattern 4: Client Wrapping
```

## Runtime-Specific Placement

If an AI SDK only works in one runtime, code lives exclusively in that runtime's package. Do NOT add it to `packages/core/`.

- **Node.js-only** -> `packages/node/src/integrations/tracing/{provider}/`
- **Cloudflare-only** -> `packages/cloudflare/src/integrations/tracing/{provider}.ts`
- **Browser-only** -> `packages/browser/src/integrations/tracing/{provider}/`
- **Multi-runtime** -> shared core in `packages/core/src/tracing/{provider}/` with runtime-specific wrappers

## Span Hierarchy

- `gen_ai.invoke_agent` — parent/pipeline spans (chains, agents, orchestration)
- `gen_ai.chat`, `gen_ai.generate_text`, etc. — child spans (actual LLM calls)

## Shared Utilities (`packages/core/src/tracing/ai/`)

- `gen-ai-attributes.ts` — OTel Semantic Convention attribute constants. **Always use these, never hardcode.**
- `utils.ts` — `setTokenUsageAttributes()`, `getTruncatedJsonString()`, `truncateGenAiMessages()`, `buildMethodPath()`
- Only use attributes from [Sentry Gen AI Conventions](https://getsentry.github.io/sentry-conventions/attributes/gen_ai/).

## Streaming

- **Non-streaming:** `startSpan()`, set attributes from response
- **Streaming:** `startSpanManual()`, accumulate state via async generator or event listeners, set `GEN_AI_RESPONSE_STREAMING_ATTRIBUTE: true`, call `span.end()` in finally block
- Detect via `params.stream === true`
- References: `openai/streaming.ts` (async generator), `anthropic-ai/streaming.ts` (event listeners)
Span ops and attributes are specified outside this repo. Never invent or hardcode either:

## Token Accumulation
- [gen_ai attributes](https://getsentry.github.io/sentry-conventions/attributes/gen_ai/) and [gen_ai ops](https://getsentry.github.io/sentry-conventions/ops/#gen_ai) — normative; import from `@sentry/conventions/attributes` and `@sentry/conventions/op`
- [RFC 0153](https://github.com/getsentry/rfcs/blob/main/text/0153-decoupling-sentrys-generative-ai-conventions-from-open-telemetry.md) — why Sentry's gen-AI conventions diverge from the [OTel gen-ai semconv](https://opentelemetry.io/docs/specs/semconv/gen-ai/)

- **Child spans:** Set tokens directly from API response via `setTokenUsageAttributes()`
- **Parent spans (`invoke_agent`):** Accumulate from children using event processor (see `vercel-ai/`)
Derive the op with `getGenAiSpanOp()` from `ai/core/utils.ts` rather than picking one by hand. `ai/core/gen-ai-attributes.ts` is for gap-fillers only — keys with no `@sentry/conventions` equivalent — so check it last, not first.

## Pattern 1: OTel Span Processors
## Which Pattern

**Use when:** SDK emits OTel spans automatically (Vercel AI)

1. **Core:** Create `add{Provider}Processors()` in `packages/core/src/tracing/{provider}/index.ts` — registers `spanStart` listener + event processor
2. **Node.js:** Add `callWhenPatched()` optimization in `packages/node/src/integrations/tracing/{provider}/index.ts` — defers registration until package is imported
3. **Edge:** Direct registration in `packages/cloudflare/src/integrations/tracing/{provider}.ts` — no OTel, call processors immediately

Reference: `packages/node/src/integrations/tracing/vercelai/`

## Pattern 2: OTel Instrumentation (Client Wrapping)

**Use when:** SDK has no native OTel support (OpenAI, Anthropic, Google GenAI)

1. **Core:** Create `instrument{Provider}Client()` in `packages/core/src/tracing/{provider}/index.ts` — Proxy to wrap client methods, create spans manually
2. **Node.js `instrumentation.ts`:** Patch module exports, wrap client constructor. Check `_INTERNAL_shouldSkipAiProviderWrapping()` for LangChain compatibility.
3. **Node.js `index.ts`:** Export integration function using `generateInstrumentOnce()` helper

Reference: `packages/node/src/integrations/tracing/openai/`

## Pattern 3: Callback/Hook Based

**Use when:** SDK provides lifecycle hooks (LangChain, LangGraph)

1. **Core:** Create `create{Provider}CallbackHandler()` — implement SDK's callback interface, create spans in callbacks
2. **Node.js `instrumentation.ts`:** Auto-inject callbacks by patching runnable methods. Disable underlying AI provider wrapping.
```
Does the SDK publish its own `diagnostics_channel` telemetry?
|- YES (ai >= 7) -> Pattern 1: Native tracing channel
+- NO -> Does the SDK expose callback/exporter hooks?
|- YES (LangChain, Mastra) -> Pattern 3: Callback/Exporter
+- NO (OpenAI, Anthropic, Google GenAI, ai < 7) -> Pattern 2: Orchestrion-injected channels
```

Reference: `packages/node/src/integrations/tracing/langchain/`
| Pattern | Use when | Reference |
| -------------------------- | ------------------------------------------ | --------------------------------------------------------------- |
| 1 — Native tracing channel | the SDK publishes to `diagnostics_channel` | `integrations/vercel-ai/vercel-ai-dc-subscriber.ts` |
| 2 — Orchestrion channels | the SDK has no telemetry of its own | `integrations/openai.ts` + `orchestrion/config/openai.ts` |
| 3 — Callback/exporter | the SDK exposes hooks or an exporter | `ai/langchain/`, `ai/mastra/` (exporter-shaped agent framework) |

## Auto-Instrumentation (Node.js)
What the reference files won't tell you:

**Mandatory** for Node.js AI integrations. OTel only patches when the package is imported (zero cost if unused).
- A provider can need two patterns at once: `vercelAIIntegration` subscribes to native `ai:telemetry` for `ai` >= 7 _and_ runs orchestrion injection for v4-v6.
- Pattern 1 subscribers are safe to register unconditionally — subscribing is a no-op on SDK versions that never publish.

### Steps
## Where The Code Goes

1. **Add to `getAutoPerformanceIntegrations()`** in `packages/node/src/integrations/tracing/index.ts` — LangChain MUST come first
2. **Add to `getOpenTelemetryInstrumentationToPreload()`** for OTel-based integrations
3. **Export from `packages/node/src/index.ts`**: integration function + options type
4. **Add E2E tests:**
- Node.js: `dev-packages/node-integration-tests/suites/tracing/{provider}/`
- Cloudflare: `dev-packages/cloudflare-integration-tests/suites/tracing/{provider}/`
- Browser: `dev-packages/browser-integration-tests/suites/tracing/ai-providers/{provider}/`
- **Instrumentation** -> `packages/server-utils/src/ai/{provider}/`
- **Integration** -> `packages/server-utils/src/integrations/{provider}.ts`
- Runtime packages (`node`, `cloudflare`, `bun`, ...) re-export from `@sentry/server-utils` — they never define their own
- Exception: Workers AI is client-wrapped in `packages/cloudflare/src/instrumentations/worker/instrumentEnv.ts`

## Key Rules
## Gotchas

1. Respect `sendDefaultPii` for `recordInputs`/`recordOutputs`
2. Set `SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'auto.ai.{provider}'` (alphanumerics, `_`, `.` only)
3. Truncate large data with helper functions from `utils.ts`
4. `gen_ai.invoke_agent` for parent ops, `gen_ai.chat` for child ops
1. **Detect streaming from the result shape** — an async-iterable or the SDK's stream object — not from `params.stream`. Only the manual `instrument{Provider}Client()` API keys off `params.stream === true`.
2. **Never set streamed response attributes by hand.** Accumulate into a `StreamResponseState` and call `endStreamSpan()` (`ai/openai/streaming.ts` for an async generator, `ai/anthropic-ai/streaming.ts` for a listener-based stream).
3. **Never truncate message payloads.** Truncation was removed in v11 (#23045) and nothing downstream caps them; size limiting is server-side.
4. **Never roll child token usage up onto parent spans.** Tree totals are computed product-side from the full span tree.
5. **Never read `dataCollection.genAI` directly.** Gate input/output recording on `resolveAIRecordingOptions()`.
6. **LangChain must be registered first** in `getTracingIntegrations()`, so it can disable the provider integrations before they instrument.
7. Set `SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'auto.ai.{provider}'` (alphanumerics, `_`, `.` only).

## Checklist

- [ ] Runtime-specific code placed only in that runtime's package
- [ ] Added to `getAutoPerformanceIntegrations()` in correct order (Node.js)
- [ ] Added to `getOpenTelemetryInstrumentationToPreload()` (Node.js with OTel)
- [ ] Exported from appropriate package index
- [ ] E2E tests added and verifying auto-instrumentation
- [ ] Only used attributes from [Sentry Gen AI Conventions](https://getsentry.github.io/sentry-conventions/attributes/gen_ai/)
- [ ] JSDoc says "enabled by default" or "not enabled by default"
- [ ] Documented how to disable (if auto-enabled)
- [ ] Verified OTel only patches when package imported (Node.js)

## Reference Implementations

- **Pattern 1 (Span Processors):** `packages/node/src/integrations/tracing/vercelai/`
- **Pattern 2 (Client Wrapping):** `packages/node/src/integrations/tracing/openai/`
- **Pattern 3 (Callback/Hooks):** `packages/node/src/integrations/tracing/langchain/`
- [ ] Instrumentation in `src/ai/`, integration in `src/integrations/`, registered in `getTracingIntegrations()` (LangChain first)
- [ ] Exported from `packages/server-utils/src/index.ts`, re-exported from the supported runtime packages
- [ ] E2E tests in `dev-packages/node-integration-tests/suites/tracing/{provider}/` (and `cloudflare-integration-tests/` if supported)
- [ ] Ops and attributes from `@sentry/conventions`, op derived via `getGenAiSpanOp()`
- [ ] Recording gated on `resolveAIRecordingOptions()`; no truncation, no token rollup
- [ ] JSDoc names the channels subscribed to, the supported SDK versions, and — for Pattern 2 — that it requires the Sentry runtime hook or bundler plugin
- [ ] Patching happens only once the target package is imported (zero cost if unused)

**When in doubt, follow the pattern of the most similar existing integration.**
Loading
Loading