Skip to content

feat(core): Support embeddings in langchain#20017

Merged
nicohrubec merged 25 commits intodevelopfrom
nh/langchain-embeddings
Apr 2, 2026
Merged

feat(core): Support embeddings in langchain#20017
nicohrubec merged 25 commits intodevelopfrom
nh/langchain-embeddings

Conversation

@nicohrubec
Copy link
Copy Markdown
Member

@nicohrubec nicohrubec commented Mar 27, 2026

Adds embeddings instrumentation for LangChain (embedQuery, embedDocuments). LangChain's Embeddings base class doesn't use the callback system that we rely on for chat models, so this uses direct prototype patching instead.

In Node.js, embedding classes from provider packages are auto-instrumented. For other runtimes:

const embeddings = Sentry.instrumentLangChainEmbeddings(
  new OpenAIEmbeddings({ model: 'text-embedding-3-small' })
);                                                                                                                          
await embeddings.embedQuery('Hello world');

Creates gen_ai.embeddings spans. Token usage is not available since LangChain's embedding methods only return raw vectors.

Closes #19774

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 27, 2026

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Deps

  • Bump lodash.template from 4.5.0 to 4.18.1 by dependabot in #20085
  • Bump @xmldom/xmldom from 0.8.3 to 0.8.12 by dependabot in #20066

Other

  • (core) Support embeddings in langchain by nicohrubec in #20017
  • (core, node) Portable Express integration by isaacs in #19928
  • (deno) Add denoRuntimeMetricsIntegration by chargome in #20023

Bug Fixes 🐛

  • (aws-serverless) Add timeout to _endSpan forceFlush to prevent Lambda hanging by logaretm in #20064
  • (cloudflare) Ensure every request instruments functions by JPeer264 in #20044
  • (gatsby) Fix errorHandler signature to match bundler-plugin-core API by JPeer264 in #20048

Internal Changes 🔧

Core

  • Do not emit spans for chats.create in google-genai by nicohrubec in #19990
  • Unify .do* span ops to gen_ai.generate_content by nicohrubec in #20074
  • Simplify addResponseAttributes in openai integration by nicohrubec in #20013
  • Extract shared endStreamSpan for AI integrations by nicohrubec in #20021
  • Remove provider-specific AI span attributes in favor of gen_ai attributes in sentry conventions by nicohrubec in #20011

Deps

  • Bump mshick/add-pr-comment from dd126dd8c253650d181ad9538d8b4fa218fc31e8 to e7516d74559b5514092f5b096ed29a629a1237c6 by dependabot in #20078
  • Bump getsentry/craft/.github/workflows/changelog-preview.yml from 2.24.1 to 2.25.2 by dependabot in #20081

Other

  • Update validate-pr workflow by stephanie-anderson in #20072
  • Remove unused tsconfig-template folder by mydea in #20067

🤖 This preview updates automatically when you update the PR.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 27, 2026

size-limit report 📦

⚠️ Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

Path Size % Change Change
@sentry/browser 25.65 kB +0.02% +5 B 🔺
@sentry/browser - with treeshaking flags 24.14 kB +0.03% +5 B 🔺
@sentry/browser (incl. Tracing) 42.16 kB +0.02% +7 B 🔺
@sentry/browser (incl. Tracing, Profiling) 46.77 kB +0.02% +9 B 🔺
@sentry/browser (incl. Tracing, Replay) 80.94 kB +0.01% +5 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 70.56 kB +0.01% +5 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas) 85.66 kB +0.01% +8 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback) 97.92 kB +0.01% +5 B 🔺
@sentry/browser (incl. Feedback) 42.42 kB +0.02% +6 B 🔺
@sentry/browser (incl. sendFeedback) 30.31 kB +0.02% +6 B 🔺
@sentry/browser (incl. FeedbackAsync) 35.3 kB +0.05% +17 B 🔺
@sentry/browser (incl. Metrics) 26.96 kB +0.03% +7 B 🔺
@sentry/browser (incl. Logs) 27.11 kB +0.03% +7 B 🔺
@sentry/browser (incl. Metrics & Logs) 27.78 kB +0.03% +7 B 🔺
@sentry/react 27.41 kB +0.03% +6 B 🔺
@sentry/react (incl. Tracing) 44.48 kB +0.02% +5 B 🔺
@sentry/vue 30.08 kB +0.02% +5 B 🔺
@sentry/vue (incl. Tracing) 44.05 kB +0.02% +8 B 🔺
@sentry/svelte 25.67 kB +0.02% +5 B 🔺
CDN Bundle 28.33 kB +0.05% +14 B 🔺
CDN Bundle (incl. Tracing) 43.13 kB +0.06% +25 B 🔺
CDN Bundle (incl. Logs, Metrics) 29.7 kB +0.05% +14 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) 44.17 kB +0.05% +19 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) 68.5 kB +0.03% +17 B 🔺
CDN Bundle (incl. Tracing, Replay) 80.02 kB +0.03% +19 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 81.06 kB +0.03% +18 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) 85.56 kB +0.02% +15 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 86.59 kB +0.02% +16 B 🔺
CDN Bundle - uncompressed 82.72 kB +0.07% +54 B 🔺
CDN Bundle (incl. Tracing) - uncompressed 127.86 kB +0.05% +54 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed 86.86 kB +0.07% +54 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 131.27 kB +0.05% +54 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 209.84 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed 244.74 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 248.13 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 257.65 kB +0.03% +54 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 261.04 kB +0.03% +54 B 🔺
@sentry/nextjs (client) 46.9 kB +0.02% +7 B 🔺
@sentry/sveltekit (client) 42.62 kB +0.02% +7 B 🔺
@sentry/node-core 55.77 kB +0.04% +17 B 🔺
@sentry/node 172.41 kB -0.2% -338 B 🔽
@sentry/node - without tracing 96.04 kB +0.04% +30 B 🔺
@sentry/aws-serverless 112.85 kB +0.07% +77 B 🔺

View base workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 27, 2026

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,945 - 8,947 -0%
GET With Sentry 1,711 19% 1,817 -6%
GET With Sentry (error only) 6,069 68% 6,033 +1%
POST Baseline 1,177 - 1,190 -1%
POST With Sentry 590 50% 608 -3%
POST With Sentry (error only) 1,057 90% 1,047 +1%
MYSQL Baseline 3,249 - 3,167 +3%
MYSQL With Sentry 450 14% 491 -8%
MYSQL With Sentry (error only) 2,614 80% 2,607 +0%

View base workflow run

@nicohrubec nicohrubec marked this pull request as ready for review March 30, 2026 12:55
/**
* The span operation for embeddings
*/
export const GEN_AI_EMBEDDINGS_OPERATION_ATTRIBUTE = 'gen_ai.embeddings';
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Duplicate constant with identical value adds confusion

Low Severity

GEN_AI_EMBEDDINGS_OPERATION_ATTRIBUTE is a new constant with value 'gen_ai.embeddings', identical to the existing GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE and GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE. Having three exported constants with the same string value increases maintenance burden — a future change to the operation name would need to update all three, risking inconsistency.

Additional Locations (1)
Fix in Cursor Fix in Web

Copy link
Copy Markdown
Member Author

@nicohrubec nicohrubec Mar 31, 2026

Choose a reason for hiding this comment

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

I am aware, the others will be cleaned up in a follow up to keep this focused

Copy link
Copy Markdown

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

@nicohrubec nicohrubec marked this pull request as draft April 2, 2026 08:54
Copy link
Copy Markdown
Member

@chargome chargome left a comment

Choose a reason for hiding this comment

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

lgtm!

};

attributes[GEN_AI_SYSTEM_ATTRIBUTE] = inferSystemFromInstance(embeddingsInstance);
if ('dimensions' in embeddingsInstance)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: Let's generally stick to bracketed ifs in our code, less potential to introduce bugs.

nicohrubec added a commit to getsentry/testing-ai-sdk-integrations that referenced this pull request Apr 2, 2026
… tests (#125)

Embedding support in langchain is added through a separate API Sentry.instrumentLangChainEmbeddings(). As usual this gets auto-instrumented in node and other runtimes need to wrap manually. Updating the templates to use the correct API. PR that implements support in the JS SDK is here: getsentry/sentry-javascript#20017

As in google-genai we don't get any information about token usage for this so skipping the checks.
@nicohrubec nicohrubec marked this pull request as ready for review April 2, 2026 12:13
@nicohrubec nicohrubec merged commit 7886e12 into develop Apr 2, 2026
468 of 472 checks passed
@nicohrubec nicohrubec deleted the nh/langchain-embeddings branch April 2, 2026 12:28
Sign up for free to 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.

Support Embeddings APIs in Langchain

2 participants