コンテンツにスキップ

RUM 設定

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

RUM 初期化設定

import {
  DetectFrequency,
  DeviceMetricsMonitorType,
  ErrorMonitorType,
  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)
  .setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL, DetectFrequency.DEFAULT)
  .setExtraMonitorTypeWithError(ErrorMonitorType.ALL)
  .addGlobalContext('rum_channel', new String('official'));

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 任意 APP クラッシュモニタリングを有効にするかどうか。デフォルトは false。Native Crash が必要な場合は、@guancecloud/ft_native への依存が必要です
setEnableTraceWebView boolean 任意 WebView データ収集を有効にするかどうか。デフォルトは false。完全に導入する場合は、WebView データモニタリングを参照してください
setAllowWebViewHost Array<string> \| null 任意 WebView JavaScript Bridge で使用を許可する Host のホワイトリストを設定します。null または空の配列を渡すと Host は制限されません。制限する場合は、WebView データモニタリングを参照してください
setActionTrackingHandler FTActionTrackingHandler \| null 任意 自動 Click Action のフィルターハンドラーを設定します。setEnableTraceUserAction(true) を有効にした場合のみ有効になります。null を返すと収集をスキップし、undefined を返すとデフォルトの収集フローを維持します。詳細はデータ収集カスタムルールを参照してください。ft-sdk 0.1.16 以降でサポート
setViewTrackingHandler handler: FTViewTrackingHandler \| null, type?: FTViewTrackingType 任意 Router、Navigation、またはすべての自動 View のハンドラーを設定します。setEnableTraceUserView(true) を有効にした場合のみ有効になります。ハンドラーは FTViewTrackingContext を受け取り、HandlerView を返すと名前の変更や属性の追加ができます。null を返すと収集をスキップします。詳細はデータ収集カスタムルールを参照してください。ft-sdk 0.1.17 以降でサポート
setResourceUrlHandler FTInTakeUrlHandler 任意 自動 Resource の URL フィルターハンドラーを設定します。ハンドラーが true を返すと収集をスキップします。RCP、Axios、NetworkKit の自動 Resource にのみ影響し、Trace Header の注入と手動 Resource には影響しません。詳細はデータ収集カスタムルールを参照してください。ft-sdk 0.1.17 以降でサポート
setDeviceMetricsMonitorType DeviceMetricsMonitorType, DetectFrequency(オプション) 任意 View のモニタリング情報とサンプリング頻度を設定し、View のライフサイクルにモニタリングデータを追加します。最初の引数はビット OR で CPU、MEMORY、BATTERY、FPS を組み合わせるか、ALL で全て有効にできます。TV デバイスではバッテリー指標はサポートされません。2 番目の引数は DetectFrequency.DEFAULT(500ms)、DetectFrequency.FREQUENT(100ms)、DetectFrequency.RARE(1000ms)から選択できます。未指定の場合は現在のサンプリング頻度が使用され、初期値は DEFAULT です。デフォルトでは収集しません。ft-sdk 0.1.16 以降でサポート
setDeviceMetricsDetectFrequency DetectFrequency 任意 旧バージョンのデバイス指標設定方法で、ソースコード互換のためにのみ保持されています。単一引数の setDeviceMetricsMonitorType(...) と組み合わせて使用できます。新規導入では setDeviceMetricsMonitorType(deviceMetricsMonitorType, detectFrequency) で収集タイプと頻度を一度に設定することを推奨します
setExtraMonitorTypeWithError ErrorMonitorType 任意 Error イベントの追加デバイス指標を設定します。ビット OR で CPU、MEMORY、BATTERY を組み合わせるか、ALL で全て有効にできます。有効にすると Error データに CPU、メモリ、バッテリー関連のフィールドが追加されます。デフォルトでは収集されず、TV デバイスではバッテリー指標はサポートされません。フィールドの説明はアプリケーションデータ収集を参照してください。ft-sdk 0.1.16 以降でサポート
addGlobalContext key: string, value: object 任意 RUM カスタムタグを追加し、ユーザーのモニタリングデータを区別するために使用します。追加ルールはこちらを参照してください
setRumCacheLimitCount number 任意 RUM データキャッシュ数の上限。デフォルトは 100000、最小値は 10000
setRumCacheDiscardStrategy RUMCacheDiscard 任意 RUM データが上限に達した後の RUM 破棄ルールを設定します。デフォルトは RUMCacheDiscard.DISCARD です。DISCARD は追加データを破棄し、DISCARD_OLDEST は古いデータを破棄します

RUM 手動収集

FTRUMConfig で setEnableTraceUserAction、setEnableTraceUserView、setEnableTraceUserResource、setEnableTrackAppUIBlock、setEnableTrackAppCrash、setEnableTrackAppANR を設定することで、Action、View、Resource、LongTask、Error を自動収集できます。カスタム収集が必要な場合は、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 オプション。number を渡すと継続時間(ナノ秒)を表し、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 を導入する場合は、@guancecloud/ft_sdk_ext/Index から公開 API を一元的にインポートし、src/main/... のような深いパスを使用しないことを推奨します。

RCP 自動トラッキング導入

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

現在のバージョン以降、SDK はグローバルな RCP Session を自動的に作成または保持しません。代わりに、以下の機能を提供するので、アプリ側で組み立ててください。

  • RCPTraceInterceptor: Trace Headers を自動的に注入します
  • RCPResourceInterceptor: Resource データとパフォーマンス指標を自動的に収集します
  • 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.NetworkKit の http.createHttp() を使用してリクエストを送信している場合は、@guancecloud/ft_sdk_ext が提供する HTTP インターセプターを使用して、自動 Trace Header 注入と Resource 収集を実現できます。この導入方法には、ft_sdk_ext 0.1.14 以降と 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.json5 に overrides["@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 から実際のリクエストメソッドを安定して取得できないため、Resource の method が UNKNOWN として記録される場合があります
  • @ohos/axios の interceptorChain モードを使用する場合は、axios の実際の method、url、headers をブリッジするために、applyFTAxiosChainMethodBridge() を追加でマウントすることを推奨します
  • @kit.NetworkKit のインターセプターコールバックは、現時点では RCP の timeInfo レベルの詳細な所要時間を公開していないため、現在は resourceLoad のみが補足されます

Axios 導入

@ohos/axios を使用している場合は、次の方法で自動トラッキングを導入できます:

  • @guancecloud/ft_sdk: Axios の request/response interceptors に基づく互換モード
  • @guancecloud/ft_sdk_ext: 0.1.14 以降で 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_ext の interceptorChain による 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 インターセプター導入の内容を参考に、HttpInitialRequestInterceptor と HttpFinalResponseInterceptor を必要に応じて組み合わせてください。

リクエスト単位で渡す場合は、次のように記述することもできます:

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 インターセプターがある場合は、HttpInitialRequestInterceptor と HttpFinalResponseInterceptor を直接使用して順序を手動で組み立て、FT の自動トラッキング後に url、method、headers を再度書き換えないことを推奨します
  • 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(Time To First Byte)などのネットワークリクエストのパフォーマンス指標を取得します。

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 の実装上の問題ではありません。

フィードバック

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