概要
React Native のクラッシュレポートとエラー追跡を有効にすると、リアルユーザーモニタリングで包括的なクラッシュレポートとエラートレンドを取得できます。
React Native アプリケーションの新しい CodePush バージョンをリリースするたびに、エラーを解除するために Datadog にソースマップをアップロードする必要があります。
Datadog では、アプリ内で @datadog/mobile-react-native-code-push を使用し、ソースマップをアップロードするために datadog-ci react-native codepush コマンドを使うことを推奨しています。これにより、報告されたクラッシュとアップロードされたソースマップの両方で version が一貫していることが確認されます。
Datadog SDK を codepush で設定する際に問題が発生した場合は、弊社のサンプルアプリケーションを参考にすることができます。
セットアップ
React Native モニタリングのインストール手順を参照して、@datadog/mobile-react-native をインストールしてください。
続いて、@datadog/mobile-react-native-code-push をインストールします。
NPM でインストールするには、以下を実行します。
npm install @datadog/mobile-react-native-code-push
Yarn でインストールするには、以下を実行します。
yarn add @datadog/mobile-react-native-code-push
DdSdkReactNative.initialize による初期化
コード中の DdSdkReactNative.initialize を DatadogCodepush.initialize に置き換えてください。
import { DdSdkReactNativeConfiguration } from '@datadog/mobile-react-native';
import { DatadogCodepush } from '@datadog/mobile-react-native-code-push';
const config = new DdSdkReactNativeConfiguration(
'<CLIENT_TOKEN>',
'<ENVIRONMENT_NAME>',
'<RUM_APPLICATION_ID>',
true, // ユーザーインタラクション (ボタンのタップなど) を追跡します。'accessibilityLabel' 要素のプロパティを使って、タップアクションに名前を付けることができます。それ以外の場合は、要素の種類を報告します
true, // XHR リソースを追跡します
true // エラーを追跡します
);
await DatadogCodepush.initialize(config);
DatadogProvider による初期化
App コンポーネントの DatadogProvider を DatadogCodepushProvider に置き換えてください。
import { DatadogCodepushProvider } from '@datadog/mobile-react-native-code-push';
export default function App() {
return (
<DatadogCodepushProvider configuration={datadogConfiguration}>
<Navigation />
</DatadogCodepushProvider>
);
}
CodePush のバージョンの取得は、Datadog React Native SDK for RUM の初期化前に実行する必要のある非同期的なステップであるため、DatadogCodepushProvider を使用する場合は、InitializationMode.SYNC と InitializationMode.ASYNC との間に違いはありません。
CodePush のソースマップをアップロードする
プロジェクトに @datadog/datadog-ci を開発依存としてインストールします。
NPM でインストールするには
npm install @datadog/datadog-ci --save-dev
Yarn でインストールするには
yarn add -D @datadog/datadog-ci
プロジェクトのルートに、API キーと Datadog のサイト (datadoghq.com でない場合) を含む gitignore された datadog-ci.json ファイルを作成します。
{
"apiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"site": "datadoghq.eu"
}
また、環境変数 DATADOG_API_KEY と DATADOG_SITE としてエクスポートすることも可能です。
新しい CodePush バンドルをリリースする際、ソースマップとバンドルを出力するディレクトリを指定します。
appcenter codepush release-react -a MyOrganization/MyApplication -d MyDeployment --sourcemap-output --output-dir ./build
適切な CodePush の app と deployment 引数を渡し、datadog-ci react-native codepush コマンドを実行します。
NPM で実行するには
npm run datadog-ci react-native codepush --platform ios --service com.company.app --bundle ./build/CodePush/main.jsbundle --sourcemap ./build/CodePush/main.jsbundle.map --app MyOrganization/MyApplication --deployment MyDeployment
Yarn で実行するには
yarn datadog-ci react-native codepush --platform ios --service com.company.app --bundle ./build/CodePush/main.jsbundle --sourcemap ./build/CodePush/main.jsbundle.map --app MyOrganization/MyApplication --deployment MyDeployment
代替テクノロジー
これらのステップでは、version が {commercialVersion}-codepush.{codePushLabel} の形式、例えば 1.2.4-codepush.v3 と一致することを確認します。
また、SDK の構成で versionSuffix を指定することでも実現できます。
const config = new DdSdkReactNativeConfiguration(
'<CLIENT_TOKEN>',
'<ENVIRONMENT_NAME>',
'<RUM_APPLICATION_ID>',
true, // ユーザーインタラクションを追跡します (ボタンのタップなど。'accessibilityLabel' 要素のプロパティを使って、タップアクションに名前を付けることができます。それ以外の場合は、要素の種類を報告します)
true, // XHR リソースを追跡します
true // エラーを追跡します
);
config.versionSuffix = `codepush.${codepushVersion}`; // "1.0.0-codepush.v2" になります
バージョンの衝突を避けるために、versionSuffix はサフィックスの前にダッシュ (-) を追加します。
codepushVersion を取得するには、ハードコードするか、CodePush.getUpdateMetadata を使用します。
次に、datadog-ci react-native upload コマンドを使用してソースマップをアップロードし、--release-version 引数が SDK 構成で設定されたものと一致することを確認します。
デバイスがオフラインの時のデータ送信
RUM では、ユーザーのデバイスがオフラインのときにもデータを確実に利用できます。ネットワークの状態が悪いエリアやデバイスのバッテリーが非常に少ないなどの場合でも、すべての RUM イベントは最初にローカルデバイスにバッチで格納されます。
各バッチはインテークの仕様に従います。ネットワークが利用可能で、Datadog SDK がエンドユーザーのエクスペリエンスに影響を与えないようにバッテリーの残量が十分にあれば、バッチはすぐに送信されます。アプリケーションがフォアグラウンドにあるときにネットワークが利用できない場合、またはデータのアップロードが失敗した場合、バッチは正常に送信されるまで保持されます。
つまり、ユーザーがオフラインでアプリケーションを開いても、データが失われることはありません。SDK がディスク容量を使いすぎないようにするため、ディスク上のデータは、古すぎる場合自動的に破棄されます。
参考資料