Real user monitoring
Instrument your application to capture every real user session — paint timings, long tasks, and errors — so you ship fixes before users notice.
Overview
Real user monitoring (RUM) collects performance and error telemetry from actual browser sessions. Unlike synthetic checks, RUM surfaces the exact experience your paying customers hit — slow LCP on a specific device, a JS error triggered by a third-party script, or a layout shift caused by a late-loading ad.
Core signals
- Web Vitals — LCP, FID/INP, CLS captured via the
web-vitalslibrary or the PerformanceObserver API. - Long tasks — any task blocking the main thread for >50 ms, surfaced through the Long Animation Frame API.
- JavaScript errors — unhandled exceptions and unhandled promise rejections, with stack traces and breadcrumbs.
- Navigation timing — DNS, TLS, TTFB, and DOM interactive from the Navigation Timing API.
Instrumentation snippet
import { onLCP, onINP, onCLS } from 'web-vitals';
function send(metric) {
fetch('/api/rum', {
method: 'POST',
body: JSON.stringify(metric),
keepalive: true,
});
}
onLCP(send);
onINP(send);
onCLS(send);Ingestion pipeline
Nimbus ships a lightweight Edge ingestion endpoint that validates, samples, and forwards RUM payloads to your observability stack. Configure sampling rates per signal type and set percentile thresholds to avoid alert fatigue.
This recipe is part of the Nimbus documentation. For setup guides and advanced configuration, visit the full docs.