ミニプログラムのパフォーマンス問題分析¶
本ドキュメントでは、@cloudcare/rum-miniapp 2.2.18 以降で収集されるページパフォーマンスフィールドと、それらを用いて初回レンダリングの遅延やページ終了前の未レンダリングなど、ホワイトスクリーンが疑われる問題を特定する方法について説明します。すべての所要時間フィールドは、Guanceに報告された後、ナノ秒(ns)に統一されます。
収集範囲¶
SDK は以下のパフォーマンスシグナルを収集できます。
- ページロード、
onReady、初回レンダリング、FP、FCP、LCP - ページ終了時に
onReadyまたはプラットフォームの初回レンダリングシグナルがトリガーされたかどうか setDataの回数、累計所要時間、最大所要時間、キューイング時間、更新時間、マージ回数- 起動試行、ネイティブ起動、スクリプト実行、コードパッケージダウンロード
- 遅いページに関連する Resource および Error データ
SDK はスクリーンショットを収集せず、ビジネススケルトン画面以降のコアコンテンツが利用可能かどうかを判断することもできません。したがって、特定のパフォーマンスフィールドが欠落していることをもって、直ちにホワイトスクリーンと断定することはできません。
プラットフォームパフォーマンスデータ¶
SDK は、ミニプログラムプラットフォームが提供する Performance API を優先的に使用します。Observer が正常にサブスクライブされると performance_supported=true となり、プラットフォームが利用可能な初回レンダリングシグナルも同時に提供する場合、first_render_supported=true となります。
WeChat ミニプログラム¶
WeChat 形式の entry は、以下の指標に直接マッピングされます。
| Performance entry | RUM フィールド |
|---|---|
navigation.duration |
loading_time |
render:firstRender.duration |
first_render_time |
render:firstPaint.startTime - navigationStart |
page_fp |
render:firstContentfulPaint.startTime - navigationStart |
page_fcp |
render:largestContentfulPaint.startTime - navigationStart |
page_lcp |
コールドスタート時の appLaunch と通常の route navigation は、どちらも初回画面のページ ID を確立できます。SDK は route、pageId、および最新の navigationStart に基づいて現在のページインスタンスを選択します。paint が navigation より先に到着した場合は一時的に保存され、entry の絶対 startTime が所要時間として誤って扱われるのを防ぎます。
Douyin ミニプログラム¶
Douyin は paint、evaluate、navigation、resource、launch の entry を使用します。SDK はこれらをまず統一された基準に変換します。
| Douyin entry | 統一基準 |
|---|---|
paint:first-paint |
page_fp、first_render_time |
paint:first-contentful-paint |
page_fcp |
paint:largest-contentful-paint |
page_lcp |
evaluate:app-service |
action_type=script_insert |
resource:miniprogram-package |
action_type=package_download |
Douyin には WeChat のような firstRender entry がないため、SDK は現在のページの first-paint - navigationStart をそのプラットフォームにおける初回レンダリングシグナルとして使用します。この基準は FCP やビジネスコンテンツの利用可能性と同等ではありません。
View パフォーマンスフィールド¶
機能とライフサイクル属性¶
| フィールド | 型 | 説明 |
|---|---|---|
performance_supported |
boolean | 現在のプラットフォームで Performance Observer が正常にサブスクライブされたかどうか |
first_render_supported |
boolean | 現在のプラットフォームに SDK が利用可能な初回レンダリングシグナルが存在するかどうか |
view_start_reason |
string | page_load、page_show、または session_renewal |
view_end_reason |
string | onHide、onUnload、または session_renewal |
ready_reached |
boolean | 現在のページのライフサイクルが onReady に達したかどうか |
first_render_reached |
boolean | 現在のページがプラットフォームの初回レンダリングシグナルを受信したかどうか |
ended_before_ready |
boolean | page_load View が終了した時点でまだ onReady に達していないかどうか |
ended_before_render |
boolean | 初回レンダリングシグナルがサポートされている場合、page_load View が初回レンダリング前に終了したかどうか |
view_is_active |
boolean | View がまだアクティブ状態かどうか |
ended_before_render は first_render_supported=true の場合にのみ統計的に意味を持ちます。セッション更新は RUM View を分割するだけで、ページの再読み込みを意味するわけではないため、ページの早期終了という結論は生成されません。
レンダリング所要時間¶
| フィールド | 説明 |
|---|---|
loading_time |
ページ navigation とライフサイクルで観測された最大ロード時間 |
page_ready_time |
View 開始から onReady までの所要時間 |
first_render_time |
WeChat の firstRender.duration、Douyin の first-paint - navigationStart |
page_fp |
現在のページの navigationStart を基準とした FP の所要時間 |
page_fcp |
現在のページの navigationStart を基準とした FCP の所要時間 |
page_lcp |
現在のページの最新の LCP の navigationStart を基準とした所要時間 |
first_render_data_transfer_time |
初回レンダリング初期化データの受信時間から送信時間を引いた値 |
first_render_wait_time |
データ受信完了からビューレイヤーがレンダリングを開始するまでの待機時間 |
first_render_view_layer_time |
ビューレイヤーの初回レンダリング所要時間 |
first_paint_time と first_render_time は互換性フィールドであり、どちらも SDK が選択した初回レンダリングシグナルを示します。実際の FP を分析する必要がある場合は page_fp を使用してください。
setData 所要時間¶
| フィールド | 説明 |
|---|---|
view_setdata_count |
有効な setData 更新サンプル数 |
view_setdata_duration |
すべての有効な更新の累計所要時間 |
view_setdata_max_duration |
単一更新の最大所要時間 |
view_setdata_pending_duration |
キューに入ってから更新が開始されるまでの累計待機時間 |
view_setdata_update_duration |
更新開始から終了までの累計実行時間 |
view_setdata_merged_count |
プラットフォームによってマージされて処理された更新回数 |
SDK は、listener がインストールされた時点の所属ページを記録します。非表示ページや古いコンポーネントからの遅延コールバックは現在の View にカウントされず、ページのアンロードやコンポーネントの分離後はリスニングが停止されます。
起動段階の指標¶
起動段階は action データとして報告されます。
action_type |
説明 |
|---|---|
launch_attempt |
最初の App.onLaunch 到達。SDK インスタンスごとに 1 回。duration は書き込まれず、app_launch_attempt=true が有効なフィールドとなります。 |
launch |
プラットフォームの appLaunch navigation duration |
script_insert |
スクリプト実行所要時間 |
package_download |
ミニプログラムコードパッケージのダウンロード所要時間 |
後者の 3 つはプラットフォームの Performance entry に依存します。launch / launch_attempt の比率を使用してネイティブ起動指標のカバレッジを観察することを推奨します。entry がないことを所要時間ゼロと見なさないでください。
ホワイトスクリーン候補の統計¶
ホワイトスクリーン分析は、カバレッジ、遅延レンダリング、早期終了の 3 つのカテゴリの指標に分割することを推奨します。
統計サンプル¶
まず以下の条件でフィルタリングします。
初回レンダリングシグナルをサポートしていないプラットフォームは、カバレッジを個別に統計し、ended_before_render の分母には含めないでください。
推奨基準¶
| 問題 | 推奨条件 | 説明 |
|---|---|---|
| 初回レンダリングの遅延 | first_render_time がビジネス閾値を超える |
P75、P95、および閾値超過率の統計に適しています |
| 終了前の初回レンダリング未完了 | ended_before_render=true |
信頼度の高いホワイトスクリーン候補ですが、ユーザーが意図的に素早く戻った場合も該当することがあります |
| Ready までの長時間未達 | page_ready_time が閾値を超える |
ページのライフサイクルまたは初期化のブロッキングを反映しますが、視覚的なホワイトスクリーンと同等ではありません |
| 終了前の Ready 未到達 | ended_before_ready=true |
view_end_reason と滞在時間を組み合わせて、素早い離脱を除外する必要があります |
| FCP/LCP の遅延 | page_fcp または page_lcp が閾値を超える |
コンテンツの出現と主要コンテンツの安定時間に近い指標です |
推奨ダッシュボードには、少なくとも以下を含めてください。
- Performance と初回レンダリングシグナルのカバレッジ
- FP、FCP、LCP、firstRender の P50、P75、P95
ended_before_render、ended_before_readyの比率- 遅い View の Error、失敗 Resource、
5xx、TTFB の分布 - アプリケーションバージョン、プラットフォーム、OS、デバイスモデルごとに分類したトレンド
既知の制限事項¶
- SDK にはビジネス的な
markViewReady()API がなく、コアビジネスコンテンツが利用可能であることを確認できません。 - Page
onLoad前に発生した致命的なエラーには View Context がない可能性があります。 - 現時点では Long Task、FPS、ページフリーズ、スクリーンショットは収集されません。
- プラットフォームの Performance API、基本ライブラリ、OS バージョンの違いにより、フィールドのカバレッジに影響が出る可能性があります。
- データ送信失敗時のリトライやローカル永続化がない場合、ネットワーク環境が悪いと問題の比率が過小評価される可能性があります。