React Native es un marco de JavaScript para desarrollar aplicaciones móviles híbridas que pueden ejecutarse de forma nativa tanto en Android como en iOS.
Si tienes una aplicación híbrida que está creada sobre React Native, puedes usar Datadog para monitorizar la misma aplicación tanto desde el lado nativo de Android o iOS como desde el lado de React Native.
Los eventos RUM de ambas fuentes se notifican como procedentes de la misma aplicación y la misma fuente en Datadog RUM.
Para el rastreo de errores, recursos e interacciones, los SDKs pueden funcionar de las siguientes maneras:
A través de la Instrumentación automática: algunas clases y métodos de React se modifican para automatizar esto. La instrumentación automática para errores, recursos e interacciones de JavaScript solo se puede iniciar desde el código de JavaScript.
A través de la Instrumentación manual: por ejemplo, si quieres informar de algo que consideras un error, pero que no va a colapsar la aplicación.
Puedes compartir la misma instancia del SDK central entre nativo y React Native sin tener que inicializar el SDK en ambos lados por separado. Esto te permite inicializar el SDK nativo en el lado nativo o en el lado de React Native (llamando a DdSdkReactNative.initialize) y tenerlo inicializado para ambos lados, con eventos en la misma sesión RUM. React Native usa la instancia central por defecto. Esto significa que puedes usar la Instrumentación manual en ambos lados, pero la Instrumentación automática solo se activa para el lado en el que se inicializó el SDK.
Puedes informar de eventos o logs de Datadog RUM solo después de la inicialización. Si aún no has inicializado el SDK, eventos y logs no se envían.
No puedes cambiar el atributo de fuente de una sesión RUM; todos tus eventos RUM aparecen bajo la misma fuente.
En Android, añade los SDKs de Datadog Android a tus dependencias en tu archivo android/app/build.gradle:
// La versión se establece por @datadog/mobile-react-nativeimplementation"com.datadoghq:dd-sdk-android-rum"implementation"com.datadoghq:dd-sdk-android-logs"implementation"com.datadoghq:dd-sdk-android-trace"implementation"com.datadoghq:dd-sdk-android-webview"
En iOS, añade los SDKs de iOS Datadog a tus dependencias en tu archivo ios/Podfile para utilizarlos en archivos Objective C:
# Asegúrate de que la versión coincide con la de node_modules/@datadog/mobile-react-native/DatadogSDKReactNative.podspecpod'DatadogSDKObjc','~> 2.5.0'
Si utilizas una biblioteca de navegación para tu aplicación React Native como react-navigation, al utilizar la opción de configuración nativeViewTracking se crean muchas vistas duplicadas.
Si este es el caso, rastrea tus Vistas RUM nativas manualmente. Consulta la documentación para iOS y para Android.
Si has habilitado el rastreo con tu backend, los hosts de origen para tus recursos RUM nativos son los mismos que para tus recursos RUM de React Native.
Si escribes algún código nativo que dependa del SDK de Datadog, asegúrate de ejecutar ese código después de inicializar el SDK en el lado de React Native. Cuando inicializas el SDK en el lado de React Native, también se inicializa en el lado nativo.
Añade el SDK de Android Datadog a tus dependencias en tu archivo android/app/build.gradle:
// La versión se establece por @datadog/mobile-react-native
implementation"com.datadoghq:dd-sdk-android-rum"implementation"com.datadoghq:dd-sdk-android-logs"implementation"com.datadoghq:dd-sdk-android-trace"implementation"com.datadoghq:dd-sdk-android-webview"
Inicializa el SDK en el lado nativo. Consulta la documentación oficial de Android para obtener instrucciones.
Inicializa el SDK en el lado nativo. Consulta la documentación oficial de iOS para obtener instrucciones.
Utiliza un ComponentPredicate para filtrar las vistas nativas creadas por tus bibliotecas de navegación:
// Adapta el tipo de fragmento a tu estrategia de seguimiento de la vista
classRNComponentPredicate:ComponentPredicate<Fragment>{overridefunaccept(component:Fragment):Boolean{// Identica y suelta las vistas de pantalla de React Native
if(component.javaClass.name.startsWith("com.swmansion.rnscreens")){returnfalse}if(component.javaClass.name.startsWith("com.facebook.react")){returnfalse}returntrue}overridefungetViewName(component:Fragment):String?{returnnull}}// Utilízala en tu configuración RUM
rumConfiguration.useViewTrackingStrategy(FragmentViewTrackingStrategy(true,RNComponentPredicate()))
A continuación, utiliza @datadog/mobile-react-navigation para realizar un rastreo de tus vistas.
Si has activado el enmascaramiento de ProGuard, añade reglas para evitar el enmascaramiento de los paquetes de destino en las compilaciones de lanzamiento.
Utiliza un UIKitRUMViewsPredicate para filtrar las vistas nativas creadas por tus bibliotecas de navegación:
classRNHybridPredicate:UIKitRUMViewsPredicate{vardefaultPredicate=DefaultUIKitRUMViewsPredicate()funcrumView(forviewController:UIViewController)->RUMView?{letcanonicalClassName=NSStringFromClass(type(of:viewController))// Suelta las vistas de RNif(canonicalClassName.starts(with:"RN")){returnnil}returndefaultPredicate.rumView(for:viewController)}}// Utilízala en tu configuración RUMletrumConfiguration=RUM.Configuration(applicationID:applicationId,uiKitViewsPredicate:RNHybridPredicate(),)
Envuelve tu aplicación React Native con el componente DatadogProvider para registrar automáticamente errores, interacciones y recursos de React Native RUM:
constconfiguration={trackResources:true,trackErrors:true,trackInteractions:true};constRNApp=props=>{useEffect(()=>{/**
* In here we can put fake values. The only goal of this call
* is to empty the buffer of RUM events.
*/DatadogProvider.initialize({clientToken:'fake_value',env:'fake_value',applicationId:'fake_value'});},[]);constnavigationRef=useRef(null);return(<DatadogProviderconfiguration={configuration}>{/* Content of your app goes here */}</DatadogProvider>);};AppRegistry.registerComponent('RNApp',()=>RNApp);
Para eliminar las interacciones duplicadas en Android, filtra las interacciones de React Native en el lado nativo con un EventMapper:
classRNActionEventMapper:EventMapper<ActionEvent>{overridefunmap(event:ActionEvent):ActionEvent?{vartargetClassName=(event.context?.additionalProperties?.get("action.target.classname")as?String)if(targetClassName?.startsWith("com.facebook.react")==true){returnnull}returnevent}}// Utilízala en tu configuración RUM
rumConfiguration.setActionEventMapper(RNActionEventMapper())
Si has activado el enmascaramiento de ProGuard, añade reglas para evitar el enmascaramiento de los paquetes de destino en las compilaciones de lanzamiento.
Si has especificado un resourceEventMapper o actionEventMapper en tu configuración de React Native, los recursos y acciones no serán eliminados si devuelves null en el asignador.
Para mantener esta funcionalidad, añade los siguientes fragmentos en tu configuración nativa para tu plataforma:
valconfig=RumConfiguration.Builder(applicationId=appId).setResourceEventMapper(object: EventMapper<ResourceEvent>{overridefunmap(event:ResourceEvent):ResourceEvent?{if(event.context?.additionalProperties?.containsKey("_dd.resource.drop_resource")==true){returnnull}// Puedes añadir tu lógica del asignador de eventos personalizada aquí
returnevent}}).setActionEventMapper(object: EventMapper<ActionEvent>{overridefunmap(event:ActionEvent):ActionEvent?{if(event.context?.additionalProperties?.containsKey("_dd.action.drop_action")==true){returnnull}// Puedes añadir tu lógica del asignador de eventos personalizada aquí
returnevent}})
RUM.Configuration(applicationID:applicationId,resourceEventMapper:{resourceEventinifresourceEvent.context?.contextInfo["_dd.resource.drop_resource"]!=nil{returnnil}// Puedes añadir tu lógica del asignador de eventos personalizada aquíreturnresourceEvent},actionEventMapper:{actionEventinifactionEvent.context?.contextInfo["_dd.resource.drop_action"]!=nil{returnnil}// Puedes añadir tu lógica del asignador de eventos personalizada aquíreturnresourceEvent})