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 のルートエントリからインポートしている場合も、次のように使用できます:
手動でのインターセプター組み立て
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 の実装上の問題ではありません。