Real User Monitoring (RUM)

See Real User Experience — Web Vitals, Errors, Sessions & Resources

Watchlog RUM measures what real users experience: LCP/INP/CLS/TTFB, JavaScript errors with stack traces, slow resources, and session activity — with filters for environment, browser, and device.

Why real user monitoring?

Synthetic is great; but RUM shows what real users actually experience—across devices, networks, and browsers.

  • Web Vitals (LCP/INP/CLS/TTFB) with p50/p75/p95 and trends.
  • JavaScript error grouping with stable fingerprints and stack traces.
  • Slow resources by path with p95 duration and transfer size.
  • Filters by environment, device and browser + custom time ranges.

What you get with Watchlog RUM

One clean dashboard

Traffic, errors, vitals, and resources—in one place.

Fast troubleshooting

Jump from routes to error groups and sample sessions.

Flexible segmentation

Slice by env, browser and device in seconds.

Privacy & sampling

Control sampling and redact data via beforeSend.

Key Features

Web Vitals p50/p75/p95

Monitor LCP/INP/CLS/TTFB by path and time range.

Error Grouping

Stable fingerprints, message, and last stack trace.

Session Explorer

Session list + event details and custom data.

Slow Resources

p95 duration, transfer sizes, and initiator types.

Filters & Ranges

Change timeframes and filters instantly.

API & Export

Public endpoints to power charts and reports.

How it works

  1. 1. Install
    Add the React/Vanilla SDK.
  2. 2. Configure
    Endpoint, API Key, app, environment.
  3. 3. Deploy
    Start collecting real user events.
  4. 4. Explore
    Dashboards, tables, and sessions.
  5. 5. Improve
    Track trends and prevent regressions.

Use in React — in Minutes

Install the SDK, wrap your app with the Provider—that’s it. (Optional: install web-vitals for more precise reporting)

React + @watchlog/rum-react

npm i @watchlog/rum-react web-vitals
  
  
  // src/main.tsx
  import React from 'react'
  import ReactDOM from 'react-dom/client'
  import { BrowserRouter, Route } from 'react-router-dom'
  import { RumProvider, WatchlogRoutes } from '@watchlog/rum-react'
  
  import App from './App'
  import User from './UserPage'
  
  ReactDOM.createRoot(document.getElementById('root')!).render(
    <React.StrictMode>
      <RumProvider
        config={{
          app: 'test-rum-react',
          apiKey : "<API-Key>",
          environment: 'dev',
          endpoint: '<EndPoint>',
          sampleRate: 0.3,
          networkSampleRate: 0.3,
          enableWebVitals: true,
          autoTrackInitialView: true,
          captureLongTasks: true,
          captureFetch: true,
          captureXHR: true,
          beforeSend: (ev) => {
            if (ev.type === 'web_vital') {
              console.log('WEB_VITAL →', ev.data.name, ev.data.value, ev);
            }
            return ev;
          },
        }}
      >
        <BrowserRouter>
          <WatchlogRoutes>
            <Route path="/" element={<App />} />
            <Route path="/user/:id" element={<User />} />
          </WatchlogRoutes>
        </BrowserRouter>
      </RumProvider>
    </React.StrictMode>
  )

Popular RUM Use Cases

Performance regressions

Track LCP/INP/CLS after each release.

JS error tracking

Group messages, top paths, and error rates.

Release / Env comparison

Compare prod/staging or versions with quick filters.

RUM FAQs

Do I need web-vitals?

Optional, but recommended for precise INP/CLS/LCP values.

What data is collected?

page_view, web_vital, resource, error and optional custom events.

How about privacy?

Use sampling, filters, and the beforeSend hook to redact data.

Does it work with SPAs?

Yes—React (Provider + WatchlogRoutes), Vue, and vanilla JS.

Need something specific? Contact us

Ready to see what your users really experience?