概要

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.initializeDatadogCodepush.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 コンポーネントの DatadogProviderDatadogCodepushProvider に置き換えてください。

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.SYNCInitializationMode.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_KEYDATADOG_SITE としてエクスポートすることも可能です。

新しい CodePush バンドルをリリースする際、ソースマップとバンドルを出力するディレクトリを指定します。

appcenter codepush release-react -a MyOrganization/MyApplication -d MyDeployment --sourcemap-output --output-dir ./build

適切な CodePush の appdeployment 引数を渡し、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 がディスク容量を使いすぎないようにするため、ディスク上のデータは、古すぎる場合自動的に破棄されます。

参考資料