コンテンツにスキップ

RUM 設定

このドキュメントでは、HarmonyOS RUM の初期化設定と手動収集機能について説明します。

RUM 初期化設定

import { FTSDK, FTRUMConfig } from '@guancecloud/ft_sdk/Index';

const rumConfig = new FTRUMConfig()
  .setRumAppId('your-app-id')
  .setSamplingRate(1.0)
  .setSessionErrorSampleRate(1.0)
  .setEnableTraceUserAction(true)
  .setEnableTraceUserView(true)
  .setEnableTraceUserResource(true)
  .setEnableTrackAppUIBlock(true)
  .setEnableTrackAppANR(true)
  .setEnableTrackAppCrash(true)
  .setEnableTraceWebView(true);

FTSDK.installRUMConfig(rumConfig);
メソッド 必須 説明
setRumAppId string はい RUM アプリケーション ID。[リアルユーザーモニタリング(RUM)] アプリケーションから取得します。
setSamplingRate number いいえ RUM サンプリングレート。範囲 [0.0, 1.0]、デフォルト 1.0
setSessionErrorSampleRate number いいえ エラーサンプリングレート。範囲 [0.0, 1.0]、デフォルト 0.0
setEnableTraceUserAction boolean いいえ 自動アクション追跡を有効にするかどうか。デフォルト false
setEnableTraceUserView boolean いいえ ページ追跡を有効にするかどうか。デフォルト false
setEnableTraceUserResource boolean いいえ リソース追跡を有効にするかどうか。デフォルト false
setEnableTrackAppUIBlock boolean, number いいえ UI ブロック検出を有効にするかどうか。デフォルト false。第2引数 blockDurationMs は検出時間範囲を制御します [100,)、単位はミリ秒、デフォルト 1000ms
setEnableTrackAppANR boolean いいえ ANR モニタリングを有効にするかどうか。デフォルト false
setEnableTrackAppCrash boolean いいえ アプリクラッシュモニタリングを有効にするかどうか。デフォルト false。Native Crash が必要な場合は、@guancecloud/ft_native に依存する必要があります。
setEnableTraceWebView boolean いいえ WebView データ収集を有効にするかどうか。デフォルト false。完全に連携するには、WebView データモニタリング を参照してください。
setAllowWebViewHost Array<string> \| null いいえ WebView JavaScript Bridge で使用を許可する Host のホワイトリストを設定します。null または空配列を渡すと Host は制限されません。制限する場合は、WebView データモニタリング を参照してください。
setRumCacheLimitCount number いいえ RUM データキャッシュ数の上限。デフォルト 100000、最小値 10000
setRumCacheDiscardStrategy RUMCacheDiscard いいえ RUM データが上限に達した後の破棄ルールを設定します。デフォルトは RUMCacheDiscard.DISCARDDISCARD は追加データを破棄、DISCARD_OLDEST は古いデータを破棄します。

RUM 手動収集

FTRUMConfigsetEnableTraceUserActionsetEnableTraceUserViewsetEnableTraceUserResourcesetEnableTrackAppUIBlocksetEnableTrackAppCrashsetEnableTrackAppANR を設定することで、ActionViewResourceLongTaskError の自動収集を実現します。カスタム収集が必要な場合は、FTRUMGlobalManager を使用して手動でレポートできます。

View

使用方法

/**
 * View のライフサイクルを開始します。
 *
 * @param viewName View 名。
 * @param property オプションの拡張プロパティ。
 */
startView(viewName: string, property?: Record<string, object>): Promise<void>

/**
 * 現在の View のライフサイクルを終了します。
 *
 * @param property オプションの拡張プロパティ。
 */
stopView(property?: Record<string, object>): Promise<void>

/**
 * 現在の View のロード時間を更新します。
 *
 * @param loadTime ロード時間。単位はナノ秒。
 */
updateLoadTime(loadTime: number): void

コード例

import { FTRUMGlobalManager } from '@guancecloud/ft_sdk/Index';

@Entry
@Component
struct ProductPage {
  async aboutToAppear() {
    // シナリオ 1:
    await FTRUMGlobalManager.getInstance().startView('ProductPage');

    // シナリオ 2:拡張プロパティ付き
    const viewProperty: Record<string, object> = { page_category: new String('product'), page_id: new String('12345') };
    await FTRUMGlobalManager.getInstance().startView('ProductPage', viewProperty);

  }

  async aboutToDisappear() {
    // シナリオ 1:
    await FTRUMGlobalManager.getInstance().stopView();

    // シナリオ 2:
    const stopViewProperty: Record<string, object> = { view_duration: new Number(1000) };
    await FTRUMGlobalManager.getInstance().stopView(stopViewProperty);
  }

  build() {
    Column() {
      Text('Product Page');
    }
  }
}

Action

使用方法

/**
 * 完了した Action を追加します。このデータは Error、Resource、LongTask に関連付けられません。
 *
 * @param actionName Action 名。
 * @param actionType Action タイプ。例:`click`。
 * @param durationOrProperty オプション。数値を渡すと持続時間(ナノ秒)を表します。Record を渡すと拡張プロパティを表します。
 * @param property オプション。第3引数が持続時間の場合のみ、拡張プロパティを渡します。
 */
addAction(
  actionName: string,
  actionType: string,
  durationOrProperty?: number | Record<string, object>,
  property?: Record<string, object>
): void

/**
 * Action を開始します。SDK が終了タイミングを管理し、近くで発生した Resource、LongTask、Error データを関連付けます。
 *
 * @param actionName Action 名。
 * @param actionType Action タイプ。例:`click`。
 * @param property オプションの拡張プロパティ。
 */
startAction(
  actionName: string,
  actionType: string,
  property?: Record<string, object>
): void

addAction(...) は直接完了する Action 向けで、Error、Resource、LongTask などのデータを関連付けられません。duration の単位はナノ秒です。第3引数には直接拡張プロパティを渡せます。持続時間と拡張プロパティを両方渡す場合は、それぞれ第3、第4引数として渡します。

startAction(...) は SDK が終了タイミングと関連データを管理します。現時点では stopAction(...) や待機状態などの手動制御インターフェースは提供されていません。

コード例

import { FTRUMGlobalManager } from '@guancecloud/ft_sdk/Index';

// シナリオ 1:
FTRUMGlobalManager.getInstance().addAction('buy_button_click', 'click');

// シナリオ 2: 拡張プロパティ付き
const actionProperty: Record<string, object> = {
  product_id: new String('product_id'),
  product_name: new String('product_name')
};
FTRUMGlobalManager.getInstance().addAction('buy_button_click', 'click', actionProperty);

// シナリオ 1:
FTRUMGlobalManager.getInstance().startAction('buy_button_click', 'click');

// シナリオ 2: 拡張プロパティ付き
const startActionProperty: Record<string, object> = {
  product_id: new String('product_id'),
  product_name: new String('product_name')
};
FTRUMGlobalManager.getInstance().startAction('buy_button_click', 'click', startActionProperty);

Error

使用方法

/**
 * Error をレポートします。
 *
 * @param log エラーログまたはスタック情報。
 * @param message メッセージ。
 * @param errorType エラータイプ。`ErrorType` 列挙型または文字列を渡せます。
 * @param state エラー発生時のアプリケーション実行状態。
 * @param property オプションの拡張プロパティ。
 */
addError(
  log: string,
  message: string,
  errorType: string | ErrorType,
  state: AppState,
  property?: Record<string, object> | null
): void

/**
 * 指定された発生時刻の Error をレポートします。
 *
 * @param log エラーログまたはスタック情報。
 * @param message メッセージ。
 * @param dateline エラー発生時刻。単位はナノ秒。
 * @param errorType エラータイプ。`ErrorType` 列挙型または文字列を渡せます。
 * @param state エラー発生時のアプリケーション実行状態。
 * @param property オプションの拡張プロパティ。
 */
addError(
  log: string,
  message: string,
  dateline: number,
  errorType: string | ErrorType,
  state: AppState,
  property?: Record<string, object> | null
): void

カスタム Error には ErrorType.CUSTOM を使用してください。dateline はオプションの発生時刻で、単位はナノ秒です。

コード例

import { FTRUMGlobalManager, ErrorType, AppState } from '@guancecloud/ft_sdk/Index';
import { systemDateTime } from '@kit.BasicServicesKit';

// シナリオ 1:
FTRUMGlobalManager.getInstance().addError('error log', 'error message', ErrorType.CUSTOM, AppState.RUN);

// シナリオ 2:遅延レポート時に、エラーが実際に発生した時刻を渡します(単位:ナノ秒)。
const errorTimeNs = systemDateTime.getTime(true);
FTRUMGlobalManager.getInstance().addError('error log', 'error message', errorTimeNs, ErrorType.CUSTOM, AppState.RUN);

// シナリオ 3:拡張プロパティ付き。
const errorProperty: Record<string, object> = {
  module: new String('checkout'),
  action: new String('submit_order')
};
FTRUMGlobalManager.getInstance().addError('error log', 'error message', ErrorType.CUSTOM, AppState.RUN, errorProperty);

LongTask

使用方法

/**
 * LongTask をレポートします。
 *
 * @param log ブロック発生時のログまたはスタック情報。
 * @param duration ブロックの持続時間。単位はナノ秒。
 * @param property オプションの拡張プロパティ。
 */
addLongTask(log: string, duration: number, property?: Record<string, string | number | boolean>): void

duration の単位はナノ秒です。

コード例

import { FTRUMGlobalManager } from '@guancecloud/ft_sdk/Index';

const durationMs = 350;
const durationNs = durationMs * 1000000;
const stack = new Error('checkout render long task').stack ?? 'Stack trace not available';

// シナリオ 1:
FTRUMGlobalManager.getInstance().addLongTask(stack, durationNs);

// シナリオ 2:拡張プロパティ付き。
const longTaskProperty: Record<string, string | number | boolean> = {
  module: 'checkout',
  operation: 'render_order_list',
  threshold_ms: 200
};
FTRUMGlobalManager.getInstance().addLongTask(stack, durationNs, longTaskProperty);

Resource

使用方法

/**
 * Resource のライフサイクルを開始します。
 *
 * @param resourceId リソースの一意の識別子。`stopResource`、`addResource` と同じ値を使用する必要があります。
 * @param property オプションの拡張プロパティ。
 */
startResource(resourceId: string, property?: Record<string, object>): void

/**
 * Resource のライフサイクルを終了します。
 *
 * @param resourceId リソースの一意の識別子。`startResource` と同じ値を使用する必要があります。
 * @param property オプションの拡張プロパティ。
 */
stopResource(resourceId: string, property?: Record<string, object>): void

/**
 * Resource のリクエスト、レスポンス、ネットワークパフォーマンスデータを補完します。
 *
 * @param resourceId リソースの一意の識別子。`startResource`、`stopResource` と同じ値を使用する必要があります。
 * @param resourceParams リソースの詳細。URL、リクエストメソッド、レスポンスステータス、レスポンス長、拡張プロパティなど。
 * @param netStatusBean ネットワークパフォーマンスデータ。DNS、TCP、TTFB、レスポンス時間など。
 */
addResource(resourceId: string, resourceParams: ResourceParams, netStatusBean: NetStatusBean): void

startResource(...)stopResource(...) に渡された拡張プロパティは、ResourceParams のプロパティと、呼び出し順にマージされます。リソースのステータスコードとレスポンス長は ResourceParams で設定し、stopResource(...) の引数としては渡さなくなりました。

コード例

import {
  FTRUMGlobalManager,
  ResourceParams,
  NetStatusBean
} from '@guancecloud/ft_sdk/Index';

const resourceId = 'https://api.example.com/data';

// シナリオ 1:
// リクエスト開始
FTRUMGlobalManager.getInstance().startResource(resourceId);

// リクエスト終了後、リクエスト、レスポンス、ネットワークパフォーマンスデータを補完。
const resourceParams = new ResourceParams();
resourceParams.setUrl(resourceId);
resourceParams.setResourceStatus(200);
resourceParams.setResponseContentLength(1024);
resourceParams.resourceType = 'xhr';

const netStatusBean = new NetStatusBean();
netStatusBean.setResourceHostIP('192.168.1.1');
netStatusBean.setDNSTime(10000000);
netStatusBean.setTcpTime(20000000);
netStatusBean.setTTFB(50000000);
netStatusBean.setResponseTime(100000000);

FTRUMGlobalManager.getInstance().stopResource(resourceId);
FTRUMGlobalManager.getInstance().addResource(resourceId, resourceParams, netStatusBean);

// シナリオ 2:拡張プロパティ付き。以下は独立したリクエストです。使用時はシナリオ 1 の startResource と stopResource の呼び出しを置き換えてください。
const startResourceProperty: Record<string, object> = {
  request_source: new String('checkout')
};
FTRUMGlobalManager.getInstance().startResource(resourceId, startResourceProperty);

const stopResourceProperty: Record<string, object> = {
  response_cache: new Boolean(false)
};
FTRUMGlobalManager.getInstance().stopResource(resourceId, stopResourceProperty);

NetStatusBean プロパティ説明

NetStatusBean は、手動 Resource 収集のネットワークパフォーマンスデータを補完するために使用します。すべての時間パラメータの単位はナノ秒です。*StartTime は Resource 開始時刻からのオフセットを表します。設定されていない時間値はデフォルトで -1 となり、対応するメトリクスは書き込まれません。

メソッド 説明
setDNSTime DNS 解決時間
setDNSStartTime DNS 解決開始オフセット
setTcpTime TCP 接続確立時間
setConnectStartTime TCP 接続確立開始オフセット
setSSLTime SSL/TLS ハンドシェイク時間
setSslStartTime SSL/TLS ハンドシェイク開始オフセット
setTTFB 最初のバイトが到着するまでの待機時間(TTFB)
setResponseTime レスポンス転送時間
setFirstByteTime 最初のバイトフェーズの時間
setFirstByteStartTime 最初のバイトフェーズ開始オフセット
setDownloadTime レスポンスダウンロード時間
setDownloadTimeStart レスポンスダウンロード開始オフセット
setHoleRequestTime リクエスト全体の時間(API 名はSDK定義に従い Hole スペルを保持)
setResourceHostIP リソースサーバーの IP アドレス

Resource 自動追跡

setEnableTraceUserResource(true) を有効にすると、SDK は RCP、Axios 互換モード、または @kit.NetworkKit HTTP インターセプターを介して送信されたリクエストを自動的に追跡します。

@guancecloud/ft_sdk_ext を導入する際は、src/main/... のような深いパスを避け、@guancecloud/ft_sdk_ext/Index から公開 API をインポートすることを推奨します。

RCP 自動追跡の導入

RUM 設定で setEnableTraceUserResource を有効にすると、SDK は RCP を介して送信された HTTP リクエストに対して Resource データを自動収集します。

現在のバージョンから、SDK はグローバルな RCP Session を自動的に作成または保持しなくなりました。代わりに、以下の機能を提供し、業務側で自由に組み立てられるようにします。

  • RCPTraceInterceptor:Trace Headers を自動注入
  • RCPResourceInterceptorResource データとパフォーマンス指標を自動収集
  • createFTRCPInterceptors():デフォルトの RCP インターセプターリストを返します。カスタム SessionConfiguration とマージするのに便利です。
  • createFTRCPTrackConfig():デフォルトのインターセプターと TracingConfiguration を含む SessionConfiguration をすばやく生成します。

推奨導入方法:デフォルトの SessionConfiguration ファクトリ関数を使用

import { rcp } from '@kit.RemoteCommunicationKit';
import { createFTRCPTrackConfig } from '@guancecloud/ft_sdk/Index';

const session = rcp.createSession(
  createFTRCPTrackConfig({
    baseAddress: 'https://api.example.com'
  })
);

// GET リクエスト
const request = new rcp.Request('/data', 'GET');
const response = await session.fetch(request);

// POST リクエスト
const headers: rcp.RequestHeaders = { 'Content-Type': 'application/json' };
const postRequest = new rcp.Request('/data', 'POST', headers, { name: 'test' });
const postResponse = await session.fetch(postRequest);

プロジェクトが SDK のルートエントリからインポートしている場合、以下も使用できます。

import { createFTRCPTrackConfig } from '@guancecloud/ft_sdk/Index';

手動でのインターセプター組み立て

Session 設定を完全に制御する必要がある場合は、SDK が提供するインターセプターを直接使用することもできます。

import { rcp } from '@kit.RemoteCommunicationKit';
import { RCPTraceInterceptor, RCPResourceInterceptor } from '@guancecloud/ft_sdk/Index';

const session = rcp.createSession({
  baseAddress: 'https://api.example.com',
  interceptors: [
    new RCPTraceInterceptor(),
    new RCPResourceInterceptor()
  ],
  requestConfiguration: {
    tracing: {
      collectTimeInfo: true
    }
  }
});

TracingConfiguration の説明:

  • collectTimeInfo: true:有効にすることを推奨。SDK は response.timeInfo に依存して DNS、TCP、SSL、TTFB、ダウンロード時間などのパフォーマンス指標を計算します。
  • incomingHeader / outgoingHeader:オプション。デフォルトで有効。
  • incomingData / outgoingData:デフォルトでは無効で、追加のオーバーヘッドを削減します。

HTTP インターセプターの導入

業務で @kit.NetworkKithttp.createHttp() を使用してリクエストを送信する場合、@guancecloud/ft_sdk_ext が提供する HTTP インターセプターを使用して、自動 Trace Header 注入と Resource 収集を完了できます。この導入方法は 0.1.14-alpha03 以降でサポートされ、HarmonyOS API 22 以上が必要です。

事前にプロジェクトに以下がインストールされていることを確認してください。

  • ft_sdk.har をインストールし、oh-package.json5@guancecloud/ft_sdk として宣言
  • ft_sdk_ext.har をインストールし、oh-package.json5@guancecloud/ft_sdk_ext として宣言
  • ローカル HAR 経由で ft_sdk_ext.har をインストールする場合は、プロジェクトルートの oh-package.json5overrides["@guancecloud/ft_sdk"] = "file:./libs/ft_sdk.har" を追加し、内部依存関係をローカル HAR に書き換える必要があります。

SDK は以下の機能を提供します。

  • HttpInitialRequestInterceptor:リクエスト開始時に Trace Header を注入し、Resource を開始します。
  • HttpFinalResponseInterceptor:レスポンス終了時に Resource データを補完し、収集を終了します。
  • createFTHttpInterceptorChain():再利用可能な http.HttpInterceptorChain を作成します。
  • applyFTHttpTrack():デフォルトのインターセプターチェーンを単一の http.HttpRequest に直接マウントします。

2 つの導入方法を提供します。

方法1:SDK が提供するデフォルトファクトリを使用

import { http } from '@kit.NetworkKit';
import { createFTHttpInterceptorChain } from '@guancecloud/ft_sdk_ext/Index';

const request = http.createHttp();
const interceptorChain = createFTHttpInterceptorChain();
interceptorChain.apply(request);

try {
  const response = await request.request('https://httpbin.org/get', {
    method: http.RequestMethod.GET,
    header: {
      'Accept': 'application/json'
    }
  });
} finally {
  request.destroy();
}

さらに業務独自のインターセプターを追加したい場合は、以下のように記述することもできます。

import { http } from '@kit.NetworkKit';
import { createFTHttpInterceptorChain } from '@guancecloud/ft_sdk_ext/Index';

const request = http.createHttp();
const interceptorChain = createFTHttpInterceptorChain({
  interceptors: [
    new CustomAfterInterceptor()// カスタムを追加
  ]
});
interceptorChain.apply(request);

この場合の実行順序は次のようになります。

[
  new HttpInitialRequestInterceptor(),
  new HttpFinalResponseInterceptor(),
  new CustomAfterInterceptor()
]

方法2:手動で HttpInterceptorChain を組み立てる

業務に既にカスタムインターセプターがある場合、またはインターセプターの順序を自由に決定する必要がある場合は、手動で http.HttpInterceptorChain を作成することを推奨します。

import { http } from '@kit.NetworkKit';
import {
  HttpInitialRequestInterceptor,
  HttpFinalResponseInterceptor
} from '@guancecloud/ft_sdk_ext/Index';

const request = http.createHttp();
const interceptorChain = new http.HttpInterceptorChain();
interceptorChain.addChain([
  new CustomBeforeInterceptor(),
  new HttpInitialRequestInterceptor(),
  new HttpFinalResponseInterceptor()
]);
interceptorChain.apply(request);

注意事項:

  • HTTP インターセプターは、@kit.NetworkKit が API 22+ で提供するインターセプター機能に依存します。API 22 未満の場合は、RCP または Axios 互換モードを使用してください。
  • http.createHttp() を直接使用する HTTP インターセプターモードでは、HttpRequestContext が現在のところ安定して実際のリクエストメソッドを取得できないため、ResourcemethodUNKNOWN として記録される可能性があります。
  • 業務で @ohos/axiosinterceptorChain モードを使用する場合は、applyFTAxiosChainMethodBridge() を別途マウントして、axios の実際の method、url、headers をブリッジすることを推奨します。
  • @kit.NetworkKit のインターセプターコールバックは、現時点では RCP timeInfo レベルの詳細な時間を公開しないため、現在は resourceLoad のみが補完されます。

Axios の導入

業務で @ohos/axios を使用する場合は、以下の方法で自動追跡を導入できます。

  • @guancecloud/ft_sdk:Axios の request/response interceptors に基づく互換モード
  • @guancecloud/ft_sdk_ext0.1.14-alpha03 以降、interceptorChain に基づく拡張モードを提供

@ohos/axios 2.2.4 以上

この導入方法は、Axios の request/response interceptors に基づいています。

import axios from '@ohos/axios';
import { applyFTAxiosTrack } from '@guancecloud/ft_sdk/Index';

const client = axios.create({
  timeout: 10000
});

applyFTAxiosTrack(client);

この導入方法は、業務独自のインターセプターと共存して使用できます。

import axios from '@ohos/axios';
import { applyFTAxiosTrack } from '@guancecloud/ft_sdk/Index';

const client = axios.create({
  timeout: 10000
});

applyFTAxiosTrack(client);

client.interceptors.request.use((config) => {
  config.headers = {
    ...(config.headers || {}),
    Authorization: 'Bearer <token>',
    'X-Signature': 'signed-value'
  };
  return config;
});

client.interceptors.response.use((response) => {
  return response;
});

実行順序の説明:

  • @ohos/axios 互換モードでは、request インターセプターの動作は 後登録・先実行 です。
  • つまり、複数の request interceptors は共存できますが、登録順序が FT に「変更前」と「変更後」のどちらのリクエストヘッダーが渡されるかに影響します。
  • FT が業務の認証、署名などのフィールド補完後の最終的なリクエストヘッダーを収集するようにしたい場合は、推奨順序は 先に applyFTAxiosTrack(client) を実行し、その後で業務の request interceptor を登録します
  • 上記の順序に従うと、業務の request interceptor が先に実行され、FT がその後実行されて最終的な headers を読み取ります。
  • 順序を調整したい場合は、登録順序を変更するだけです。例えば、先に業務を登録し、その後 applyFTAxiosTrack(client) を呼び出すと、FT が先に実行され、業務インターセプターが後に実行されます。

@ohos/axios 2.2.8 以上

@ohos/axios 2.2.8 以上の場合は、@guancecloud/ft_sdk_extinterceptorChain を介して FT 自動追跡を導入することを優先的に推奨します。

import axios from '@ohos/axios';
import {
  createFTHttpInterceptorChain,
  applyFTAxiosChainMethodBridge
} from '@guancecloud/ft_sdk_ext/Index';

const client = axios.create({
  timeout: 10000,
  interceptorChain: createFTHttpInterceptorChain()
});

applyFTAxiosChainMethodBridge(client);

const response = await client.post('https://api.example.com/data', {
  source: 'axios',
  message: 'ft auto track'
});

複数のインターセプターが共存し、実行順序を手動で調整する必要がある場合、または業務カスタムインターセプターと統一的に組み立てる必要があるシナリオについては、HTTP インターセプターの導入 の内容を参照し、必要に応じて HttpInitialRequestInterceptorHttpFinalResponseInterceptor を組み合わせてください。

単一リクエストとして渡す場合は、以下のように記述することもできます。

import axios from '@ohos/axios';
import { createFTHttpInterceptorChain } from '@guancecloud/ft_sdk_ext/Index';

const response = await axios.request({
  url: 'https://httpbin.org/post',
  method: 'post',
  data: {
    source: 'axios',
    message: 'ft auto track'
  },
  responseType: 'string',
  interceptorChain: createFTHttpInterceptorChain()
});

注意事項:

  • Axios インスタンスを作成する際に、interceptorChain を一元的に注入し、applyFTAxiosChainMethodBridge(client) を呼び出して、bridge の欠落による Resource method の記録不正確を防ぐことを推奨します。
  • interceptorChain モードは @guancecloud/ft_sdk_ext(ローカル HAR ファイル名は ft_sdk_ext.har のまま)に依存し、HarmonyOS API 22+ が必要です。
  • Trace Headers を自動注入するには、インターセプターチェーンの作成に加え、Trace 設定で setEnableAutoTrace(true) を有効にする必要があります。
  • Resource を自動収集するには、RUM 設定で setEnableTraceUserResource(true) を有効にする必要があります。
  • 呼び出し側に既にカスタム HTTP/Axios インターセプターがある場合は、HttpInitialRequestInterceptorHttpFinalResponseInterceptor を直接使用して順序を手動で組み立て、FT 自動追跡後に urlmethodheaders が再度書き換えられるのを防ぐことを推奨します。
  • SDK はインターセプターとデフォルト設定のファクトリ関数のみを提供します。RCP Session の作成とライフサイクルは業務側で管理してください。
  • 業務で rcp.createSession() を直接使用して Session を作成する場合は、SDK が提供するインターセプターを自分で追加する必要があります。追加しないと、リクエストは自動追跡されません。
  • 業務で http.createHttp() または @ohos/axios を直接使用する場合は、applyFTHttpTrack()applyFTAxiosTrack()createFTHttpInterceptorChain() を明示的にマウントする必要があります。Axios interceptorChain モードでは、applyFTAxiosChainMethodBridge(client) も呼び出す必要があります。

Resource パフォーマンス指標の説明

HarmonyOS SDK は、RCP(Remote Call Protocol)の TimeInfo インターフェースを介してネットワークリクエストのパフォーマンス指標(DNS、TCP、SSL、TTFB など)を取得します。

TTFB 計算の説明:

  • HarmonyOS TTFB:startTransferTimeMs - preTransferTimeMs で計算します。サーバー処理時間、ネットワーク転送時間、レスポンスヘッダー受信時間を含みます。
  • Android TTFB:レスポンスヘッダー受信時間のみを表し、通常は非常に短いです。

  • DNS 時間:nameLookupTimeMs

  • TCP 時間:connectTimeMs - nameLookupTimeMs
  • SSL 時間:tlsHandshakeTimeMs - connectTimeMs
  • TTFB:startTransferTimeMs - preTransferTimeMs
  • ダウンロード時間:totalTimeMs - startTransferTimeMs

HarmonyOS RCP API の制限により、preTransferTimeMs はほぼ SSL 完了時間と等しくなります。そのため、HarmonyOS の TTFB にはサーバー処理時間が含まれ、通常は Android よりも大きくなります。これは予期されるプラットフォームの動作の違いであり、SDK の実装問題ではありません。

フィードバック

このページは役に立ちましたか?