Middleware React Native Real User Monitoring SDK
- AutoInstrumentation HTTP Monitoring
- AutoInstrumentaion JS Errors
- AutoInstrumenation navigation tracking for
react-navigation - AutoInstrumenation native crash errors
- Custom Instrumenation using OpenTelemetry
- Custom logging
- RUM Session Tracking
- Session Recording
Middleware React Native for Mobile supports React Native 0.68 and higher.
Since v2.0.0 the SDK wraps the stable Middleware native SDKs
(io.github.middleware-labs:android-sdk 3.0.2+ and the MiddlewareRum
CocoaPod 2.1+), which brings v3 session recording (rrweb replay), native
crash/ANR reporting, and screen-name linked replays. Native toolchain
requirements:
- Android:
compileSdkVersion35+, Kotlin Gradle Plugin 2.0.21+ (pinclasspath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21")on React Native < 0.77),minSdkVersion21. If your app still enables Jetifier, addandroid.jetifier.ignorelist=jackson-coretogradle.properties. - iOS: deployment target 13.0+, CocoaPods (the
MiddlewareRumpod is pulled automatically). When building pods as static libraries (the default), addpod 'Reachability', :modular_headers => trueto your Podfile.
The library is also compatible with the following frameworks and libraries:
- Expo framework
- React Navigation 5 and 6
yarn add @middleware.io/middleware-react-nativeimport { MiddlewareWrapper, type ReactNativeConfiguration } from '@middleware.io/middleware-react-native';
const MiddlewareConfig: ReactNativeConfiguration = {
serviceName: 'Mobile-SDK-ReactNative',
projectName: '$Mobile-SDK-ReactNative',
accountKey: '<middleware-account-key>',
target: '<target-url>',
deploymentEnvironment: 'PROD',
globalAttributes: {
name: '<your-name>',
},
};
export default function App() {
return (
<MiddlewareWrapper configuration={MiddlewareConfig}>
// Application Components
</MiddlewareWrapper>
);
}You can add custom logs such as debug, error, warn, info these logs will be shown on Middleware Logs Dashboard
MiddlewareRum.debug("I am debug");
MiddlewareRum.error("I am error");
MiddlewareRum.info("I am info");
MiddlewareRum.warn("I am warn");You can set global attributes by calling setGlobalAttributes function.
MiddlewareRum.setGlobalAttributes({
"name": "Middleware",
"app.version": "1.0.0",
"custom_key": "some value"
});To ignore capturing urls pass Array<String | RegExp> in ignoreUrls key in ReactNativeConfiguration
Example:
ignoreUrls: [/^\/api\/facts/, /^\/api\/v1\/users\/.*/],Note: By default SDK captures following
Content-type
application/jsonapplication/texttext/x-component
To redact network headers Set<String> in ignoreHeaders key in ReactNativeConfiguration
Example:
ignoreHeaders: new Set(['x-ignored-header']),Note: By default x-access-token will be readacted.
To disable network instrumentation set networkInstrumentation: false
const MiddlewareConfig: ReactNativeConfiguration = {
...
networkInstrumentation: false
};To enable distributed tracing you need to pass backend domains in tracePropagationTargets which takes values in Array<Regex>
Example:
const MiddlewareConfig: ReactNativeConfiguration = {
...
tracePropagationTargets: [/api.example.com/, /anotherapi.example.com/]
};You can report handled errors, exceptions, and messages using the reportError function
try{
throw new Error("I am error")
} catch (err) {
MiddlewareRum.reportError(err);
}You can set latitude & longitde as global attributes.
MiddlewareRum.updateLocation(latitude: number, longitude: number)By default session recording is enabled, to disable session recording pass sessionRecording: false configuration as follows -
const MiddlewareConfig: ReactNativeConfiguration = {
serviceName: 'Mobile-SDK-ReactNative',
projectName: '$Mobile-SDK-ReactNative',
accountKey: '<middleware-account-key>',
target: '<target-url>',
sessionRecording: false,
deploymentEnvironment: 'PROD',
globalAttributes: {
name: '<your-name>',
},
};Tune how the recording is captured with recordingOptions:
const MiddlewareConfig: ReactNativeConfiguration = {
// ...
sessionRecording: true,
recordingOptions: {
frequency: 'standard', // 'low' (~1 fps, default) | 'standard' | 'high'
quality: 'standard', // 'low' | 'standard' (default) | 'high'
maskAllTextInputs: true, // default true
maskAllImages: true, // default true
},
// Fraction of sessions that get recorded (0.0 - 1.0). Defaults to 1.0.
sessionSamplingRatio: 1.0,
// Fall back to the legacy (v2) screenshot recorder. v3 (rrweb replay) is the default.
disableSessionRecordingV3: false,
};Recording can be controlled after initialization — useful when you only want to record a specific flow:
import { MiddlewareRum } from '@middleware.io/middleware-react-native';
await MiddlewareRum.startRecording(); // -> boolean: recording is running
await MiddlewareRum.stopRecording(); // -> boolean: recording was stopped
await MiddlewareRum.isRecording(); // -> booleanBoth calls are sticky: they survive session rotation and override the session sampler, so recording stays in the state you asked for until you change it again.
startRecording() also overrides sessionRecording: false, which lets you keep
recording off by default and turn it on only where you need it:
MiddlewareRum.init({ ...config, sessionRecording: false });
// later, e.g. when the user enters the checkout flow
await MiddlewareRum.startRecording();
// ...
await MiddlewareRum.stopRecording();Views will get blurred hiding sensitive information in session recording.
<MiddlewareSanitizedView>
<Component/>
</MiddlewareSanitizedView>See the contributing guide to learn how to contribute to the repository and the development workflow.
Apache 2.0