レート制限と収集動作

次のような状況では、プロファイル リクエストがすぐに完了しない、または結果がすぐに返されないことがあります。

  • レート制限: デバイスのパフォーマンスを保護するために、収集がスロットリングされます(レート制限の仕組みをご覧ください)。
  • 配信前のアプリの終了: キャプチャ中にアプリが終了またはクラッシュした場合、システムはバックグラウンドでプロファイルを停止して保存し、次回アプリが実行されて(フォアグラウンドまたはバックグラウンドで)グローバル リスナーが登録されたときに、キューに格納された結果を配信します。システムは、リスナーの登録を待機している未配信のキューに格納された結果を最大 7 日間保持します。アプリが 7 日以内にリスナーを登録しない場合、キューに格納された結果は破棄されます。

  • その他のエラー: 収集が失敗した場合(無効なリクエストや内部エラーなど)、ProfilingResult はエラーコードとメッセージを報告します。

レート制限の仕組み

プロファイルのキャプチャはリソースを大量に消費するため、ProfilingManager はプロセスレベルとシステムレベルの両方でレート制限を適用して、デバイスのパフォーマンスとバッテリー駆動時間を保護します。プロファイルの種類によってリソース費用が異なります。システムは、次の 2 つのレベルでローリング時間枠にわたって割り当てを追跡します。

  • プロセス レート制限: 個々のアプリによって収集されたプロファイルのリソース費用を、アプリごとの割り当てに対して追跡します。各アプリに同じ割り当てが割り当てられ、デバイス上の他のアプリのプロファイリング アクティビティがアプリの上限に影響することはありません。アプリが任意の時間枠の割り当てに達すると、リクエストは ERROR_FAILED_RATE_LIMIT_PROCESS で失敗します。
  • システム レート制限: デバイス上のすべてのアプリで収集されたプロファイルのリソースコストの合計を、共有グローバル割り当てに対して追跡します。すべてのアプリがこのデバイス全体の制限に影響するため、アプリが独自のプロセス割り当てを使い切っていない場合でも、リクエストが ERROR_FAILED_RATE_LIMIT_SYSTEM で失敗することがあります。

本番環境のプロファイル ボリュームを管理する

デバイスレベルのレート制限は、プロファイル タイプとシステム アクティビティ全体に依存するため、アプリ内で正確なローカル レート制限の割り当てを追跡または予測しようとしないでください。代わりに、関連するユーザー ジャーニーまたは異常が発生したときにプロファイリング リクエストを行うことに集中し、ProfilingManager にデバイス上のスロットリングを処理させます。

アップロード帯域幅とストレージ費用を管理可能な範囲に抑えながら、フィールドでのカバレッジを最大化するには、母集団のセグメンテーションとテスト プラットフォーム(リモート構成や A/B テストフラグなど)を使用して、プロファイルの全体的な量を制御します。

  • ユーザーベース全体でサンプリングする: 実行ごとにすべてのユーザーからプロファイルをリクエストするのではなく、ユーザー セッションの少数のランダムな割合でプロファイリングを有効にします。
  • コホート別にセグメント化する: 回帰を調査している特定のアプリ バージョン、デバイス階層、OS リリース、またはリージョンをターゲットにします(たとえば、OOM 率が上昇している低 RAM デバイスで Java ヒープダンプの収集を有効にします)。
  • ユーザー間でトリガーと直接リクエストをセグメント化する: 異なるプロファイリング トリガーと直接プロファイリング リクエストを別々のユーザー セグメントに割り当てて、一部のユーザーが 1 つのプロファイルを記録し、他のユーザーが別のプロファイルを記録するようにします。デバイス上のすべてのキャプチャはアプリごとの同じ割り当てを共有するため、ユーザー セグメント間でキャプチャを分離することで、頻度の高いトリガーやリクエストが、1 台のデバイスで頻度の低いキャプチャに必要な割り当てを使い果たすことを防ぎます。