콘텐츠로 이동

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, setEnableTrackAppCrashsetEnableTrackAppANR을 구성하여 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 루트 진입점을 통해 가져오는 경우 다음도 사용 가능합니다:

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에 직접 적용

두 가지 연동 방식을 제공합니다.

방식 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_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/axios compat 모드에서 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)를 호출하여 브리지 누락으로 인한 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 등)을 획득합니다.

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 구현 문제가 아닙니다.

문서 평가

이 페이지가 도움이 되었나요?