Skip to content

Conversation

@RulaKhaled
Copy link
Member

This PR adds support for LangChain v1.

Changes

  • LangChain v1 Response Metadata Extraction

    • Updated response attribute extraction to support LangChain v1's different data structure:
  • Instrument ConfigurableModel from chat_models/universal.cjs

Quick context:

The initChatModel unified API (introduced in LangChain v1) was not being instrumented in CJS applications. This happened because:

  1. initChatModel uses dynamic import() to load providers (even in CJS mode)
  2. OpenTelemetry's CJS instrumentation only hooks require(), not dynamic import()
  3. Provider packages like @langchain/openai were never being patched when loaded via initChatModel

Solution: Added instrumentation for the main langchain package. When langchain/dist/chat_models/universal.cjs is loaded, we patch the ConfigurableModel prototype. Since initChatModel returns a ConfigurableModel instance, it inherits the patched methods regardless of how the provider is loaded.

This fix ensures initChatModel works in CJS applications without requiring users to manually import provider packages.

  • Add tests for node integrations tests testing v1 changes
  • All existing tests continue to pass
  • New v1 test suite validates:
    • Basic chat model spans with and without PII
    • Tool call instrumentation
    • Message truncation behavior
    • Timing issues with pre-imported clients
    • initChatModel API with OpenAI (now working in both ESM and CJS)

Closes https://linear.app/getsentry/issue/JS-1071/support-langchain-v1

@RulaKhaled RulaKhaled marked this pull request as draft November 24, 2025 14:59
@github-actions
Copy link
Contributor

github-actions bot commented Nov 24, 2025

size-limit report 📦

Path Size % Change Change
@sentry/browser 24.8 kB - -
@sentry/browser - with treeshaking flags 23.31 kB - -
@sentry/browser (incl. Tracing) 41.54 kB - -
@sentry/browser (incl. Tracing, Profiling) 46.13 kB - -
@sentry/browser (incl. Tracing, Replay) 79.96 kB - -
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 69.69 kB - -
@sentry/browser (incl. Tracing, Replay with Canvas) 84.64 kB - -
@sentry/browser (incl. Tracing, Replay, Feedback) 96.88 kB - -
@sentry/browser (incl. Feedback) 41.48 kB - -
@sentry/browser (incl. sendFeedback) 29.49 kB - -
@sentry/browser (incl. FeedbackAsync) 34.43 kB - -
@sentry/react 26.52 kB - -
@sentry/react (incl. Tracing) 43.74 kB - -
@sentry/vue 29.25 kB - -
@sentry/vue (incl. Tracing) 43.34 kB - -
@sentry/svelte 24.82 kB - -
CDN Bundle 27.17 kB - -
CDN Bundle (incl. Tracing) 42.16 kB - -
CDN Bundle (incl. Tracing, Replay) 78.7 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) 84.16 kB - -
CDN Bundle - uncompressed 79.84 kB - -
CDN Bundle (incl. Tracing) - uncompressed 125.22 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 241.25 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 254.01 kB - -
@sentry/nextjs (client) 45.96 kB - -
@sentry/sveltekit (client) 41.9 kB - -
@sentry/node-core 51.19 kB +0.01% +1 B 🔺
@sentry/node 159.36 kB +0.08% +117 B 🔺
@sentry/node - without tracing 92.83 kB +0.01% +1 B 🔺
@sentry/aws-serverless 108.08 kB +0.01% +1 B 🔺

View base workflow run

@github-actions
Copy link
Contributor

github-actions bot commented Nov 24, 2025

node-overhead report 🧳

Note: This is a synthetic benchmark with a minimal express app and does not necessarily reflect the real-world performance impact in an application.

Scenario Requests/s % of Baseline Prev. Requests/s Change %
GET Baseline 8,727 - 9,086 -4%
GET With Sentry 1,770 20% 1,761 +1%
GET With Sentry (error only) 6,172 71% 6,153 +0%
POST Baseline 1,186 - 1,210 -2%
POST With Sentry 597 50% 597 -
POST With Sentry (error only) 1,045 88% 1,075 -3%
MYSQL Baseline 3,321 - 3,326 -0%
MYSQL With Sentry 450 14% 493 -9%
MYSQL With Sentry (error only) 2,702 81% 2,708 -0%

View base workflow run

Updated comments to reflect changes in finish_reason usage between versions.
@RulaKhaled RulaKhaled marked this pull request as ready for review November 24, 2025 15:22
Copy link
Member

@nicohrubec nicohrubec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me, just a few questions/comments. Generally it feels like the attribute extraction gets quite difficult to read, not sure if we can really improve this though (maybe splitting some types into pre/post v1 but not sure if that actually helps)

@RulaKhaled
Copy link
Member Author

Makes sense to me, just a few questions/comments. Generally it feels like the attribute extraction gets quite difficult to read, not sure if we can really improve this though (maybe splitting some types into pre/post v1 but not sure if that actually helps)

We usually try to keep things as general as possible, so splitting would create a lot of unnecessary work. Type changes typically only happen with major releases. I’ve moved everything to /types to make it easier to read, and hopefully this is as simple as it can be

Copy link
Member

@nicohrubec nicohrubec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing the comments, LGTM

@RulaKhaled RulaKhaled force-pushed the rolaabuhasna/js-1071-support-langchain-v1 branch from 9e0171a to 86ac8f3 Compare November 26, 2025 13:09
@RulaKhaled RulaKhaled merged commit f3bdfd7 into develop Nov 26, 2025
393 of 396 checks passed
@RulaKhaled RulaKhaled deleted the rolaabuhasna/js-1071-support-langchain-v1 branch November 26, 2025 20:12
Doridian pushed a commit to foxCaves/foxCaves that referenced this pull request Dec 3, 2025
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@sentry/react](https://github.com/getsentry/sentry-javascript/tree/master/packages/react) ([source](https://github.com/getsentry/sentry-javascript)) | [`10.27.0` -> `10.28.0`](https://renovatebot.com/diffs/npm/@sentry%2freact/10.27.0/10.28.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@sentry%2freact/10.28.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sentry%2freact/10.27.0/10.28.0?slim=true) | --- ### Release Notes <details> <summary>getsentry/sentry-javascript (@&#8203;sentry/react)</summary> ### [`v10.28.0`](https://github.com/getsentry/sentry-javascript/releases/tag/10.28.0) [Compare Source](getsentry/sentry-javascript@10.27.0...10.28.0) ##### Important Changes - **feat(core): Make `matcher` parameter optional in `makeMultiplexedTransport` ([#&#8203;10798](getsentry/sentry-javascript#10798 The `matcher` parameter in `makeMultiplexedTransport` is now optional with a sensible default. This makes it much easier to use the multiplexed transport for sending events to multiple DSNs based on runtime configuration. **Before:** ```javascript import { makeFetchTransport, makeMultiplexedTransport } from '@&#8203;sentry/browser'; const EXTRA_KEY = 'ROUTE_TO'; const transport = makeMultiplexedTransport(makeFetchTransport, args => { const event = args.getEvent(); if (event?.extra?.[EXTRA_KEY] && Array.isArray(event.extra[EXTRA_KEY])) { return event.extra[EXTRA_KEY]; } return []; }); Sentry.init({ transport, // ... other options }); // Capture events with routing info Sentry.captureException(error, { extra: { [EXTRA_KEY]: [ { dsn: 'https://key1@&#8203;sentry.io/project1', release: 'v1.0.0' }, { dsn: 'https://key2@&#8203;sentry.io/project2' }, ], }, }); ``` **After:** ```javascript import { makeFetchTransport, makeMultiplexedTransport, MULTIPLEXED_TRANSPORT_EXTRA_KEY } from '@&#8203;sentry/browser'; // Just pass the transport generator - the default matcher handles the rest! Sentry.init({ transport: makeMultiplexedTransport(makeFetchTransport), // ... other options }); // Capture events with routing info using the exported constant Sentry.captureException(error, { extra: { [MULTIPLEXED_TRANSPORT_EXTRA_KEY]: [ { dsn: 'https://key1@&#8203;sentry.io/project1', release: 'v1.0.0' }, { dsn: 'https://key2@&#8203;sentry.io/project2' }, ], }, }); ``` The default matcher looks for routing information in `event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY]`. You can still provide a custom matcher function for advanced use cases. - **feat(nextjs): Support cacheComponents on turbopack ([#&#8203;18304](getsentry/sentry-javascript#18304 This release adds support for `cacheComponents` on turbopack builds. We are working on adding support for this feature in webpack builds as well. ##### Other Changes - feat: Publish AWS Lambda Layer for Node 24 ([#&#8203;18327](getsentry/sentry-javascript#18327)) - feat(browser): Expose langchain instrumentation ([#&#8203;18342](getsentry/sentry-javascript#18342)) - feat(browser): Expose langgraph instrumentation ([#&#8203;18345](getsentry/sentry-javascript#18345)) - feat(cloudflare): Allow specifying a custom fetch in Cloudflare transport options ([#&#8203;18335](getsentry/sentry-javascript#18335)) - feat(core): Add `isolateTrace` option to `Sentry.withMonitor()` ([#&#8203;18079](getsentry/sentry-javascript#18079)) - feat(deps): bump [@&#8203;sentry/webpack-plugin](https://github.com/sentry/webpack-plugin) from 4.3.0 to 4.6.1 ([#&#8203;18272](getsentry/sentry-javascript#18272)) - feat(nextjs): Add cloudflare `waitUntil` detection ([#&#8203;18336](getsentry/sentry-javascript#18336)) - feat(node): Add LangChain v1 support ([#&#8203;18306](getsentry/sentry-javascript#18306)) - feat(remix): Add parameterized transaction naming for routes ([#&#8203;17951](getsentry/sentry-javascript#17951)) - fix(cloudflare): Keep http root span alive until streaming responses are consumed ([#&#8203;18087](getsentry/sentry-javascript#18087)) - fix(cloudflare): Wait for async events to finish ([#&#8203;18334](getsentry/sentry-javascript#18334)) - fix(core): `continueTrace` doesn't propagate given trace ID if active span exists ([#&#8203;18328](getsentry/sentry-javascript#18328)) - fix(node-core): Handle custom scope in log messages without parameters ([#&#8203;18322](getsentry/sentry-javascript#18322)) - fix(opentelemetry): Ensure Sentry spans don't leak when tracing is disabled ([#&#8203;18337](getsentry/sentry-javascript#18337)) - fix(react-router): Use underscores in trace origin values ([#&#8203;18351](getsentry/sentry-javascript#18351)) - chore(tanstackstart-react): Export custom inits from tanstackstart-react ([#&#8203;18369](getsentry/sentry-javascript#18369)) - chore(tanstackstart-react)!: Remove empty placeholder implementations ([#&#8203;18338](getsentry/sentry-javascript#18338)) <details> <summary><strong>Internal Changes</strong></summary> - chore: Allow URLs as issue ([#&#8203;18372](getsentry/sentry-javascript#18372)) - chore(changelog): Add entry for [#&#8203;18304](getsentry/sentry-javascript#18304) ([#&#8203;18329](getsentry/sentry-javascript#18329)) - chore(ci): Add action to track all PRs as issues ([#&#8203;18363](getsentry/sentry-javascript#18363)) - chore(github): Adjust `BUGBOT.md` rules to flag invalid op and origin values during review ([#&#8203;18352](getsentry/sentry-javascript#18352)) - ci: Add action to create issue on gitflow merge conflicts ([#&#8203;18319](getsentry/sentry-javascript#18319)) - ci(deps): bump actions/checkout from 5 to 6 ([#&#8203;18268](getsentry/sentry-javascript#18268)) - ci(deps): bump peter-evans/create-pull-request from 7.0.8 to 7.0.9 ([#&#8203;18361](getsentry/sentry-javascript#18361)) - test(cloudflare): Add typechecks for cloudflare-worker e2e test ([#&#8203;18321](getsentry/sentry-javascript#18321)) </details> #### Bundle size 📦 | Path | Size | | ----------------------------------------------------------------------------------------------------- | --------- | | [@&#8203;sentry/browser](https://github.com/sentry/browser) | 24.22 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) - with treeshaking flags | 22.76 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Tracing) | 40.57 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Profiling) | 45.05 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay) | 78.08 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay) - with treeshaking flags | 68.05 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay with Canvas) | 82.65 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay, Feedback) | 94.61 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. Feedback) | 40.51 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. sendFeedback) | 28.8 KB | | [@&#8203;sentry/browser](https://github.com/sentry/browser) (incl. FeedbackAsync) | 33.66 KB | | [@&#8203;sentry/react](https://github.com/sentry/react) | 25.9 KB | | [@&#8203;sentry/react](https://github.com/sentry/react) (incl. Tracing) | 42.72 KB | | [@&#8203;sentry/vue](https://github.com/sentry/vue) | 28.56 KB | | [@&#8203;sentry/vue](https://github.com/sentry/vue) (incl. Tracing) | 42.32 KB | | [@&#8203;sentry/svelte](https://github.com/sentry/svelte) | 24.24 KB | | CDN Bundle | 26.57 KB | | CDN Bundle (incl. Tracing) | 41.22 KB | | CDN Bundle (incl. Tracing, Replay) | 76.9 KB | | CDN Bundle (incl. Tracing, Replay, Feedback) | 82.23 KB | | CDN Bundle - uncompressed | 78.09 KB | | CDN Bundle (incl. Tracing) - uncompressed | 122.4 KB | | CDN Bundle (incl. Tracing, Replay) - uncompressed | 235.71 KB | | CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed | 248.17 KB | | [@&#8203;sentry/nextjs](https://github.com/sentry/nextjs) (client) | 44.88 KB | | [@&#8203;sentry/sveltekit](https://github.com/sentry/sveltekit) (client) | 40.92 KB | | [@&#8203;sentry/node-core](https://github.com/sentry/node-core) | 50.06 KB | | [@&#8203;sentry/node](https://github.com/sentry/node) | 155.7 KB | | [@&#8203;sentry/node](https://github.com/sentry/node) - without tracing | 90.67 KB | | [@&#8203;sentry/aws-serverless](https://github.com/sentry/aws-serverless) | 105.61 KB | </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4yNy4xIiwidXBkYXRlZEluVmVyIjoiNDIuMjcuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Reviewed-on: https://git.foxden.network/foxCaves/foxCaves/pulls/12 Co-authored-by: Renovate <renovate@foxden.network> Co-committed-by: Renovate <renovate@foxden.network>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants