关于 dt-obs-react-native
为编码 Agent 提供 Dynatrace React Native 插件集成指导,涵盖配置、Babel、原生项目配置、导航追踪和隐私选项,并根据项目文件选择步骤。
主要功能
- 01检查并配置 Dynatrace 配置文件
- 02安装插件并配置 Babel
- 03运行脚本配置 Android 与 iOS
- 04设置导航追踪及可选 SDK 启动
- 05提供验证与故障排查步骤
适用场景
- 01为 React Native 或 Expo 应用接入 Dynatrace
- 02检查并更新 Babel 与原生配置
- 03按用户同意配置数据采集
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dynatrace/ dynatrace-for-ai --skill dt-obs-react-native安装后在 Claude Code 中输入/dt-obs-react-native确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/config-js.mduser-opt-in.mdverification.md详细介绍
Dynatrace React Native 插件集成技能
前置条件
- 已安装 Node.js 16.0+ 和 npm,且可通过
PATH访问 - 已有 React Native 项目(v0.68+)或 Expo 项目(v45+),项目根目录包含
package.json - 存在
android/和ios/平台文件夹(Expo 托管工作流需先运行npx expo prebuild) - 拥有可访问 Experience Vitals 的 Dynatrace 环境(用于获取
applicationId和beaconUrl,或下载dynatrace.config.js) - 可访问 Experience Vitals → Mobile 控制台,以配置应用设置(Data Privacy、Enablement 和 Cost Control)
- 用于 iOS 构建的 macOS 和 CocoaPods
请按顺序完成以下步骤,并在每个决策点与用户确认。提出更改建议前,先读取实际项目文件;不要臆测当前状态。
步骤 1 — 检查是否已有 dynatrace.config.js
在询问用户任何问题之前,检查项目根目录是否存在 dynatrace.config.js。
- **文件存在:**读取文件,显示
applicationId和beaconUrl,并确认它们与目标环境一致。如果正确,运行下方的userOptIn检查,然后跳至步骤 3(配置已存在,无需执行步骤 2)。 - **文件不存在:**继续步骤 2。
userOptIn 检查:
检查文件中的 userOptIn(Android 配置块)和 DTXUserOptIn(iOS 配置块)。
- **两个平台都存在:**按原值处理。如果为
true,标记步骤 9;如果为false,跳过步骤 9。 - 任一平台缺失:询问用户:“是否启用了 User Opt-In 模式?”(如不确定,请前往:Experience Vitals → Mobile → [Your App] → Settings → Data Privacy。)将缺失的值添加到相关平台,然后在最终值为
true时标记步骤 9。
步骤 2 — 获取 dynatrace.config.js(仅当步骤 1 中未找到文件时)
询问用户希望采用哪种方式:
选项 A — 从控制台下载(推荐):
- 打开其 Dynatrace 环境
- 前往:Experience Vitals → New Frontend → Mobile
- 输入应用名称,并选择 React Native 作为平台
- 在 Select capability and settings 屏幕中,配置监控功能(崩溃报告、用户操作监控等)
- 下载
dynatrace.config.js,并将其放在项目根目录(与package.json同级)
文件就位后,执行步骤 1 中的 userOptIn 检查,并在需要时标记步骤 9。
选项 B — 手动提供凭据:
阅读 references/config-js.md,了解完整模板和条件配置块。创建任何文件前,先向用户收集所有必需值,然后执行 userOptIn 检查,并在需要时标记步骤 9。
步骤 3 — 安装插件
先读取 package.json。
- **未安装:**运行:
npm install @dynatrace/react-native-plugin - **已列在
dependencies中:**无需更改。 - **列在
devDependencies中:**将其移除并运行npm install @dynatrace/react-native-plugin。插件是运行时必需项,包括发布构建。
注意:npm install 会按字母顺序排列 package.json 中的 dependencies 对象。此步骤后现有条目的顺序可能发生变化,这是 npm 的预期行为,并非错误。
步骤 4 — 安装 iOS Pods(仅限 macOS)
如果使用 macOS 且目标平台为 iOS,请运行:
cd ios && pod install && cd ..
确认成功后再继续。必须安装 CocoaPods(如缺失,请运行 gem install cocoapods)。
步骤 5 — 在 babel.config.js 中注册 Babel 插件
读取 babel.config.js。将 BabelPluginDynatrace 添加到 plugins 数组中,如果存在 react-native-reanimated/plugin,则将其放在该插件之前(reanimated 必须始终位于最后):
module.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
],
};
- 如果
plugins数组中已包含'@dynatrace/react-native-plugin/instrumentation/BabelPluginDynatrace':跳过此步骤。 - 如果
dynatrace.config.js中设置了useLegacyJscodeshift: true:Babel 插件已在内部应用,跳过此步骤。 - 如果项目已在
metro.config.js中配置babelTransformerPath: '@dynatrace/react-native-plugin/lib/dynatrace-transformer':这是旧版 Metro 转换器方案,自动插桩已处理;跳过此步骤和步骤 6。
需要标记并纠正的常见错误:
- 将插件放在
presets中,而不是plugins中 - 将
BabelPluginDynatrace放在react-native-reanimated/plugin之后——reanimated 必须始终是绝对最后一个插件
步骤 6 — 在 babel.config.js 中注册 JSX runtime
读取 babel.config.js,确定项目使用哪个 preset——这决定了如何注册 JSX runtime。
Expo(babel-preset-expo)
如果 presets 中出现 babel-preset-expo,请在 preset 本身上设置 jsxImportSource。不要单独添加 @babel/plugin-transform-react-jsx 插件——Expo 的 preset 已负责 JSX 转换,叠加第二个 JSX 插件会破坏插桩。
module.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-expo已有jsxImportSource: '@dynatrace/react-native-plugin':无需更改。 - 如果已设置其他
jsxImportSource:将其替换为'@dynatrace/react-native-plugin'。 - 移除现有的任何
@babel/plugin-transform-react-jsx插件条目——它不得与babel-preset-expo上的 preset 级jsxImportSource同时存在。
Bare React Native(@react-native/babel-preset 或 metro-react-native-babel-preset)
对于 metro 0.72.0+(React Native 0.71+),在 plugins 数组中将带有 Dynatrace importSource 的 @babel/plugin-transform-react-jsx 添加到 BabelPluginDynatrace 之前:
module.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-jsx(JSX runtime — 第一个)BabelPluginDynatrace(自动插桩 — 位于 reanimated 之前)react-native-reanimated/plugin(必须绝对位于最后)
- 如果项目已有带有
importSource: '@dynatrace/react-native-plugin'的@babel/plugin-transform-react-jsx:无需更改。 - 如果已设置其他
importSource:将其替换为'@dynatrace/react-native-plugin'。
更改 Babel 后,请在下次构建时重置 Metro 缓存:
npx react-native start --reset-cache
步骤 7 — 运行 npx instrumentDynatrace
npx instrumentDynatrace
此命令会读取 dynatrace.config.js,并自动配置 Android build.gradle 和 iOS Info.plist。每当 dynatrace.config.js 发生更改时,都必须重新运行。
需要标记并纠正的常见错误:
- 更改
dynatrace.config.js后跳过此步骤 - 使用
react-native instrument-dynatrace——效果相同,但已在 RN 0.70+ 中弃用 - 手动编辑
build.gradle或Info.plist——无需手动操作,脚本会处理
如果 android/ 和 ios/ 文件夹存在,但自动发现 plist 失败,请传入显式路径:
npx instrumentDynatrace plist=ios/YourApp/Info.plist
**仅限 Expo:**如果 android/ 和 ios/ 文件夹尚不存在,请先运行 npx expo prebuild,然后重新运行 npx instrumentDynatrace。
步骤 7a — 手动启动 SDK(仅在 autoStart: false 时)
如果 dynatrace.config.js 中的 autoStart 为 true 或未设置,请跳过此步骤——SDK 会自动启动。
检查 dynatrace.config.js 中的 react 块,确认是否设置了 autoStart: false。如果设置了,SDK 不会自行启动,并且在显式调用 Dynatrace.start() 之前不会收集任何数据。
在应用入口文件的顶层添加启动调用(例如 App.tsx 或 index.js)。依赖 SDK 就绪状态的逻辑应放在 await 之后:
import { 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.js 中的完全相同的值——它们必须匹配,否则 SDK 会将数据报告到错误的环境。
**重要:**即使 autoStart: false,dynatrace.config.js 中仍必须包含 beaconUrl 和 applicationId(npx instrumentDynatrace 会用它们配置原生文件)。运行时传递给 ConfigurationBuilder 的值会生效——使用手动启动时,配置文件中的值会被忽略。
**权衡:**手动启动会导致 SDK 错过原生应用启动事件,以及在调用 start() 之前发生的所有交互。除非运行时注入凭据是硬性要求,否则请使用 autoStart: true(默认值)。
步骤 8 — 启用导航跟踪
检查 dynatrace.config.js 中的 react.navigation 块,并检查 package.json 中是否包含 @react-navigation/native。
如果存在 @react-navigation/native,且未将 navigation.enabled 设为 true,请添加:
module.exports = {
react: {
navigation: {
enabled: true, // requires @react-navigation/native v5–v7
},
// ...
},
// ...
};
然后重新运行 npx instrumentDynatrace。
**此设置的作用:**启用后,插件会接入 React Navigation 的 NavigationContainer,并自动检测路由变化。每个导航事件都会作为视图变化报告给 Dynatrace,当前路由会以 URL 风格的路径表示(例如 /Home、/Home/Details)。这会在 Dynatrace 用户会话中填充屏幕时间线,并将所有事件关联到当前活动屏幕。插件自带的配置模板默认启用此设置。
如果未安装 @react-navigation/native:请告知用户,自动视图跟踪需要 @react-navigation/native。用户也可以改用 Dynatrace.startView("ScreenName") 手动跟踪视图。
步骤 9 — 隐私选项调用(仅在 userOptIn: true 时)
如果步骤 1 或步骤 2 中未将 userOptIn 设为 true,请跳过此步骤。
阅读 references/user-opt-in.md,了解 DataCollectionLevel、crashReportingOptedIn 和调用位置选项的完整指南。向用户询问其中定义的问题,然后在相关文件中添加调用。
步骤 10 — 设置后摘要
向用户确认当前启用的功能:
默认启用(userOptIn 为 false 或未设置时):
- ✅ 崩溃报告
- ✅ 用户操作跟踪(Touchables、Buttons、Pressable、Switch)
- ✅ 网络监控
- ✅ 错误处理器
- ✅ 自动启动
当
userOptIn: true时,所有数据收集(包括崩溃报告)都必须通过调用applyUserPrivacyOptions(...)才会启用。
本次设置中配置的内容:
- 隐私模式:[userOptIn: true — 已添加同意调用 / 选择退出(SDK 默认值)]
- 导航跟踪:[react.navigation.enabled: true / 通过 Dynatrace.startView() 手动跟踪]
步骤 11 — 验证
阅读 references/verification.md,并向用户展示验证清单。如果 5 分钟后仍未显示任何数据,请按照该文件中的故障排除步骤进行排查。
参考文件
references/config-js.md— 完整的dynatrace.config.js模板,包含 Grail 和 userOptIn 条件块references/user-opt-in.md—applyUserPrivacyOptions指南、DataCollectionLevel选项和调用位置选项references/verification.md— 设置后验证清单和故障排除
外部参考资料
- npm 上的 @dynatrace/react-native-plugin — 软件包更新日志、API 文档和最新版本
- Dynatrace React Native 安装文档 — 官方设置指南