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. 두 번째 매개변수 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 데이터 모니터링 참조 |
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 선택 사항. 세 번째 매개변수가 지속 시간인 경우에만 확장 속성 전달.
*/
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의 단위는 나노초입니다: 세 번째 매개변수는 직접 확장 속성을 전달할 수 있습니다; 지속 시간과 확장 속성을 동시에 전달해야 하는 경우 세 번째, 네 번째 매개변수로 순서대로 전달합니다.
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 수집을 완료할 수 있습니다. 이 연동 방식은 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.json5에overrides["@guancecloud/ft_sdk"] = "file:./libs/ft_sdk.har"를 추가하여 내부 의존성을 로컬 HAR로 재작성해야 합니다.
SDK는 다음 기능을 제공합니다:
HttpInitialRequestInterceptor: 요청 시작 단계에서 Trace Header를 주입하고Resource시작HttpFinalResponseInterceptor: 응답 종료 단계에서Resource데이터를 보충하고 수집 종료createFTHttpInterceptorChain(): 재사용 가능한http.HttpInterceptorChain생성applyFTHttpTrack(): 기본 인터셉터 체인을 단일http.HttpRequest에 직접 적용
두 가지 연동 방식을 제공합니다.
방식 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모드를 사용하는 경우,applyFTAxiosChainMethodBridge()를 추가로 적용하여 axios의 실제 method, url 및 headers를 브리징하는 것이 좋습니다. @kit.NetworkKit의 인터셉터 콜백은 현재 RCPtimeInfo수준의 상세 시간을 노출하지 않으므로, 현재는resourceLoad만 보충됩니다.
Axios 연동¶
비즈니스에서 @ohos/axios를 사용하는 경우 다음과 같이 자동 추적을 연동할 수 있습니다:
@guancecloud/ft_sdk: Axiosrequest/response interceptors기반 호환 모드@guancecloud/ft_sdk_ext:0.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/axioscompat 모드에서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)를 호출하여 브리지 누락으로 인한Resourcemethod 기록 부정확을 방지하는 것을 권장합니다. 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()을 명시적으로 적용해야 합니다. AxiosinterceptorChain모드는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 구현 문제가 아닙니다.