Skip to content

feat(bun): Add bunRuntimeMetricsIntegration#19979

Open
chargome wants to merge 19 commits intodevelopfrom
feat/bun-runtime-metrics
Open

feat(bun): Add bunRuntimeMetricsIntegration#19979
chargome wants to merge 19 commits intodevelopfrom
feat/bun-runtime-metrics

Conversation

@chargome
Copy link
Member

Adds a new bunRuntimeMetricsIntegration that collects runtime metrics on a configurable interval using process.memoryUsage(), process.cpuUsage(), performance.eventLoopUtilization(), and process.uptime().

Default metrics (bun.runtime.* prefix):

  • mem.rss, mem.heap_used, mem.heap_total
  • cpu.utilization
  • event_loop.utilization
  • process.uptime

Opt-in: cpuTime (cpu.user, cpu.system), memExternal (mem.external, mem.array_buffers)

vs. nodeRuntimeMetricsIntegration: No event loop delay histogram metrics (monitorEventLoopDelay is
unavailable in Bun). ELU is guarded with try/catch for older Bun versions. Uses bun.runtime.* prefix and
auto.bun.runtime_metrics origin.

Includes unit tests (bun:test) and integration tests.

closes https://linear.app/getsentry/issue/JS-1956/runtime-metrics-bun-support

@linear-code
Copy link

linear-code bot commented Mar 25, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 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 ✨

  • (bun) Add bunRuntimeMetricsIntegration by chargome in #19979
  • (node) Add nodeRuntimeMetricsIntegration by chargome in #19923
  • (nuxt) Support parametrized SSR routes in Nuxt 5 by s1gr1d in #19977

Bug Fixes 🐛

  • (opentelemetry) Convert seconds timestamps in span.end() to milliseconds by logaretm in #19958

Documentation 📚

  • (release) Update publishing-a-release.md by nicohrubec in #19982

Internal Changes 🔧

  • (core) Consolidate getOperationName into one shared utility by nicohrubec in #19971
  • (deno) Expand Deno E2E test coverage by chargome in #19957

🤖 This preview updates automatically when you update the PR.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 25, 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% +44 B 🔺
@sentry/browser (incl. FeedbackAsync) 35.4 kB +0.12% +39 B 🔺
@sentry/browser (incl. Metrics) 26.96 kB +0.14% +37 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.3 kB +0.13% +86 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.85 kB +0.1% +85 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.46 kB +0.2% +112 B 🔺
@sentry/node 173.49 kB +0.2% +337 B 🔺
@sentry/node - without tracing 96.47 kB +0.13% +123 B 🔺
@sentry/aws-serverless 113.48 kB +0.13% +142 B 🔺

View base workflow run

@chargome chargome self-assigned this Mar 26, 2026
chargome and others added 17 commits March 26, 2026 12:19
…google-cloud-serverless, skip for bun

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ener

Fixes the beforeExit listener to fire on every invocation in serverless
warm starts (e.g. AWS Lambda). Also properly removes the old listener on
re-init to avoid accumulation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Framework wrappers (SvelteKit, TanStack, etc.) already call flushIfServerless
after each request handler. The beforeExit flush was redundant and introduced
an infinite loop risk since Node.js re-emits beforeExit after async work
completes. Metrics are sent by the periodic interval or the existing SDK
flush infrastructure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rtions in tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…meMetricsIntegration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…s in integration tests

ArrayContaining items are matched with strict equals (subsetEquality is not
propagated), so extra attributes like sentry.timestamp.sequence and server.address
caused all arrayContaining matches to fail. Wrapping with expect.objectContaining
allows extra keys.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mirrors nodeRuntimeMetricsIntegration but adapted for Bun:
- Same CPU, memory, ELU, and uptime metrics
- No event loop delay percentiles (monitorEventLoopDelay not available in Bun)
- ELU wrapped in try/catch for forward compatibility with older Bun versions
- Metrics use bun.runtime.* prefix and auto.bun.runtime_metrics origin
- BunRuntimeMetricsOptions reuses NodeRuntimeMetricsOptions collect shape
  (minus the unsupported eventLoopDelay* flags)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds node-integration-tests scenarios that exercise the bun integration
using @sentry/node for init (bunRuntimeMetricsIntegration is Node-compatible
since it only uses perf_hooks and process.*).

Four test scenarios:
- default metrics shape (6 metrics with correct attributes/units)
- opt-in metrics not emitted by default
- all metrics when cpuTime + memExternal opted in
- opt-out leaves only memory metrics

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@chargome chargome force-pushed the feat/bun-runtime-metrics branch from bc1c167 to 33f816b Compare March 26, 2026 11:19
@chargome chargome marked this pull request as ready for review March 26, 2026 13:04
@chargome chargome requested review from a team, mydea and nicohrubec and removed request for a team and mydea March 26, 2026 13:04
@chargome chargome requested review from a team, JPeer264, Lms24 and s1gr1d and removed request for a team and JPeer264 March 26, 2026 13:04
Comment on lines +5 to +18
### Important Changes

- **feat(node, bun): Add runtime metrics integrations for Node.js and Bun ([#19923](https://github.com/getsentry/sentry-javascript/pull/19923), [#19979](https://github.com/getsentry/sentry-javascript/pull/19979))**

New `nodeRuntimeMetricsIntegration` and `bunRuntimeMetricsIntegration` automatically collect runtime health metrics and send them to Sentry on a configurable interval (default: 30s). Collected metrics include memory (RSS, heap used/total), CPU utilization, event loop utilization, and process uptime. Node additionally collects event loop delay percentiles (p50, p99). Extra metrics like CPU time and external memory are available as opt-in.

```ts
// Node.js
import * as Sentry from '@sentry/node';

Sentry.init({
dsn: '...',
integrations: [Sentry.nodeRuntimeMetricsIntegration()],
});
Copy link
Member Author

Choose a reason for hiding this comment

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

I added the note for node again bc this was somehow lost in the gitflow merge (?)

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.

1 participant