Skip to content

refactor(elysia): drop @elysiajs/opentelemetry dependency#19947

Merged
logaretm merged 6 commits intodevelopfrom
awad/elysia-drop-otel-plugin
Mar 25, 2026
Merged

refactor(elysia): drop @elysiajs/opentelemetry dependency#19947
logaretm merged 6 commits intodevelopfrom
awad/elysia-drop-otel-plugin

Conversation

@logaretm
Copy link
Member

@logaretm logaretm commented Mar 23, 2026

Mimics @elysia/opentelemetry own implementation and swaps out OTEL APIs with our own, main reason is I didn't want to lock OTEL deps to specific versions that may break in the wild.

This is an exploration, but if all is green then I will consider merging this first into Elysia SDK before release.

closes #18956

@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 2026

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 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 mongodb-memory-server-global from 10.1.4 to 11.0.1 by dependabot in #19888
  • Bump stacktrace-parser from 0.1.10 to 0.1.11 by dependabot in #19887

Other

  • (elysia) Elysia SDK by logaretm in #19509

Bug Fixes 🐛

Cloudflare

  • Send correct events in local development by JPeer264 in #19900
  • Forward ctx argument to Workflow.do user callback by Lms24 in #19891

Core

  • Preserve .withResponse() on Anthropic instrumentation by nicohrubec in #19935
  • Truncate content array format in Vercel by nicohrubec in #19911
  • Send internal_error as span status for Vercel error spans by nicohrubec in #19921
  • Do not overwrite user provided conversation id in Vercel by nicohrubec in #19903
  • Return same value from startSpan as callback returns by s1gr1d in #19300

Deps

  • Update lockfile to resolve h3@1.15.10 by chargome in #19933
  • Bump fast-xml-parser to 5.5.8 in @azure/core-xml chain by chargome in #19918
  • Bump next to 15.5.14 in nextjs-15 and nextjs-15-intl E2E test apps by chargome in #19917
  • Bump socket.io-parser to 4.2.6 to fix CVE-2026-33151 by chargome in #19880

Other

  • (craft) Add missing mainDocsUrl for @sentry/effect SDK by bc-sentry in #19860
  • (nestjs) Add node to nest metadata by chargome in #19875
  • (serverless) Add node to metadata by nicohrubec in #19878

Internal Changes 🔧

Deps Dev

  • Bump effect from 3.19.19 to 3.20.0 by dependabot in #19926
  • Bump qunit-dom from 3.2.1 to 3.5.0 by dependabot in #19546
  • Bump @react-router/node from 7.13.0 to 7.13.1 by dependabot in #19544

Nuxt

  • Extract core logic for storage/database to prepare for Nuxt v5 by s1gr1d in #19920
  • Extract handler patching to extra plugin for Nitro v2/v3 by s1gr1d in #19915

Other

  • (astro) Re-enable server island tracing e2e test in Astro 6 by Lms24 in #19872
  • (ci) Fix "Gatbsy" typo in issue package label workflow by chargome in #19905
  • (claude) Enable Claude Code Intelligence (LSP) by s1gr1d in #19930
  • (cloudflare) Enable multi-worker tests for CF integration tests by JPeer264 in #19938
  • (elysia) Drop @elysiajs/opentelemetry dependency by logaretm in #19947
  • (lint) Resolve oxlint warnings by isaacs in #19893
  • (node-integration-tests) Remove unnecessary file-type dependency by Lms24 in #19824
  • (remix) Replace glob with native recursive fs walk by roli-lpci in #19531
  • (sveltekit) Replace recast + @babel/parser with acorn by roli-lpci in #19533
  • Add external contributor to CHANGELOG.md by javascript-sdk-gitflow in #19925
  • Add external contributor to CHANGELOG.md by javascript-sdk-gitflow in #19909

🤖 This preview updates automatically when you update the PR.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 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.69 kB +0.2% +49 B 🔺
@sentry/browser - with treeshaking flags 24.17 kB +0.14% +33 B 🔺
@sentry/browser (incl. Tracing) 42.67 kB +0.13% +54 B 🔺
@sentry/browser (incl. Tracing, Profiling) 47.33 kB +0.12% +55 B 🔺
@sentry/browser (incl. Tracing, Replay) 81.48 kB +0.08% +57 B 🔺
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 71.06 kB +0.1% +69 B 🔺
@sentry/browser (incl. Tracing, Replay with Canvas) 86.17 kB +0.06% +50 B 🔺
@sentry/browser (incl. Tracing, Replay, Feedback) 98.41 kB +0.04% +36 B 🔺
@sentry/browser (incl. Feedback) 42.48 kB +0.08% +30 B 🔺
@sentry/browser (incl. sendFeedback) 30.35 kB +0.15% +43 B 🔺
@sentry/browser (incl. FeedbackAsync) 35.4 kB +0.12% +39 B 🔺
@sentry/browser (incl. Metrics) 26.96 kB +0.15% +38 B 🔺
@sentry/browser (incl. Logs) 27.1 kB +0.12% +32 B 🔺
@sentry/browser (incl. Metrics & Logs) 27.78 kB +0.15% +39 B 🔺
@sentry/react 27.45 kB +0.22% +58 B 🔺
@sentry/react (incl. Tracing) 45.01 kB +0.14% +60 B 🔺
@sentry/vue 30.13 kB +0.16% +46 B 🔺
@sentry/vue (incl. Tracing) 44.52 kB +0.09% +39 B 🔺
@sentry/svelte 25.7 kB +0.16% +40 B 🔺
CDN Bundle 28.35 kB +0.27% +75 B 🔺
CDN Bundle (incl. Tracing) 43.57 kB +0.15% +62 B 🔺
CDN Bundle (incl. Logs, Metrics) 29.22 kB +0.27% +77 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) 44.43 kB +0.17% +75 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) 68.29 kB +0.13% +85 B 🔺
CDN Bundle (incl. Tracing, Replay) 80.41 kB +0.1% +73 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 81.31 kB +0.1% +76 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) 85.97 kB +0.12% +103 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 86.86 kB +0.1% +86 B 🔺
CDN Bundle - uncompressed 82.7 kB +0.1% +77 B 🔺
CDN Bundle (incl. Tracing) - uncompressed 128.62 kB +0.05% +64 B 🔺
CDN Bundle (incl. Logs, Metrics) - uncompressed 85.57 kB +0.1% +77 B 🔺
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 131.49 kB +0.05% +64 B 🔺
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 209.22 kB +0.05% +102 B 🔺
CDN Bundle (incl. Tracing, Replay) - uncompressed 245.5 kB +0.04% +89 B 🔺
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 248.35 kB +0.04% +89 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 258.41 kB +0.04% +89 B 🔺
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 261.26 kB +0.04% +89 B 🔺
@sentry/nextjs (client) 47.4 kB +0.08% +37 B 🔺
@sentry/sveltekit (client) 43.12 kB +0.12% +51 B 🔺
@sentry/node-core 56.42 kB +0.13% +73 B 🔺
@sentry/node 173.53 kB +0.22% +368 B 🔺
@sentry/node - without tracing 96.43 kB +0.1% +87 B 🔺
@sentry/aws-serverless 113.44 kB +0.09% +102 B 🔺

View base workflow run

@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 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,529 - 9,359 -9%
GET With Sentry 1,560 18% 1,696 -8%
GET With Sentry (error only) 5,702 67% 6,065 -6%
POST Baseline 1,150 - 1,192 -4%
POST With Sentry 537 47% 567 -5%
POST With Sentry (error only) 985 86% 1,017 -3%
MYSQL Baseline 3,092 - 3,183 -3%
MYSQL With Sentry 368 12% 418 -12%
MYSQL With Sentry (error only) 2,527 82% 2,558 -1%

View base workflow run

Base automatically changed from awad/js-1542-add-elysia-integration to develop March 24, 2026 19:28
logaretm and others added 5 commits March 24, 2026 15:40
Replace @elysiajs/opentelemetry with Elysia's native .trace() and
.wrap() APIs combined with Sentry's own span APIs. This eliminates
the version mismatch issues caused by the OTel plugin's transitive
OpenTelemetry dependencies.

Key changes:
- Use .wrap() to capture/create root spans (Bun creates new server
  span, Node.js captures existing HTTP instrumentation span) and
  bridge them to .trace() via a WeakMap<Request, Span>
- Use .trace({ as: "global" }) with startInactiveSpan to create
  lifecycle phase spans (Request, Parse, Handle, etc.) and child
  handler spans (named functions get their name, arrow functions
  get 'anonymous')
- Move all SDK logic (request metadata, trace propagation, error
  capture) inside .trace() callbacks via onPhaseEnd so no separate
  lifecycle hooks are registered (which would show up as handler
  spans in the trace)
- Remove clientHooks.ts (no more post-hoc span enrichment or
  <unknown> span filtering needed)
- Remove OTel resolution overrides from root package.json

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The size limit bumps were needed for @elysiajs/opentelemetry's
transitive OTel dependencies. Now that we dropped the plugin,
the limits can go back to the develop baseline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Import TraceHandler, TraceListener, TraceProcess from elysia
  instead of defining custom interfaces or casting to any
- Add void to floating promises (TraceListener callbacks)
- Fix package.json lint/fix scripts to use oxlint instead of eslint

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Restore onRequest, onAfterHandle, onError as real lifecycle hooks
  (.trace() is observational only — used for span creation, not SDK logic)
- Set HTTP error status on root span in onError handler
- Update elysia-bun E2E tests: origin auto.http.otel.elysia -> auto.http.elysia
- Use /with-middleware/test route for anonymous span test (needs actual handlers)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@logaretm logaretm force-pushed the awad/elysia-drop-otel-plugin branch from fd04016 to 7b31215 Compare March 24, 2026 19:41
@logaretm logaretm marked this pull request as ready for review March 24, 2026 19:41
Copilot AI review requested due to automatic review settings March 24, 2026 19:41
@logaretm logaretm self-assigned this Mar 24, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the @elysiajs/opentelemetry dependency from the @sentry/elysia package by re-implementing the required tracing behavior directly using Elysia’s .wrap()/.trace() APIs together with Sentry’s span APIs, and updates tests/e2e fixtures accordingly.

Changes:

  • Drop @elysiajs/opentelemetry from Elysia package + e2e test apps, and adjust lockfile/resolutions accordingly.
  • Rework withElysia() to create/enrich Elysia lifecycle spans via Sentry APIs (including a WeakMap to bridge async-context gaps).
  • Update unit + e2e tests to assert the new origin value and the new anonymous-handler span naming behavior.

Reviewed changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/elysia/src/withElysia.ts Replaces OTel plugin usage with direct Elysia .wrap()/.trace() + Sentry span creation and propagation logic.
packages/elysia/src/clientHooks.ts Removes prior client-hook approach which enriched/filtered spans post-facto.
packages/elysia/test/withElysia.test.ts Updates unit tests to reflect .wrap()/.trace() registration instead of registering the OTel plugin.
packages/elysia/package.json Removes @elysiajs/opentelemetry from peer/dev deps; aligns lint scripts with repo oxlint pattern.
dev-packages/e2e-tests/test-applications/elysia-node/package.json Drops @elysiajs/opentelemetry from the Node e2e fixture.
dev-packages/e2e-tests/test-applications/elysia-bun/package.json Drops @elysiajs/opentelemetry from the Bun e2e fixture.
dev-packages/e2e-tests/test-applications/elysia-node/tests/transactions.test.ts Updates assertions for new origin and anonymous-handler span behavior.
dev-packages/e2e-tests/test-applications/elysia-bun/tests/transactions.test.ts Updates assertions for new origin and anonymous-handler span behavior.
package.json Removes OpenTelemetry-related Yarn resolutions entries.
yarn.lock Removes @elysiajs/opentelemetry (and transitives) and reflects updated OTEL dependency graph.
.size-limit.js Adjusts size limits downward to match the new bundle sizes.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +96 to +105
function setupClientHooksOnce(): void {
if (isClientHooksSetup) {
return;
}
const client = getClient();
if (!client) {
return;
}
isClientHooksSetup = true;
}
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

setupClientHooksOnce() no longer sets up any client hooks (it only checks getClient() and flips isClientHooksSetup), but it’s still called from withElysia() and the isClientHooksSetup flag is otherwise unused. This looks like leftover scaffolding from the removed clientHooks.ts and adds confusion/overhead—either remove this function + flag entirely, or reintroduce the intended client hook registration here.

Copilot uses AI. Check for mistakes.
Leftover from the removed clientHooks.ts — the function body was
empty and the isClientHooksSetup flag was unused.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Member

@JPeer264 JPeer264 left a comment

Choose a reason for hiding this comment

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

LGTM. I think Elysia wasn't released yet right? So this refactor is then not even a breaking change just yet

@logaretm logaretm merged commit 54abb35 into develop Mar 25, 2026
238 of 239 checks passed
@logaretm logaretm deleted the awad/elysia-drop-otel-plugin branch March 25, 2026 12:38
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.

Add Elysia

4 participants