Loading...
Loading...
Integrate the Dynatrace React Native Plugin into a React Native or Expo project — dependency setup, dynatrace.config.js, Babel registration, npx instrumentation, navigation tracking, user privacy options, and verification. Handles both bare React Native and Expo (babel-preset-expo) Babel configuration automatically. Trigger: "add Dynatrace to React Native", "React Native plugin setup", "instrument React Native app", "integrate Dynatrace RN", "mobile observability React Native", "react-native-plugin", "dynatrace react native", "add Dynatrace to Expo", "instrument Expo app", "Dynatrace Expo setup". Do NOT use for: querying RN RUM data (use dt-obs-frontends), non-React Native mobile setups, or Dynatrace server-side configuration.
npx skill4agent add dynatrace/dynatrace-for-ai dt-obs-react-nativePATHpackage.jsonandroid/ios/npx expo prebuildapplicationIdbeaconUrldynatrace.config.jsdynatrace.config.jsdynatrace.config.jsapplicationIdbeaconUrluserOptInuserOptInuserOptInDTXUserOptIntruefalsetruedynatrace.config.jsdynatrace.config.jspackage.jsonuserOptInreferences/config-js.mduserOptInpackage.jsonnpm install @dynatrace/react-native-plugindependenciesdevDependenciesnpm install @dynatrace/react-native-pluginnpm installdependenciespackage.jsoncd ios && pod install && cd ..gem install cocoapodsbabel.config.jsbabel.config.jsBabelPluginDynatracepluginsreact-native-reanimated/pluginmodule.exports = {
presets: ['module:@react-native/babel-preset'],
plugins: [
// ... existing plugins ...
'@dynatrace/react-native-plugin/instrumentation/BabelPluginDynatrace',
// react-native-reanimated/plugin goes here if present — must stay last
],
};'@dynatrace/react-native-plugin/instrumentation/BabelPluginDynatrace'useLegacyJscodeshift: truedynatrace.config.jsmetro.config.jsbabelTransformerPath: '@dynatrace/react-native-plugin/lib/dynatrace-transformer'presetspluginsBabelPluginDynatracereact-native-reanimated/pluginbabel.config.jsbabel.config.jsbabel-preset-expobabel-preset-expopresetsjsxImportSource@babel/plugin-transform-react-jsxmodule.exports = function (api) {
api.cache(true);
return {
presets: [
['babel-preset-expo', {
jsxRuntime: 'automatic',
jsxImportSource: '@dynatrace/react-native-plugin',
}],
],
plugins: [
'@dynatrace/react-native-plugin/instrumentation/BabelPluginDynatrace',
'react-native-reanimated/plugin', // stays last
],
};
};babel-preset-expojsxImportSource: '@dynatrace/react-native-plugin'jsxImportSource'@dynatrace/react-native-plugin'@babel/plugin-transform-react-jsxjsxImportSourcebabel-preset-expo@react-native/babel-presetmetro-react-native-babel-preset@babel/plugin-transform-react-jsximportSourceBabelPluginDynatracemodule.exports = {
presets: [
['module:@react-native/babel-preset', { unstable_transformProfile: 'hermes-stable' }],
],
plugins: [
['@babel/plugin-transform-react-jsx', {
runtime: 'automatic',
importSource: '@dynatrace/react-native-plugin',
}],
'@dynatrace/react-native-plugin/instrumentation/BabelPluginDynatrace',
'react-native-reanimated/plugin', // stays last
],
};@babel/plugin-transform-react-jsxBabelPluginDynatracereact-native-reanimated/plugin@babel/plugin-transform-react-jsximportSource: '@dynatrace/react-native-plugin'importSource'@dynatrace/react-native-plugin'npx react-native start --reset-cachenpx instrumentDynatracenpx instrumentDynatracedynatrace.config.jsbuild.gradleInfo.plistdynatrace.config.jsdynatrace.config.jsreact-native instrument-dynatracebuild.gradleInfo.plistandroid/ios/npx instrumentDynatrace plist=ios/YourApp/Info.plistandroid/ios/npx expo prebuildnpx instrumentDynatraceautoStart: falseautoStarttruedynatrace.config.jsdynatrace.config.jsautoStart: falsereactDynatrace.start()App.tsxindex.jsawaitimport { Dynatrace, ConfigurationBuilder } from '@dynatrace/react-native-plugin';
await Dynatrace.start(
new ConfigurationBuilder('<BEACON_URL>', '<APPLICATION_ID>').buildConfiguration()
);
// SDK is initialized — place any SDK-dependent logic here<BEACON_URL><APPLICATION_ID>dynatrace.config.jsautoStart: falsebeaconUrlapplicationIddynatrace.config.jsnpx instrumentDynatraceConfigurationBuilderstart()autoStart: truedynatrace.config.jsreact.navigationpackage.json@react-navigation/native@react-navigation/nativenavigation.enabledtruemodule.exports = {
react: {
navigation: {
enabled: true, // requires @react-navigation/native v5–v7
},
// ...
},
// ...
};npx instrumentDynatraceNavigationContainer/Home/Home/Details@react-navigation/native@react-navigation/nativeDynatrace.startView("ScreenName")userOptIn: trueuserOptIntruereferences/user-opt-in.mdDataCollectionLevelcrashReportingOptedInuserOptInfalseWhen, all data collection — including crash reporting — is gated on theuserOptIn: truecall.applyUserPrivacyOptions(...)
references/verification.mdreferences/config-js.mddynatrace.config.jsreferences/user-opt-in.mdapplyUserPrivacyOptionsDataCollectionLevelreferences/verification.md