デフォルトでは、New Relic React NativeエージェントはJavaScriptエラーと未処理のPromise拒否をキャプチャし、それらをMobileJSErrorイベントとして報告します。これらのエラーはUIで表示し、NRQLでクエリを実行して、ダッシュボードにグラフ化できます。
MobileJSErrorイベントのスタックトレースを人間が読める形式にするには、アプリで実行されているJavaScriptバンドルに対応するソースマップがエージェントに必要です。New RelicユーザーAPIキーとアプリケーショントークンを正しく設定すると、各ビルドの後にエージェントがソースマップを自動的にアップロードします。自動的にアップロードできない場合、またはCodePushやその他のover-the-air(OTA)サービスを使用してJavaScriptのみの更新を配信する場合は、ソースマップを手動でアップロードできます。
重要
ソースマップのアップロードでは、アプリケーショントークンに加えてユーザーAPIキーを使用します。アプリケーショントークンはアプリを識別しますが、特定のユーザーを認証するものではないため、それ単独でアップロードを安全に承認することはできません。ユーザーAPIキーは、リクエストを認証済みのNew Relicユーザーに結び付けます。これにより、(機密性の低い)アプリケーショントークンしか持たない人がソースマップをアップロードしたり上書きしたりするのを防ぎます。ユーザーAPIキーとアプリケーショントークンは、同じNew Relicアカウントに属している必要があります。
ヒント
JavaScriptエラーレポートはデフォルトで有効になっています。MobileJSErrorイベントの記録を完全に無効にするには、jsErrorReportingEnabledの設定をfalseに設定します。
ソースマップの自動アップロードを設定します。
ソースマップを自動的にアップロードするには、New RelicユーザーAPIキーとアプリケーショントークンを指定してください。React Nativeアプリはプラットフォームごとに個別にビルドされるため、AndroidとiOSではキーの設定が異なります。リリースするプラットフォームごとに設定してください。
ヒント
If you build with EAS Build, the steps below get wiped out on every prebuild. Use the config plugin's EAS setup instead so automatic upload survives Continuous Native Generation.
始める前に、同じNew Relicアカウントから以下を取得してください:
- ユーザーAPIキー。
- モバイルアプリケーショントークン(
NewRelic.startAgent()に渡すトークンと同じもの)。
Android
プロジェクトのnewrelic.propertiesファイルにユーザーAPIキーを追加します:
com.newrelic.api_key=<YOUR_USER_API_KEY><YOUR_USER_API_KEY>をユーザーAPIキーに置き換えてください。エージェントはNewRelic.startAgent()からアプリケーショントークンをすでに認識しています。両方の値が有効な場合、各リリースビルドの後にエージェントがAndroidソースマップを生成し、New Relicに自動的にアップロードします。
ヒント
デフォルトでは、自動アップロードはリリースビルドに対してのみ実行されます。デバッグビルドでもソースマップの自動アップロードを行うには、New Relic Gradleプラグインの設定のuploadMapsForVariant設定にDebugを追加してください(例:uploadMapsForVariant("Release", "Debug"))。それ以外の場合は、デバッグビルドのソースマップを手動でアップロードしてください。
iOS
iOSでは、dsym-upload-toolsフォルダー — dSYMのアップロードに使用されるのと同じフォルダー — に含まれるビルドフェーズ・スクリプト(upload-react-native-sourcemap)がソースマップをアップロードします。ユーザーAPIキーとアプリケーション・トークンを引数としてそのスクリプトに渡します。
dSYMのアップロードをまだ設定していない場合は、
dsym-upload-toolsフォルダーをプロジェクトのSRCROOT(通常はiosフォルダー)にコピーしてください。Xcodeでターゲットを選択し、Build Phasesタブを開いて、New Run Script Build Phaseを追加します。ドラッグして、"Bundle React Native code and images"フェーズの後に実行されるようにします。
プレースホルダーをユーザーAPIキーとアプリケーショントークンに置き換えて、実行スクリプトに以下を追加します:
bash$ARTIFACT_DIR="${BUILD_DIR%Build/*}"$SCRIPT=`/usr/bin/find "${SRCROOT}" "${ARTIFACT_DIR}" -type f -name upload-react-native-sourcemap | head -n 1`$/bin/sh "${SCRIPT}" "YOUR_USER_API_KEY" "YOUR_APP_TOKEN"
ヒント
資格情報をバージョン管理にコミットしないでください。ユーザーAPIキーとアプリケーショントークンを.xcconfigファイルまたはCI/CDシステムのシークレットに保存し、実行スクリプト(たとえば、"${NR_USER_API_KEY}" "${NR_APP_TOKEN}")でそれらを参照してください。詳細な出力をupload_sourcemap_results.logに書き込むには、3番目の引数として--debugを追加してください。
iOSスクリプトはReleaseビルドに対してのみ実行され、シミュレータービルドはスキップされます。いずれかの値が欠落しているか無効な場合、エージェントはソースマップをアップロードせず、JavaScriptエラーのスタックトレースはシンボル化されないままになります。その場合は、ソースマップを手動でアップロードしてください。
ソースマップを手動でアップロード
ソースマップをNew Relicシンボル取り込みAPIに直接アップロードできます。これは、自動アップロードが不可能な場合や、CodePushなどのOTAサービスを通じてJavaScriptのみのアップデートをリリースする場合に便利です。
次のcURLテンプレートを使用します:
$curl -X POST "https://symbol-ingest-api.service.newrelic.com/v1/react-native/sourcemaps" \> -H "Api-Key: $NR_USER_API_KEY" \> -H "X-APP-LICENSE-KEY: $NR_APP_TOKEN" \> -F "sourcemap=@./index.android.bundle.map" \> -F "jsBundleId=<JS_BUNDLE_ID>" \> -F "appVersion=1.0.5" \> -F "sourcemapName=index.android.bundle.map"以下を置き換えます:
$NR_USER_API_KEYは有効なNew RelicユーザーAPIキーです。$NR_APP_TOKENモバイル監視アプリケーショントークンです。<JS_BUNDLE_ID>は、JavaScriptセッションに対してエージェントによって報告される一意のビルド識別子です(「jsBundleIdの取得」を参照してください)。appVersionバンドルがターゲットとするネイティブアプリケーションのバージョンです(たとえば、1.0.5)。
ヒント
New RelicのEUデータセンターのアカウントの場合は、代わりにEUエンドポイントを使用してください:https://symbol-ingest-api.service.eu.newrelic.com/v1/react-native/sourcemaps。
New Relicの日本データセンターのアカウントの場合は、代わりに日本のエンドポイントを使用してください:https://symbol-ingest-api.service.jp.newrelic.com/v1/react-native/sourcemaps。
アップロードAPIのリファレンス
終点
プロパティ | 価値 |
|---|---|
方法 |
|
URL |
|
コンテンツタイプ |
|
ヘッダー
ヘッダー | 必須 | 説明 |
|---|---|---|
| はい | 有効なNew Relic 。アプリケーショントークンと同じアカウントに属している必要があります。 |
| はい | モバイルアプリのアプリケーショントークン。 |
| いいえ | バンドラー、ソースマップ名、およびサイズに関するテレメトリー情報です。解凍後のソースマップが200 MBを超える場合、エージェントはファイルを送信せず、代わりにこのヘッダーのみを送信します。 |
| はい |
である必要があります。 |
リクエスト本文(マルチパートフォームデータ)
フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| ファイル | いいえ | ソースマップファイル(
または
)。gzip圧縮が可能です。解凍後最大200 MB( を参照してください)。 |
| 弦 | いいえ | ソースマップファイルの名前です。最大255文字。 |
| 弦 | はい | 一意のビルド識別子(SHAやIDなど)。最大255文字。 |
| 弦 | はい | アプリケーションバージョン(たとえば、
)。最大255文字。 |
重要
解凍後のソースマップファイルが200 MBを超える場合、エージェントはファイルを送信しません。代わりにX-Telemetry-Dataヘッダーを送信するため、New Relicはビルドが発生したことを引き続き追跡できます。詳細については、ファイルサイズの制限をご覧ください。
レスポンス
応答にはContent-Type: application/jsonを使用します。
HTTPステータス | 説明 |
|---|---|
| アップロードが成功しました。レスポンス本文には、ソースマップのメタデータが含まれています: |
| フィールドの欠落、ファイル内の無効なJSONスキーマ、不正なリクエストなどにより、検証に失敗しました。例:
|
| APIキーは有効ですが、
は別のアカウントに属しています(クロスアカウント保護)。例:
|
|
には必要な機能がありません。ユーザーAPIキーが、モバイルエンティティの表示権限を持つユーザーに属していることを確認してください。例:
|
| ヘッダーで提供されたアプリケーショントークンが存在しません。例:
|
| 解凍されたソースマップファイルが200 MBを超えています。例:
|
| サーバー側で一般的な回復不能なエラーが発生しました。例:
|
CodePushおよびOTAアップデート用のソースマップをアップロード
CodePushまたは別のOTAアップデートサービスを使用する場合、JavaScriptバンドルのバージョンはネイティブバイナリのバージョンと異なります。JavaScriptのアップデートをプッシュするたびに、新しいソースマップをアップロードして、New RelicでMobileJSErrorイベントを引き続き読み取れるようにします。
OTAアップデートをシンボリケートするには、アップロードで以下を使用する必要があります:
- JavaScriptセッション中にエージェントが報告するIDと一致する一意の
jsBundleId。 - バンドルがターゲットとするネイティブバージョンである、正しい
appVersion。
CI/CDパイプラインのスクリプトを使用するか、cURLを使用して手動でソースマップをアップロードできます。
方法1:スクリプトによる自動アップロード
New Relicは、appcenter codepush release-reactコマンドの直後にCI/CDパイプラインで実行できるNode.jsヘルパースクリプトを提供しています。
$# Example integration$appcenter codepush release-react -a <Owner>/<App>$node upload-nr-sourcemap.js --bundle android/index.android.bundle --map android/index.android.bundle.map --bundleId <NEW_ID>方法2:cURLを使用した手動アップロード
スクリプトを使用しない場合は、cURLを使用してソースマップ(解凍済みまたは圧縮済み)をシンボル取り込みAPIにアップロードします:
$curl -X POST "https://symbol-ingest-api.service.newrelic.com/v1/react-native/sourcemaps" \> -H "Api-Key: $NR_USER_API_KEY" \> -H "X-APP-LICENSE-KEY: $NR_APP_TOKEN" \> -F "sourcemap=@./index.android.bundle.map" \> -F "jsBundleId=CODE_PUSH_ID_HERE" \> -F "appVersion=1.0.5" \> -F "sourcemapName=index.android.bundle.map"ヘッダー、本文フィールド、およびレスポンスの完全なリストについては、アップロードAPIリファレンスを参照してください。
jsBundleIdを取得します。
アップロードに使用されるjsBundleIdは、エージェントがJavaScriptセッションについて報告するバンドルIDと一致する必要があります。CodePushリリースの場合は、アップロードされたソースマップがユーザーのアプリで実行されているバンドルにマッピングされるように、CodePushのデプロイメントまたはリリース識別子をjsBundleIdとして使用します。
ヒント
アップロードしたソースマップを検証、監査、または削除するには、「React Nativeソースマップのリストと削除」を参照してください。
ファイルサイズの制限
シンボリケーション用に保存するには、解凍後のソースマップファイルが200 MB未満である必要があります。
転送サイズを縮小するために、ビルドスクリプトはアップロード前に.mapファイルを自動的にgzip圧縮しますが、ビルドは解凍されたファイルに対して200 MBの制限を確認します。解凍された.mapファイルが200 MBを超える場合、エージェントはファイルをアップロードしないため、ビルドのタイムアウトや取り込みエラーを防ぐことができます。
これらの場合、スクリプトはファイルの代わりにビルドテレメトリー(メタデータ)を送信します。これにより、その特定のバージョンでシンボル化が利用できない場合でも、New Relicはビルドが発生したことを追跡できます。その結果、そのビルドのMobileJSErrorイベントには、シンボル化されていない(ミニファイされた)スタックトレースが表示されます。
解凍後のソースマップが200 MBより大きい場合は、New Relicサポートにお問い合わせいただくか、機能リクエストを送信してください。ご自身でこの制限を引き上げることはできません。
ソースマップのアップロードのトラブルシューティング
MobileJSErrorのスタックトレースがシンボル化されていない場合、ソースマップが解凍後のサイズ制限である200 MBを超えている可能性があります。以下の手順を使用して原因を確認し、サポートをリクエストしてください。その他のトラブルシューティングのヒントやよくある質問については、「React NativeのソースマップとJavaScriptエラーのトラブルシューティング」を参照してください。
ファイルまたはテレメトリーがアップロードされたかどうかを確認してください。
ビルドが成功したからといって、ファイルのアップロードが成功したとは限りません。ビルドスクリプトがSuccessメッセージで完了しても、解凍後のソースマップが200 MBより大きい場合は、コンソールログを確認してください。エージェントがソースマップファイルの代わりにテレメトリーを送信したことを示すメッセージが表示されます。
解凍後のファイルサイズを確認してください
ソースマップファイルのサイズを確認して、制限に近いか超えているかを検証してください:
$# Check the size of the unzipped source map$ls -lh index.android.bundle.mapファイルが200 MBに近いかそれを超える場合、シンボル化のためにソースマップをアップロードすることはできません。
大規模なソースマップのサポートをリクエスト
解凍されたソースマップが200 MBの制限を超える場合、お客様側でサイズを縮小したり、ご自身で制限を引き上げたりする方法はありません。この制限の影響を受ける場合は、次の手順を実行してお知らせください:
- New Relicサポートにお問い合わせください。
- ソースマップのサイズ制限を引き上げるための機能リクエストを提出してください。