Real User Monitoring
Real User Monitoring SDKs for web, Android, iOS, React Native, and Flutter. Automatic instrumentation for sessions, views, network requests, errors, and resource metrics via OpenTelemetry.
Last9 Real User Monitoring (RUM) captures real user experience data from web and mobile applications. Each SDK instruments sessions, views, network requests, unhandled errors, and resource metrics (plus ANRs on Android), then exports spans and logs to Last9 over OTLP/HTTP.
Supported platforms
What gets captured
All SDKs auto-instrument the same signals:
- Sessions — rolling session IDs with idle + max-duration expiry. Session ID is propagated on every span and log.
- Views / page loads — screen transitions tracked as spans. Auto-tracked via SPA route changes (web), activity lifecycle (Android), UIKit/SwiftUI hooks (iOS), React Navigation (React Native), or
NavigatorObserver(Flutter). ManualstartView(name)is available on every platform. - Network — HTTP requests captured with URL, method, status, duration, request/response sizes. Traceparent header is injected so spans link to backend traces.
- Errors — unhandled JS exceptions, promise rejections, native crashes, and Flutter framework errors. ANR detection is Android-only. Manual
captureError(e, context)is available on every platform. - Core Web Vitals (web) — LCP, FCP, CLS, INP, TTFB.
- Resources (mobile) — periodic memory and CPU samples (configurable interval, default 30s).
- Custom events + attributes —
addEvent,spanAttributes, andidentifyfor user context.
Distribution
SDKs are distributed from Last9’s CDN:
| Platform | Stable version | Artifact | Stable CDN root | Versioned CDN root |
|---|---|---|---|---|
| Web | 2.7.0 | UMD script | https://cdn.last9.io/rum-sdk/builds/stable/v2/ | https://cdn.last9.io/rum-sdk/builds/2.7.0/ |
| Android | 1.1.10 | AAR + POM | https://cdn.last9.io/rum-sdk/android/builds/stable/v1/ | https://cdn.last9.io/rum-sdk/android/maven/io/last9/rum-android/1.1.10/ |
| iOS | 1.1.10 | CocoaPods podspec + SPM XCFramework | https://cdn.last9.io/rum-sdk/ios/builds/stable/v1/ | https://cdn.last9.io/rum-sdk/ios/builds/1.1.10/ |
| React Native | 1.1.10 | npm tarball | https://cdn.last9.io/rum-sdk/react-native/builds/stable/v1/ | https://cdn.last9.io/rum-sdk/react-native/builds/1.1.10/ |
| Flutter | 1.1.10 | tar.gz package | https://cdn.last9.io/rum-sdk/flutter/builds/stable/v1/ | https://cdn.last9.io/rum-sdk/flutter/builds/1.1.10/ |
Stable channels are major-version pinned: Web uses v2; mobile SDKs use v1
and currently serve 1.1.10. The latest versioned mobile release is 1.1.10.
Mobile staging builds use the -alpha suffix and explicit versioned URLs.
Latest versioned changes
- React Native
1.1.10fixes a New Architecture Android clean-build failure. Android, iOS, and Flutter1.1.10are version-parity releases with no functional native changes. - Mobile
1.1.9makesgetSessionId()reliable: it returns a real session id (never an empty string) and, on iOS, is available synchronously as soon asinitialize()returns. On React Native and Flutter,initialize()now resolves with a real session id on iOS instead ofnullor empty.1.1.8is a version-parity release with no functional changes. - Mobile
1.1.7removes the unused OpenTelemetry Android agent so the SDK no longer forcesandroidx.core1.17.0 and AGP 8.9.1+ onto consumers — fixes:app:checkReleaseAarMetadatafailures on older Android toolchains (Android, React Native, Flutter). - React Native
1.1.6migrates the bridge to a real TurboModule soawait L9Rum.initialize()resolves on the New Architecture (bridgeless, default from RN 0.76+). Old Architecture (Paper) remains supported. Upgrade to1.1.6or later if init hangs on bridgeless. - Web
2.7.0adds automatic GraphQL network observability — descriptive span names,graphql.operation.*attributes, and detection oferrors[]returned on HTTP200responses. - Mobile
1.1.0adds the same GraphQL observability across Android, iOS, React Native, and Flutter, including opt-in Layer 2 client integrations (Apollo Link on React Native; Dio and gql interceptors on Flutter). - Mobile
0.9.0adds an embedded per-flow lifecycle —shutdown()andisActive()— so RUM can be scoped to a single flow and safely re-initialized. - Android
1.1.2requires Kotlin1.9.0+ / AGP8.3.0+; Android1.1.1isolates telemetry attribute collection from the request path so a missingREAD_PHONE_STATEpermission can no longer fail a network request. - Mobile
0.8.0changes the ingestionClient-IDheader to an SDK-generated per-install UUID instead ofserviceName, preventing all devices for an app from sharing the same ingestion rate-limit bucket.
Next steps
Pick your platform:
Once data is flowing, explore it in Discover > Applications — performance, errors, sessions, and session correlation with backend traces. To turn RUM signals into alerts (HTTP error rates, p95 latency, crashes, ANRs), see Alerting on RUM Metrics.
Troubleshooting
Please get in touch with us on Discord or Email if you have any questions.