# RUM and synthetic monitoring configured

- **Pattern:** `ab-002045` (`performance-deep-dive.regression-prevention.rum-synthetic-monitoring`)
- **Severity:** low
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-002045
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-002045)

## Why it matters

Synthetic monitoring (Lighthouse CI, automated browser tests) catches regressions in controlled conditions. RUM (Real User Monitoring) captures what actually happens across your user base — different devices, networks, geographies, and browser versions. ISO 25010:2011 time-behaviour requires measuring real performance; without RUM, you are optimizing against lab conditions that may not match production. Without synthetic monitoring, you lack a baseline to detect regressions before they affect users.

## Severity rationale

Low because monitoring is detective rather than preventive — its absence does not degrade performance directly, but means regressions go undetected until user complaints surface them, often after significant impact.

## Remediation

Integrate the `web-vitals` library to collect LCP, CLS, and FID/INP from real users and send to your analytics backend. Pair with Lighthouse CI for synthetic baselines.

```tsx
// app/layout.tsx — report Web Vitals to your analytics endpoint
import { useReportWebVitals } from 'next/web-vitals'

export function WebVitalsReporter() {
  useReportWebVitals((metric) => {
    fetch('/api/vitals', {
      method: 'POST',
      body: JSON.stringify({ name: metric.name, value: metric.value, id: metric.id }),
    })
  })
  return null
}
```

## Detection

- **ID:** `rum-synthetic-monitoring`
- **Severity:** `low`
- **What to look for:** Count all monitoring integrations. Enumerate which provide RUM (Real User Monitoring) vs. synthetic monitoring. At least 2 monitoring types needed. Look for monitoring service integrations (web-vitals, Sentry, Datadog, New Relic, Google Analytics 4). Check for RUM (Real User Monitoring) dashboards. Look for synthetic monitoring (Lighthouse CI, Browserstack, etc.).
- **Pass criteria:** Both RUM and synthetic monitoring are configured. RUM captures real user metrics (LCP, CLS, FID). Synthetic monitoring runs automated tests on each deploy.
- **Fail criteria:** No monitoring configured, or only one type (RUM or synthetic, not both).
- **Skip (N/A) when:** Never — monitoring is essential for production applications.

- **Cross-reference:** For regression alerts built on monitoring data, see `regression-alerts-configured`.
- **Detail on fail:** `"No monitoring configured — performance regressions undetected until users complain"` or `"Only synthetic monitoring; no real user data about actual performance"`
- **Remediation:** Integrate web-vitals and a monitoring service like Sentry, Datadog, or New Relic.

  ```tsx
  // app/layout.tsx — web-vitals RUM integration
  import { useReportWebVitals } from 'next/web-vitals'
  useReportWebVitals((metric) => fetch('/api/vitals', { method: 'POST', body: JSON.stringify(metric) }))
  ```

## External references

- iso-25010 time-behaviour

Taxons: observability, performance

HTML version: https://auditbuffet.com/patterns/ab-002045
