imqa.document

Web Agent 설치 가이드

IMQA Web Agent는 Opentelemetry Native 기반으로 동작합니다. 이 문서는 웹프론트엔드 (VanillaJS, React, Nextjs등) 프레임워크에서 동작하며 웹성능 지표를 수집하기 위한 데이터 구조를 설명합니다.

Summary

IMQA Web Agent는 Opentelemetry Native 기반으로 동작합니다. 이 문서는 웹프론트엔드 (VanillaJS, React, Vue, Nextjs등) 프레임워크에서 동작하며 웹성능 지표를 수집하기 위한 에이전트 설치 및 설정 방법을 설명합니다.

프론트엔드 모니터링

웹 프론트엔드 성능 모니터링은 사용자 경험을 개선하고 웹 애플리케이션의 성능을 최적화하는 데 중요한 역할을 합니다. IMQA를 사용하면 표준화된 방식으로 성능 데이터를 수집하고 분석할 수 있습니다.

수집된 데이터를 바탕으로 다음과 같은 최적화를 수행할 수 있습니다:

  • 느린 API 호출 식별 및 최적화
  • 클라이언트 사이드 렌더링 성능 개선
  • 자주 발생하는 오류 해결

주요 기능

네트워크 요청 자동 계측

  • XMLHttpRequest 및 Fetch API: 네트워크 요청 및 응답의 상세 추적
  • WebSocket (beta): 실시간 양방향 통신 계측
  • 요청/응답 메타데이터: HTTP 메서드, 상태 코드, 헤더, 타이밍 정보 자동 수집

페이지 로드 성능 추적

  • Document Load (@imqa/instrumentation-document-load)
    • Navigation Timing API를 통한 초기 페이지 로드 성능 측정
    • Server-Timing 헤더 파싱 및 백엔드 타이밍 정보 수집
    • TraceParent 추출을 통한 분산 추적 지원
    • 리소스 타이밍 정보 수집 (이미지, 스크립트, 스타일시트 등)
  • Post Document Load (@imqa/instrumentation-post-doc-load-resource)
    • Performance Observer를 통한 동적 리소스 추적
    • Mutation Observer를 통한 <head> 변경 감지
    • SPA 라우트 전환 후 로드되는 리소스 자동 계측
    • URL-to-Context 매핑을 통한 컨텍스트 보존

사용자 상호작용 및 이벤트

  • User Interaction: 클릭, 마우스 이벤트, 드래그, 키보드 입력 등 자동 추적
  • User Event (@imqa/user-event)
    • 비즈니스 로직의 시작과 완료 지점을 명시적으로 추적
    • OpenTelemetry 컨텍스트 전파를 통한 자동 그룹화
    • 이벤트 중 발생하는 모든 계측(fetch, console, exception 등)을 단일 트레이스로 연결
    • 저장소를 통한 이벤트 지속성 (페이지 새로고침 지원)

SPA (Single Page Application) 지원

  • Route Change (@imqa/instrumentation-route)
    • History API 기반 클라이언트 사이드 라우팅 자동 추적
    • pushState, replaceState, popstate, hashchange 이벤트 감지
    • React Router, Vue Router, Angular Router, Next.js 등 모든 라우팅 라이브러리 호환
    • 라우트 전환 시 발생하는 리소스 로딩 자동 연결
    • 사용자 이벤트와의 자동 컨텍스트 연결

에러 및 예외 추적

  • Browser Exception (@imqa/instrumentation-browser-exception)
    • Uncaught exceptions 자동 수집
    • Unhandled promise rejections 추적
    • Document error events (이미지/스크립트 로드 실패 등)
    • console.error() 패칭 및 스택 트레이스 수집
    • 에러 발생 시 활성 컨텍스트 자동 보존
    • Span/Log 상관관계 (span.id, trace.id)를 통한 추적

성능 모니터링

  • Web Vitals: LCP, FID, CLS, FCP, TTFB 자동 수집
  • Long Tasks: 자동 컨텍스트 연결을 통한 브라우저 메인 스레드 블로킹 감지
  • 세션 분석: 세션 ID를 통한 사용자 행동 패턴 분석

컨텍스트 관리

  • 자동 컨텍스트 유지: Timer, Promise, async/await, 이벤트, Observer 등에서 자동 컨텍스트 전파
  • IMQAContextManager: OpenTelemetry Context API를 확장한 고급 컨텍스트 관리
  • 분산 추적: 프론트엔드와 백엔드 간 TraceParent 전파

페이지 상태 추적

  • Visibility: 페이지 가시성 변경 자동 계측
  • Connectivity: 네트워크 연결 상태 변경 자동 계측

사용자 정의 및 확장

  • 커스텀 속성: 사용자 ID, 지역, 비즈니스 메타데이터 추가
  • 수동 계측: 커스텀 로그, 커스텀 에러, 사용자 이벤트 수동 추적
  • 세션 리플레이 (beta): DOM 변경, 사용자 입력, 스크린샷 캡처

크로스 플랫폼 지원

  • Mobile SDK 연동: IMQA Android/iOS SDK와 연동하여 네이티브-웹뷰 컨텍스트 자동 연결
  • 레거시 브라우저: IE11, Chrome 52, Edge Legacy 79, Safari 11, Firefox 57 이상 지원

빠른 설치

CDN을 통한 설치

웹사이트에서 IMQA로 계측을 시작하는 가장 쉬운 방법은 아래 코드를 <head></head> 태그 내부에 추가하는 방법입니다:

최신 버전

IMQA에서 제공하는 최신의 기능을 사용하려면 아래 코드를 사용하세요. 이 코드는 항상 최신 버전을 사용합니다.

Tip패키지 이름과 서비스 키 발급

IMQA 관리 계정 로그인 후 글로벌 관리 > 서비스 관리에서 새로운 서비스를 등록하고 발급된 서비스 키를 사용하여 설치하세요.

<script src="https://cdn.imqa.io/release/npm/@web-agent/latest/index.js">
</script>
<script>
  window.IMQA.init({
    collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
    serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
    serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
    serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
    serviceNamespace: '{{SERVICE_NAMESPACE}}',
    deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
  });
</script>
Important패키지 이름 설정

serviceName서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.

특정 버전

특정 버전을 사용하기 위한 설치 코드는 아래와 같습니다. {{VERSION}} 부분을 사용하려는 버전으로 대체하세요. 사용가능한 버전과 릴리즈 노트는 릴리즈 노트에서 확인할 수 있습니다.

<script
  src="https://cdn.imqa.io/release/npm/@web-agent/{{VERSION}}/index.js"
  integrity="{{VERSION_SRI_HASH_INTEGRITY}}"
  crossorigin="anonymous">
</script>
<script>
    window.IMQA.init({
      collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
      serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
      serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
      serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
      serviceNamespace: '{{SERVICE_NAMESPACE}}',
      deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
    });
</script>

IMQA 지원하는 모든 옵션은 설정을 참조해주세요. collectorUrl, serviceName, serviceKey, serviceVersion을 올바르게 제공하면 웹사이트가 준비되며 다른 필수 작업은 필요하지 않습니다. 수집된 추적 정보를 지정된 IMQA 수집기로 전송합니다.

NPM 을 통한 설치

https://www.npmjs.com/package/@imqa/web-agent

NPM Version NPM Last Update NPM Unpacked Size npm package minimized gzipped size NPM Downloads NPM Type Definitions

다른 옵션은 프로젝트 내에서 이 라이브러리를 번들로 묶고 초기화하는 것입니다. 프로젝트 디렉토리 내에서 npm install @imqa/web-agent를 실행하세요.

에이전트는 다른 기능보다 우선적으로 초기화되어야 관련 정보들을 수집할 수 있습니다.

import IMQA from '@imqa/web-agent';

IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
  serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}',
  serviceNamespace: '{{SERVICE_NAMESPACE}}',
  deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
});

폐쇄망 설치

NoteNote

Web앱과 WebView에서 모두 적용 가능하며, 아래 설치 방법 중 하나를 선택하여 진행합니다.

TipTip

서비스 키 발급 IMQA 관리자 계정 로그인 → 글로벌 관리 > 서비스 관리에서 서비스 등록 후 키 발급 모든 설치 완료 후 계측은 자동으로 수행되며, 커스텀 데이터 수집 등 추가 사용법은 IMQA Web Agent API 문서 참고

IMQA 관리자 가이드

Option 1: 폐쇄망에서 직접 다운로드 후 스크립트 추가

  1. 폐쇄망에서는 CDN을 통해 직접 실행할 수 없으므로 인터넷이 연결된 환경에서 미리 번들링된 자바스크립트 파일을 다운로드를 받습니다.
  1. 다운로드된 index.js 파일을 적절한 이름 imqa-agent.js 로 변경하여 프로젝트 내부에 포함 시킵니다. 아래 예시는 프로젝트내 public 폴더 내에 위치하고 있다고 가정합니다.
  2. 아래 코드와 같이 <head> 태그 안에 추가합니다.
<script src="./public/imqa-agent.js">
</script>
<script>
  window.IMQA.init({
    collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
    serviceName: '{{NAME_OF_YOUR_SERVICE}}',
    serviceVersion: '{{VERSION_OF_YOUR_SERVICE}}',
    serviceKey: '{{KEY_OF_YOUR_SERVICE}}',
    serviceNamespace: '{{SERVICE_NAMESPACE}}',
    deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
  });
</script>
Important패키지 이름 설정

serviceName서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.

  1. collectorUrl , serviceName , serviceVersion , serviceKey 값은 필수값입니다.
  • collectorUrl 주소는 내부망으로 접근할 경우 그리고 외부망에서 접근할 경우에 맞추어 URL을 설정해야 합니다. IP주소로 적용할 경우 http://xxx.xxx.xxx.xxx:4318 형태로 적용합니다. 상세 보기

  • serviceName 서비스 이름. (서비스 등록할 때의 패키지명) 상세 보기

  • serviceVersion 서비스 버전 상세 보기

  • serviceKey 서비스 키 상세 보기

  • serviceNamespace 서비스 네임스페이스 상세 보기

  • deploymentEnvironment 배포 환경 상세 보기

  • 위에 언급한 6건의 설정값 이외의 추가 설정 옵션은 아래 문서를 참조해주세요.

설정 옵션

  1. 모든 준비가 완료되었습니다. 이후 모든 계측은 자동으로 수행됩니다. 계측을 수행중인 중에 커스텀하게 데이터를 수집하거나 앱이 실행되는 중에 발생한 비즈니스 로직에 의한 계측 결과를 추가할 수 있도록 하려면 IMQA Web Agent API를 참조해주세요.

Option 2: npm 또는 yarn등으로 설치 후 초기화

  1. Web App 프로젝트에 @imqa/web-agent 패키지를 설치합니다. 현재 stable 배포버전은 NPM Version 입니다.
  • npm
npm install @imqa/web-agent
  • yarn
yarn add @imqa/web-agent
  1. Web App 프로젝트 entry point 에 @imqa/web-agent 를 import 하고, init으로 IMQA를 초기화 합니다. 여기서는 React와 Vuejs 2의 예시를 들었습니다.
  • React
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { App } from "./my-app";
import IMQA from "@imqa/web-agent";

IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_SERVICE}}',
  serviceKey: '{{KEY_OF_YOUR_SERVICE}}',
  serviceNamespace: '{{SERVICE_NAMESPACE}}',
  deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
});

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <App />
  </StrictMode>
);
  • Vuejs 2
import Vue from "vue";
import App from "./app.vue"; // get root module
import router from "./router";
import store from "./store"; // get vuex -> store
import IMQA from "@imqa/web-agent"; // IMQA agent

IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_SERVICE}}',
  serviceKey: '{{KEY_OF_YOUR_SERVICE}}',
  serviceNamespace: '{{SERVICE_NAMESPACE}}',
  deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
});

const app = new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount("#app");
Important패키지 이름 설정

serviceName서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.

  1. collectorUrl , serviceName , serviceVersion , serviceKey 값은 필수값입니다.
  • collectorUrl 주소는 내부망으로 접근할 경우 그리고 외부망에서 접근할 경우에 맞추어 URL을 설정해야 합니다. IP주소로 적용할 경우 http://xxx.xxx.xxx.xxx:4318 형태로 적용합니다. 상세 보기

  • serviceName 서비스 이름. (서비스 등록할 때의 패키지명) 상세 보기

  • serviceVersion 서비스 버전 상세 보기

  • serviceKey 서비스 키 상세 보기

  • serviceNamespace 서비스 네임스페이스 상세 보기

  • deploymentEnvironment 배포 환경 상세 보기

  • 위에 언급한 6건의 설정값 이외의 추가 설정 옵션은 설정 옵션을 참조해주세요.

  1. 모든 준비가 완료되었습니다. 이후 모든 계측은 자동으로 수행됩니다. 계측을 수행중인 중에 커스텀하게 데이터를 수집하거나 앱이 실행되는 중에 발생한 비즈니스 로직에 의한 계측 결과를 추가할 수 있도록 하려면 IMQA Web Agent API 문서를 참조해주세요.

Option 3: 폐쇄망에서 package.json에 직접 의존성 추가

  • imqa-web-agent-latest.tgz 파일 다운로드

https://cdn.imqa.io/release/npm/@web-agent/latest/imqa-web-agent-latest.tgz

  • 프로젝트 내부 적절한 경로에 배치 후 npm install /path/to/imqa-web-agent-latest.tgz
npm install /path/to/imqa-web-agent-latest.tgz

예를들어 프로젝트 구조가 아래와 같이 되어 있다면

.
├── README.md
├── index.html
├── package-lock.json
├── package.json
├── public
│   └── vite.svg
├── src
│   ├── App.vue
│   ├── assets
│   │   └── vue.svg
│   ├── components
│   │   └── HelloWorld.vue
│   ├── main.ts
│   ├── style.css
│   └── vite-env.d.ts
├── third-pary-packages
│   └── imqa
│       └── imqa-web-agent-latest.tgz
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts

아래와 같이 설치합니다.

npm install ./third-pary-packages/imqa/imqa-web-agent-latest.tgz
  • 이후 2안과 같이 설정 진행하면 됩니다.

Option 4: npm install 을 사용할 수 없는 경우

  • imqa-web-agent-latest.tgz 파일 다운로드 후 압축 해제

https://cdn.imqa.io/release/npm/@web-agent/latest/imqa-web-agent-latest.tgz

  • 프로젝트 node_modules/@imqa/web-agent 폴더에 압축해제된 package 내의 파일들을 복사합니다.
node_modules/@imqa/web-agent
├── CHANGELOG.md
├── README.md
├── build
│   ├── index.d.ts
│   ├── index.js
│   └── sri-hash.txt
└── package.json
  • 프로젝트의 package.json 을 열고 dependencies"@imqa/web-agent": "latest" 를 추가합니다.
  • 이후 2안과 같이 설정 진행하면 됩니다.

레거시 브라우저 설치 (Support IE11)

IMQA Web Agent는 레거시 브라우저를 제한적으로 지원합니다. 제한적으로 지원되는 레거시 브라우저 참조.

NoteNote

Internet Explorer 11 에서 테스트 되었습니다.

패키지 매니저로 설치

  • 패키지 매니저(npm, yarn, pnpm, bun 등)로 설치한 경우, @imqa/web-agent 패키지를 설치합니다.
npm install @imqa/web-agent
  • 아래와 같이 @imqa/web-agent/legacy를 import하여 사용합니다.
import IMQA from "@imqa/web-agent/legacy";

IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
  serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}',
  serviceNamespace: '{{SERVICE_NAMESPACE}}',
  deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
  // 기타 설정...
});
NoteNote

umd 포맷으로 번들링이 되어 있어 commonjs, amd, iife 등 다양한 환경에서 사용할 수 있습니다.

CDN 혹은 로컬 설치

  • CDN 혹은 로컬 js 파일을 HTML에 추가합니다. 아래 예시에서는 index.html 파일에 IMQA Web Agent의 CDN 경로를 추가하고 초기화 합니다. 폐쇄망의 경우 자세한 설치 및 설정은 폐쇄망 설치 섹션을 참고하세요.
<script
  src="https://cdn.imqa.io/release/npm/@web-agent/latest/index-legacy.js"
  type="text/javascript"></script>
<script>
window.IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
  serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
  serviceNamespace: '{{SERVICE_NAMESPACE}}',
  deploymentEnvironment: '{{DEPLOYMENT_ENVIRONMENT}}',
  // 기타 설정...
});
</script>
NoteNote

index-legacy.js 자바스크립트 파일은 레거시 브라우저에서 사용할 수 있도록 번들링된 파일입니다. 이 파일은 첨부된 파일을 압축해제하여 build 폴더에 있는 index-legacy.js 파일을 프로젝트에 추가하여 사용할 수 있습니다.

특정 버전의 설치는 버전 @web-agent/{VERSION}을 사용하여 설치합니다. 지원되는 버전은 1.0.0 이상입니다. 이후 IMQA를 초기화하는 코드는 동일합니다. 설정이 완료되면 모든 계측이 자동으로 수행됩니다.

소스맵 업로드 (Vite)

@imqa/vite-sourcemap 플러그인

Vite를 사용하는 프로젝트에서 빌드 후 소스맵을 자동으로 IMQA 서버로 업로드할 수 있습니다. 이를 통해 프로덕션 환경에서 발생한 에러의 원본 소스코드 위치를 정확하게 추적할 수 있습니다.

주요 기능

  • Vite 빌드 완료 후 소스맵 자동 업로드
  • 멀티파트 폼 데이터로 파일 업로드
  • 포함/제외 패턴으로 파일 필터링
  • gzip 압축 지원
  • 동시 업로드 제한 및 재시도 로직
  • CI 환경 감지
  • 업로드 후 로컬 소스맵 파일 삭제 옵션

설치

npm install @imqa/vite-sourcemap --save-dev

기본 설정

// vite.config.ts
import { defineConfig } from 'vite'
import sourcemapUpload from '@imqa/vite-sourcemap'

export default defineConfig({
  build: {
    sourcemap: true, // 중요: 소스맵 생성을 활성화해야 합니다
  },
  plugins: [
    sourcemapUpload({
      endpoint: 'https://api.your-service.imqa.io/api/sourcemaps',
      apiKey: process.env.SOURCEMAP_API_KEY,
      release: process.env.GIT_SHA,
      appVersion: process.env.npm_package_version,
    }),
  ],
})

고급 설정 옵션

옵션타입기본값설명
endpointstring-(필수) 소스맵을 업로드할 API 엔드포인트
method'POST' | 'PUT''POST'HTTP 메서드
apiKeystring-Bearer 토큰 또는 API 키
releasestring-릴리즈 식별자 (예: git SHA)
appVersionstring-앱 버전 (semver)
buildstring-빌드 번호 또는 CI 빌드 ID
include(string | RegExp)[]-포함할 파일 패턴
exclude(string | RegExp)[]-제외할 파일 패턴
urlPrefixstring-업로드 파일명에 추가할 접두사
transformPath(path: string) => string-경로 변환 함수
concurrencynumber6동시 업로드 수
retriesnumber3재시도 횟수
gzipbooleantruegzip 압축 사용 여부
deleteAfterUploadbooleanfalse업로드 후 로컬 파일 삭제
ciOnlybooleanfalseCI 환경에서만 실행
verbosebooleanCI에서 true상세 로그 출력

사용 예시

// vite.config.ts
import sourcemapUpload from '@imqa/vite-sourcemap'

export default defineConfig({
  build: {
    sourcemap: true,
  },
  plugins: [
    sourcemapUpload({
      // 필수: 업로드 엔드포인트
      endpoint: 'https://api.your-service.imqa.io/api/sourcemaps',

      // 인증
      apiKey: process.env.IMQA_AUTH_TOKEN,

      // 릴리즈 정보
      release: process.env.IMQA_SERVICE_NAME,
      appVersion: process.env.npm_package_version,

      // CDN 경로 설정
      urlPrefix: '~/dist/',

      // 파일 필터링: assets 폴더의 JS 소스맵만
      include: [/assets\/.+\.js\.map$/],
      exclude: [/node_modules/],

      // CI에서만 실행
      ciOnly: true,

      // 업로드 후 로컬 파일 삭제
      deleteAfterUpload: true,
    }),
  ],
})

GitHub Actions와 함께 사용

# .github/workflows/deploy.yml
- name: Build and upload sourcemaps
  env:
    SOURCEMAP_API_KEY: ${{ secrets.SOURCEMAP_API_KEY }}
    GIT_SHA: ${{ github.sha }}
  run: npm run build

CI 환경 감지

플러그인은 다음 환경 변수를 통해 CI 환경을 자동으로 감지합니다:

  • CI
  • GITHUB_ACTIONS
  • GITLAB_CI
  • BUILDKITE
  • CIRCLECI
  • TRAVIS
  • BITBUCKET_BUILD_NUMBER
Tip소스맵 업로드 확인

verbose: true 옵션을 사용하면 업로드 과정을 상세하게 확인할 수 있습니다. 소스맵이 성공적으로 업로드되면 프로덕션 환경에서 발생한 에러의 정확한 소스 코드 위치를 확인할 수 있습니다.

설정 (Options)

옵션 이름타입필수 여부설명
collectorUrlstringoptional콜렉터 주소를 지정합니다. 기본값은 https://in-otel.imqa.io입니다.
authorizationTokenstringoptional인증 토큰을 설정합니다.
serviceNamestringoptional서비스 이름을 지정합니다. (서비스 등록할 때의 패키지명) 텔레메트리 데이터 저장에 필수적입니다.
serviceKeystringoptional서비스 키를 설정합니다. 텔레메트리 데이터 저장에 필수적입니다.
serviceVersionstringoptional서비스 버전을 지정합니다. 텔레메트리 데이터 저장에 필수적이며, 빈 문자열이나 비문자열일 경우 경고가 발생합니다.
serviceNamespacestringoptional서비스 네임스페이스를 설정합니다. 여러 서비스(Android, iOS, Web 등)를 통합하여 모니터링할 경우 필요하며 비어있는 경우 service.namespace를 보내지 않습니다.
deploymentEnvironmentstringoptional배포 환경을 설정합니다. setGlobalAttributes()를 통해 지속되는 environment 속성의 값을 설정할 수 있습니다.
defaultAttributesAttributesoptional기본 리소스 속성을 설정합니다. 모든 Span에 추가되는 전역 속성으로 사용됩니다.
samplingProbabilitynumber | stringoptional샘플링 확률을 설정합니다. 0에서 1 사이의 값으로 지정하며, 기본값은 1입니다.
advancedNetworkCapturebooleanoptional네트워크 요청 및 응답의 상세 추적을 활성화합니다. 기본값은 false입니다.
blockClassstringoptional세션 리플레이에서 가려야 할 요소의 CSS 클래스를 지정합니다.
consoleCapturebooleanoptional콘솔 캡처 기능을 활성화합니다. 기본값은 false입니다.
debugbooleanoptional디버깅 모드를 활성화합니다. 기본값은 false입니다.
disableIntercombooleanoptionalIntercom 연동을 비활성화합니다. 기본값은 false입니다.
disableReplaybooleanoptional세션 리플레이 기능을 비활성화합니다. 기본값은 true입니다.
ignoreClassstringoptional세션 리플레이에서 무시할 요소의 CSS 클래스를 지정합니다.
ignoreUrlsArray<string | RegExp>optional추적하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 추적되지 않습니다.
instrumentationsInstrumentationsoptional사용자 지정 Instrumentations 설정을 지정합니다. 기본값은 빈 객체 {}입니다.
maskAllInputsbooleanoptional모든 입력 요소를 마스킹합니다. 기본값은 true입니다.
maskAllTextbooleanoptional모든 텍스트를 마스킹합니다. 기본값은 false입니다.
maskClassstringoptional텍스트 마스킹에 사용할 CSS 클래스를 지정합니다.
recordCanvasbooleanoptional캔버스 요소 기록 여부를 설정합니다. 기본값은 false입니다.
samplingnumberoptional세션 레코더 샘플링 설정을 지정합니다.
tracePropagationTargetsArray<string | RegExp>optionalTrace Header를 전파할 대상 도메인 또는 정규식 목록을 지정합니다.
webVitalsbooleanoptional웹 비타일을 활성화합니다. 기본값은 false입니다.
websocketbooleanoptional웹소켓 계측을 활성화합니다. 기본값은 false입니다.
socketiobooleanoptionalSocket.IO 계측을 활성화합니다. 기본값은 false입니다.
captureMetricbooleanoptional메트릭 수집을 활성화합니다. 기본값은 false입니다. (beta)
disablePreflightbooleanoptionalpreflight 요청 비활성화 여부 (기본값: false) preflight는 CORS 요청을 위한 OPTIONS 요청입니다.
exporterProtocoljson or protooptionalexporter 프로토콜을 설정합니다. 기본값은 json입니다.
screenNameOptionScreenNameOptionoptional화면 이름 옵션을 설정합니다. 기본값은 { screenNameType: "routeOnly", urlWithSearchParams: false }입니다.

옵션 상세 설명

collectorUrl

(string, 선택)

텔레메트리 데이터를 전송할 콜렉터의 URL을 지정합니다. 기본값은 https://in-otel.imqa.io입니다.

ImportantIMQA Mobile SDK와 연동
  • - 웹 브라우저 환경을 계측할 경우에는 collectorUrl 값을 반드시 입력해야 합니다.
  • - Android/iOS SDK에서 웹뷰 환경을 계측할 경우, 네이티브 SDK에서 collectorUrl을 자동으로 전달하므로 별도로 입력할 필요가 없습니다.
  • - 웹뷰 환경과 웹 브라우저 환경을 모두 계측하려는 경우, 웹뷰에서는 네이티브 SDK가 자동으로 전달한 파라미터를 사용하고, 웹 브라우저에서는 직접 입력한 파라미터를 사용하게 됩니다.

authorizationToken

(string, 선택)

콜렉터에 인증할 때 사용할 토큰을 설정합니다. 보안이 필요한 경우 사용합니다.

serviceNamespace

(string, 선택)

서비스 네임스페이스를 설정합니다. 여러 서비스(Android, iOS, Web 등)를 통합하여 모니터링할 경우 필요합니다. 비어있는 경우 service.namespace를 보내지 않습니다.

TipIMQA v4.0.0 이상과 연동

IMQA v4.0.0 이상에서는 serviceNamespace를 사용하여 동일한 서비스 네임스페이스 내에서 여러 플랫폼(Android, iOS, Web 등)의 데이터를 통합하여 모니터링할 수 있습니다. 이를 통해 전체적인 서비스 상태를 한눈에 파악할 수 있습니다.

serviceName

(string, 선택)

IMQA에서 관리하는 서비스의 이름을 지정합니다. 서비스 등록할 때의 패키지명이며, 이 값은 서비스를 구분짓는 값으로 텔레메트리 데이터 저장 및 분석에 사용됩니다. serviceName서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.

ImportantIMQA Mobile SDK와 연동
  • - 웹 브라우저 환경을 계측할 경우에는 serviceName 값을 반드시 입력해야 합니다.
  • - Android/iOS SDK에서 웹뷰 환경을 계측할 경우, 네이티브 SDK에서 serviceName을 자동으로 전달하므로 별도로 입력할 필요가 없습니다.
  • - 웹뷰 환경과 웹 브라우저 환경을 모두 계측하려는 경우, 웹뷰에서는 네이티브 SDK가 자동으로 전달한 파라미터를 사용하고, 웹 브라우저에서는 직접 입력한 파라미터를 사용하게 됩니다.

serviceKey

(string, 선택)

IMQA에서 발급된 서비스의 키를 설정합니다. IMQA 관리 계정 로그인 후 글로벌 관리 > 서비스 관리에서 새로운 서비스를 등록하고 발급된 서비스 키를 사용하여 설치하세요.

ImportantIMQA Mobile SDK와 연동
  • - 웹 브라우저 환경을 계측할 경우에는 serviceKey 값을 반드시 입력해야 합니다.
  • - Android/iOS SDK에서 웹뷰 환경을 계측할 경우, 네이티브 SDK에서 serviceKey을 자동으로 전달하므로 별도로 입력할 필요가 없습니다.
  • - 웹뷰 환경과 웹 브라우저 환경을 모두 계측하려는 경우, 웹뷰에서는 네이티브 SDK가 자동으로 전달한 파라미터를 사용하고, 웹 브라우저에서는 직접 입력한 파라미터를 사용하게 됩니다.

serviceVersion

(string, 선택)

서비스의 버전을 지정합니다. 이 값 서비스 버전을 구분짓는 값으로 텔레메트리 데이터 저장 및 분석에 사용됩니다.

ImportantIMQA Mobile SDK와 연동
  • - 웹 브라우저 환경을 계측할 경우에는 serviceVersion 값을 반드시 입력해야 합니다.
  • - Android/iOS SDK에서 웹뷰 환경을 계측할 경우, 네이티브 SDK에서 serviceVersion을 자동으로 전달하므로 별도로 입력할 필요가 없습니다.
  • - 웹뷰 환경과 웹 브라우저 환경을 모두 계측하려는 경우, 웹뷰에서는 네이티브 SDK가 자동으로 전달한 파라미터를 사용하고, 웹 브라우저에서는 직접 입력한 파라미터를 사용하게 됩니다.

deploymentEnvironment

(string, 선택)

배포 환경을 설정합니다. 예를 들어, production, staging 등으로 설정하여 환경별로 데이터를 구분할 수 있습니다.

defaultAttributes

(Attributes, 선택)

모든 Span에 추가되는 전역 속성을 설정합니다. 사용자 정의 속성을 추가하여 텔레메트리 데이터를 보강할 수 있습니다.

samplingProbability

(number | string, 선택)

샘플링 확률을 설정합니다. 0에서 1 사이의 값으로 지정하며, 기본값은 1로 모든 트랜잭션을 샘플링합니다.

advancedNetworkCapture

(boolean, 선택)

네트워크 요청 및 응답의 상세한 추적을 활성화합니다. 기본값은 false이며, 활성화 시 네트워크 관련 데이터를 더 상세히 수집할 수 있습니다.

Important개인정보 보호

이 기능을 활성화할 경우 http.request.headerhttp.request.body의 정보가 포함됩니다. 민감한 정보가 포함될 수 있으므로 주의가 필요합니다.

blockClass

(string, 선택)

세션 리플레이에서 가려야 할 요소의 CSS 클래스를 지정합니다. 민감한 정보가 포함된 요소를 가릴 때 사용합니다.

consoleCapture

(boolean, 선택)

콘솔 로그를 캡처할지 여부를 설정합니다. 기본값은 false이며, 활성화 시 콘솔에서 발생하는 로그도 텔레메트리 데이터로 수집됩니다.

debug

(boolean, 선택)

디버깅 모드를 활성화합니다. 기본값은 false이며, 활성화 시 추가적인 로그가 출력되어 문제 해결에 도움이 됩니다.

disableIntercom

(boolean, 선택)

Intercom과의 연동을 비활성화합니다. 기본값은 false이며, 활성화 시 Intercom과의 통합 기능이 비활성화됩니다.

disableReplay

(boolean, 선택)

세션 리플레이 기능을 비활성화합니다. 기본값은 true이며, 비활성화 시 사용자 세션의 리플레이 기능이 동작합니다. 이 기능은 현재 개발 중이며 추후에 활성화될 예정입니다.

Important세션 리플레이 비활성화

이 기능은 현재 개발 중이며 추후에 활성화될 예정입니다.

sessionStorage

(StorageType, 선택)

type StorageType = 'cookie' | 'localStorage';

세션ID 저장소의 타입을 설정합니다. 기본값은 cookie이며, localStorage로 변경할 수 있습니다. 이 설정은 세션 데이터의 저장 방식을 결정합니다. 일반적으로 cookie를 사용하며, 브라우저 쿠키를 사용할 수 없는 하이브리드앱의 웹뷰의 경우 localStorage를 사용합니다.

Important모바일 웹뷰 설정

이 기능을 localStorage 옵션을 사용할 경우 웹뷰 브라우저의 localStorage 저장소가 활성화되어 있어야 합니다. 안드로이드의 경우

webview.settings.domStorageEnabled = true

iOS의 경우 기본적으로 활성화 되어있으나 명시적으로 허용해야하는 경우

let config = WKWebViewConfiguration()
config.websiteDataStore = WKWebsiteDataStore.default()
let webView = WKWebView(frame: .zero, configuration: config)

설정을 통해 활성화할 수 있습니다.

사용 방법

IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
  serviceKey: '{{SERVICE_KEY}}',
  sessionStorage: 'localStorage' // or 'cookie'
});

ignoreClass

(string, 선택)

세션 리플레이에서 무시할 요소의 CSS 클래스를 지정합니다. 특정 요소를 기록하지 않으려는 경우 사용합니다.

ignoreUrls

(Array<string | RegExp>, 선택)

추적하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치하거나 정확히 일치하는 URL은 텔레메트리 데이터에 포함되지 않습니다.

maskAllInputs

(boolean, 선택)

모든 입력 요소를 마스킹합니다. 기본값은 true이며, 활성화 시 모든 입력 필드의 값이 마스킹되어 저장됩니다. 민감한 정보가 포함된 경우 사용합니다.

maskAllText

(boolean, 선택) 모든 텍스트를 마스킹합니다. 기본값은 false이며, 활성화 시 모든 텍스트가 마스킹되어 저장됩니다. 민감한 정보가 포함된 경우 사용합니다.

maskClass

(string, 선택)

텍스트 마스킹에 사용할 CSS 클래스를 지정합니다. 이 클래스를 가진 요소의 텍스트는 마스킹되어 저장됩니다. 민감한 정보가 포함된 경우 사용합니다.

recordCanvas

(boolean, 선택)

캔버스 요소 기록 여부를 설정합니다. 기본값은 false이며, 활성화 시 캔버스 요소의 내용이 기록됩니다..

sampling

(number, 선택)

세션 레코더 샘플링 설정을 지정합니다. 기본값은 1이며, 0에서 1 사이의 값을 설정할 수 있습니다. 이 값은 세션 레코더가 얼마나 많은 세션을 기록할지를 결정합니다.

tracePropagationTargets

(Array<string | RegExp>, 선택)

Trace Header를 전파할 대상 도메인 또는 정규식 목록을 지정합니다. 이 목록에 포함된 도메인으로 요청이 발생할 경우 Trace Header가 자동으로 전파됩니다. 정규식이나 문자열 배열로 설정할 수 있습니다.

webVitals

(boolean, 선택)

Web Vitals 계측을 활성화합니다. 기본값은 false이며, 활성화 시 Core Web Vitals 지표가 자동으로 계측됩니다. 이 기능은 웹 성능을 모니터링하는 데 유용합니다.

Web Vitals 데이터는 두 가지 형태로 전송됩니다:

  • Span: 개별 이벤트로 기록되어 상세한 추적 정보 제공
  • Histogram Metric: OpenTelemetry Metric으로 전송되어 분포도 및 백분위수 분석 지원

지원되는 메트릭:

  • FCP (First Contentful Paint)
  • TTFB (Time to First Byte)
  • FID (First Input Delay)
  • CLS (Cumulative Layout Shift)
  • LCP (Largest Contentful Paint)
  • INP (Interaction to Next Paint)

websocket

(boolean, 선택)

WebSocket 계측을 활성화합니다. 기본값은 true이며, 활성화 시 WebSocket 연결 이벤트가 자동으로 계측됩니다. 이 기능은 실시간 데이터 전송을 모니터링하는 데 유용합니다.

socketio

(boolean, 선택)

Socket.IO 계측을 활성화합니다. 기본값은 false이며, 활성화 시 Socket.IO 클라이언트의 이벤트가 자동으로 계측됩니다. 이 기능은 실시간 통신을 모니터링하는 데 유용합니다.

captureMetric

(boolean, 선택)

메트릭 수집을 활성화합니다. 기본값은 false이며, 활성화 시 모든 span의 duration 데이터 포인트에 해당하는 메트릭 데이터가 자동으로 수집됩니다. 이 기능은 빠른 성능 모니터링에 유용합니다.

disablePreflight

(boolean, 선택)

ImportantPreflight 요청
  • - Preflight 요청을 비활성화할 경우, Content-Type: text/plain 형태로 전송하게 됩니다. 이 콘텐트 타입을 허용하지 않는 다른 도메인에서의 요청이 차단될 수 있습니다.
  • preflight 요청 비활성화 여부를 설정합니다. 기본값은 false이며, 활성화 시 preflight 요청이 비활성화됩니다. preflight는 CORS 요청을 위한 OPTIONS 요청입니다. 보안상 필요한 경우 사용합니다.
  • 이 설정은 exporterProtocolproto로 설정된 경우 자동으로 true로 설정됩니다. 이는 proto 프로토콜이 preflight 요청을 필요로 하지 않기 때문입니다. 따라서, exporterProtocolproto로 설정하면 disablePreflight는 자동으로 활성화됩니다.
  • 이 설정을 true로 설정한 경우 IMQA 수집기 혹은 프록시에서 이 콘텐츠 타입을 허용해야 합니다.

exporterProtocol

(json | proto, 선택)

exporter 프로토콜을 설정합니다. 기본값은 json이며, proto로 설정할 경우 protobuf 프로토콜을 사용하여 데이터를 전송합니다. 이 설정은 IMQA의 수집기와의 호환성에 영향을 미칠 수 있습니다. 안정적인 데이터 전송을 위해 json 프로토콜을 사용하는 것이 일반적입니다.

  • 기본값은 json이며 json 프로토콜은 JSON 콘텐트 형식(application/json)으로 데이터를 전송하며, Beacon API를 통해 전송합니다.
  • proto로 설정할 경우 protobuf 프로토콜을 사용하여 프로토 형식(application/x-protobuf)로 데이터를 전송하며, Fetch API통해 전송합니다. proto를 설정하면 disablePreflight 옵션이 자동으로 true로 설정됩니다. 이는 proto 프로토콜이 preflight 요청을 필요로 하지 않기 때문입니다.
NoteBeacon API vs Fetch API

Beacon API

Beacon API는 브라우저가 페이지 언로드 시에도 데이터를 전송할 수 있도록 설계된 API입니다. 이 API는 페이지가 닫히거나 이동할 때도 데이터를 안정적으로 전송할 수 있는 기능을 제공합니다.

  • 페이지 언로드 시에도 데이터 전송 보장: 사용자가 페이지를 닫거나 이동할 때, 일반적인 fetch/XMLHttpRequest는 네트워크 요청이 중단될 수 있습니다. sendBeacon은 브라우저가 백그라운드에서 전송을 끝까지 시도합니다.
  • 비동기적이고, 빠름: 로그, 분석, 트레이스, 세션 종료 이벤트 등 "꼭 서버로 보내야 하는 데이터"에 적합합니다.
  • CORS 지원: Beacon API는 CORS(Cross-Origin Resource Sharing)를 지원하여, 다른 도메인 간의 요청을 처리할 수 있습니다.
  • 데이터 크기 제한: Beacon API는 전송할 수 있는 데이터의 크기에 제한이 있습니다. 일반적으로 64KB 이하의 데이터를 전송할 수 있습니다.
  • 브라우저 호환성: 대부분의 최신 브라우저에서 지원되지만, 일부 오래된 브라우저에서는 지원하지 않을 수 있습니다.
  • 단방향 통신: Beacon API는 서버로 데이터를 전송하는 단방향 통신 방식입니다. 서버에서 응답을 받을 수 없습니다.
  • 형식제한: Beacon API는 JSON, Text 형식의 데이터를 전송합니다. 따라서, 다른 Content-Type은 지원하지 않습니다.

Fetch API

Fetch API는 네트워크 요청을 수행하기 위한 현대적인 API로, XMLHttpRequest의 대체로 사용됩니다. Fetch API는 Promise 기반으로 작동하며, 더 많은 기능과 유연성을 제공합니다.

  • 더 많은 기능: Fetch API는 HTTP 요청에 대한 더 많은 제어를 제공합니다. 예를 들어, 헤더 설정, 요청 메소드 변경, 응답 처리 등 다양한 기능을 지원합니다.
  • Promise 기반: Fetch API는 Promise를 반환하므로, 비동기 처리를 더 쉽게 할 수 있습니다.
  • CORS 지원: Fetch API는 CORS(Cross-Origin Resource Sharing)를 지원하여, 다른 도메인 간의 요청을 처리할 수 있습니다.
  • 데이터 크기 제한 없음: Fetch API는 전송할 수 있는 데이터의 크기에 제한이 없습니다. 따라서, 대용량 데이터를 전송할 때 유용합니다.
  • 브라우저 호환성: Fetch API는 대부분의 최신 브라우저에서 지원되지만, 일부 오래된 브라우저에서는 지원하지 않을 수 있습니다.
  • 양방향 통신: Fetch API는 서버로 데이터를 전송하고, 서버에서 응답을 받을 수 있는 양방향 통신 방식입니다.
  • 형식제한 없음: Fetch API는 JSON, Text, Blob 등 다양한 형식의 데이터를 전송할 수 있습니다. 따라서, Content-Type에 대한 제한이 없습니다.

screenNameOption

(ScreenNameOption, 선택)

화면이름 수집 옵션 입니다.

type ScreenNameType = 'routeOnly' | 'titleOnly' | 'full';

type ScreenNameOption = {
  screenNameType?: ScreenNameType; // default: 'routeOnly'
  urlWithSearchParams?: boolean; // default: false
};
  • screenNameTyperouteOnly, titleOnly, full 중 하나를 선택할 수 있습니다.
    • routeOnly: URL 경로만 포함
    • titleOnly: 페이지 제목만 포함
    • full: 페이지 제목과 URL 경로 모두 포함. 기본값은 routeOnly입니다.
  • urlWithSearchParamstrue일 경우 URL에 쿼리 파라미터를 포함합니다. 기본값은 false입니다. Query 파라미터를 포함하려면 true로 설정합니다.

예시: 화면이름에 타이틀만 포함하고 쿼리 파라미터는 추가하려면 아래와 같이 설정합니다.

IMQA.init({
  collectorUrl: '{{IMQA_TRACES_COLLECTOR_URL}}',
  serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
  serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
  serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
  screenNameOption: {
    screenNameType: 'titleOnly', // 타이틀만 포함
    urlWithSearchParams: true // 쿼리 파라미터 추가
  }
});

instrumentations

(Instrumentations, 선택)

사용자 지정 Instrumentations 설정을 지정합니다. 기본값은 빈 객체 {}이며, 필요에 따라 특정 트래픽 또는 특정 계측을 중단하거나 사용하도록 설정할 수 있습니다.

IMQAOtelWebOptionsInstrumentations 인터페이스는 다양한 계측 모듈의 활성화 여부 및 설정을 정의합니다. 각 속성은 특정 계측 기능을 활성화하거나 비활성화할 수 있으며, 추가적인 설정을 제공할 수 있습니다.

instrumentations 속성 목록
속성 이름타입필수 여부설명
consolebooleanoptional콘솔 계측을 활성화하거나 비활성화합니다.
documentbooleanoptional문서 로드 계측을 활성화하거나 비활성화합니다.
errorsbooleanoptional오류 계측을 활성화하거나 비활성화합니다.
fetchbooleanoptionalFetch API 계측을 활성화하거나 비활성화합니다.
interactionsbooleanoptional사용자 상호작용 계측을 활성화하거나 비활성화합니다.
longtaskbooleanoptional장시간 작업 계측을 활성화하거나 비활성화합니다.
visibilitybooleanoptional페이지 가시성 계측을 활성화하거나 비활성화합니다.
connectivitybooleanoptional네트워크 연결 상태 계측을 활성화하거나 비활성화합니다.
postloadbooleanoptional문서 로드 후 리소스 계측을 활성화하거나 비활성화합니다.
socketiobooleanoptionalSocket.io 클라이언트 계측을 활성화하거나 비활성화합니다.
websocketbooleanoptionalWebSocket 계측을 활성화하거나 비활성화합니다.
webvitalsbooleanoptionalWeb Vitals 계측을 활성화하거나 비활성화합니다.
xhrbooleanoptionalXMLHttpRequest 계측을 활성화하거나 비활성화합니다.
instrumentations 속성 상세 설명
console instrumentation

(boolean 또는 IMQAConsoleInstrumentationConfig, 선택)

콘솔 계측을 활성화하거나 비활성화합니다. true로 설정하면 기본 콘솔 계측이 활성화됩니다. IMQAConsoleInstrumentationConfig 객체를 제공하여 콘솔 계측의 세부 설정을 커스터마이즈할 수 있습니다.

Important순환객체 주의

이 기능을 활성화할 경우 console의 정보를 계측하기 위해 JSON.stringify()를 통해 직렬화됩니다. 만약 순환 객체가 포함되어 있다면, 이 직렬화 과정에서 순환 참조가 발생할 수 있습니다. 따라서, 이 옵션을 활성화 할 경우 순환 참조가 포함된 객체를 로깅할 경우 주의가 필요합니다.

interface IMQAConsoleInstrumentationConfig
  extends InstrumentationConfig {
  betaMode: boolean;
  loggerOptions: LoggerOptions;
  contextManager?: MutableAsyncLocalStorageContextManager;
}
  • betaMode: 콘솔 계측의 베타 모드를 활성화합니다. 기본값은 false입니다.
  • loggerOptions: 콘솔 계측의 로거 옵션을 설정합니다. LoggerOptions 인터페이스를 사용하여 세부 설정을 지정할 수 있습니다.
  • contextManagerMutableAsyncLocalStorageContextManager를 사용하여 비동기 컨텍스트를 관리합니다. 이 매니저는 콘솔 계측의 컨텍스트를 유지하는 데 사용됩니다. AsyncHooksContextManager 참조
document instrumentation

(boolean 또는 IMQADocLoadInstrumentationConfig, 선택)

문서 로드 계측을 활성화하거나 비활성화합니다. true로 설정하면 문서 로드 이벤트가 계측됩니다. IMQADocLoadInstrumentationConfig을 제공하여 계측의 세부 설정을 조정할 수 있습니다.

interface IMQADocLoadInstrumentationConfig
  extends InstrumentationConfig {
  ignoreUrls?: (string | RegExp)[];
}
  • ignoreUrls: 계측하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 계측되지 않습니다.

자세한 계측 정보는 @imqa/intrumentation-document-load 참조

errors instrumentation

(boolean, 선택)

브라우저에서 발생하는 오류 계측을 활성화하거나 비활성화합니다. true로 설정하면 전역 오류 핸들러가 활성화되어 애플리케이션에서 발생하는 오류가 자동으로 계측됩니다.

자세한 계측 정보는 @imqa/instrumentation-browser-exception 참조

Important오류 계측

이 기능은 브라우저에서 발생하는 오류를 계측합니다. 따라서, 서버 혹은 엣지 환경(SSR을 사용하는 경우)에서 발생하는 오류는 계측되지 않습니다. 서버 측에서 발생하는 오류를 계측하려면 별도의 서버측 에이전트를 사용해야 합니다. 이는 IMQA에서 제공하는 기능이 아닙니다.

fetch instrumentation

(boolean 또는 IMQAFetchInstrumentationConfig, 선택)

Fetch API 계측을 활성화하거나 비활성화합니다. true로 설정하면 Fetch 요청이 자동으로 계측됩니다. IMQAFetchInstrumentationConfig을 제공하여 Fetch 계측의 세부 설정을 조정할 수 있습니다.

자세한 계측 정보는 @imqa/instrumentation-fetch 참조

type IMQAFetchInstrumentationConfig = {
  advancedNetworkCapture?: () => boolean;
  clearTimingResources?: boolean;
  propagateTraceHeaderCorsUrls?: web.PropagateTraceHeaderCorsUrls;
  ignoreUrls?: Array<string | RegExp>;
  applyCustomAttributesOnSpan?: FetchCustomAttributeFunction;
  ignoreNetworkEvents?: boolean;
  measureRequestSize?: boolean;
}
  • advancedNetworkCapture: 고급 네트워크 캡처를 활성화합니다. 기본값은 false입니다.
  • clearTimingResources: 타이밍 리소스를 초기화합니다. 기본값은 false입니다.
  • propagateTraceHeaderCorsUrls: CORS 요청에 Trace Header를 전파할 URL 목록을 지정합니다. 기본값은 web.PropagateTraceHeaderCorsUrls입니다.
  • ignoreUrls: 계측하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 계측되지 않습니다.
  • applyCustomAttributesOnSpan: Span에 사용자 정의 속성을 추가하는 함수입니다. 기본값은 undefined입니다.
  • ignoreNetworkEvents: 네트워크 이벤트를 무시합니다. 기본값은 false입니다.
  • measureRequestSize: 요청 크기를 측정합니다. 기본값은 false입니다.
interactions instrumentation

(boolean 또는 IMQAUserInteractionInstrumentationConfig, 선택)

사용자 상호작용 계측을 활성화하거나 비활성화합니다. true로 설정하면 클릭, 입력 등 사용자 상호작용 이벤트가 자동으로 계측됩니다. IMQAUserInteractionInstrumentationConfig을 통해 상호작용 계측의 세부 설정을 커스터마이즈할 수 있습니다.

자세한 계측 정보는 @imqa/instrumentation-user-interaction 참조

interface UserInteractionInstrumentationConfig extends InstrumentationConfig {
    eventNames?: EventName[];
    shouldPreventSpanCreation?: ShouldPreventSpanCreation;
    events?: UserInteractionEventsConfig;
}
  • eventNames: 계측할 이벤트 목록을 지정합니다. 기본값은 DEFAULT_AUTO_INSTRUMENTED_EVENTS입니다.
    • 포인터 이벤트: click, dblclick, mousedown, mouseup
    • Form 이벤트: submit, reset, change
    • Drag & Drop: dragend, drop
    • 미디어 이벤트: ended, pause, play
  • shouldPreventSpanCreation: Span이 생성될 때 호출되는 콜백 함수입니다. true를 반환하면 Span 기록을 방지합니다. 이 핸들러를 사용하여 생성된 Span에 추가 속성을 추가할 수 있습니다.
  • events: 사용자 상호작용 이벤트를 설정합니다. UserInteractionEventsConfig 인터페이스를 사용하여 세부 설정을 지정할 수 있습니다.
type UserInteractionEventsConfig = {
  [type: string]: boolean;
};
const DEFAULT_AUTO_INSTRUMENTED_EVENTS: UserInteractionEventsConfig = {
  // pointer
  click: true,
  dblclick: true,
  mousedown: true,
  mouseup: true,

  // form
  submit: true,
  reset: true,
  change: true,

  // drap & drop
  dragend: true,
  drop: true,

  // media
  ended: true,
  pause: true,
  play: true,
};
longtask instrumentation

(boolean 또는 InstrumentationConfig, 선택)

브라우저 장시간 작업 계측을 활성화하거나 비활성화합니다. true로 설정하면 긴 시간 동안 실행되는 작업이 자동으로 계측됩니다.

자세한 계측 정보는 @imqa/instrumentation-browser-longtask 참조

export interface InstrumentationConfig {
    enabled?: boolean;
}
  • enabled: 계측을 활성화할지 여부를 설정합니다. 기본값은 true입니다.
visibility instrumentation

(boolean 또는 InstrumentationConfig, 선택)

페이지 가시성 계측을 활성화하거나 비활성화합니다. true로 설정하면 페이지의 가시성 상태(포그라운드/백그라운드 변화)가 자동으로 계측됩니다.

자세한 계측 정보는 @imqa/instrumentation-visibility 참조

export interface InstrumentationConfig {
    enabled?: boolean;
}
connectivity instrumentation

(boolean 또는 InstrumentationConfig, 선택)

네트워크 연결 상태 계측을 활성화하거나 비활성화합니다. true로 설정하면 네트워크 상태(온라인/오프라인 변화)가 자동으로 계측됩니다.

자세한 계측 정보는 @imqa/instrumentation-connectivity 참조

export interface InstrumentationConfig {
    enabled?: boolean;
}
postdoc instrumentation

(boolean 또는 IMQAPostDocLoadResourceInstrumentationConfig, 선택)

문서 로드 후 리소스 계측을 활성화하거나 비활성화합니다. true로 설정하면 문서가 완전히 로드된 후 리소스 로딩 이벤트가 자동으로 계측됩니다. 이 계측은 SPA 형태의 웹에서 컴포넌트 단위의 리소스 계측에 유용합니다. IMQAPostDocLoadResourceInstrumentationConfig을 통해 계측의 세부 설정을 커스터마이즈할 수 있습니다.

@imqa/instrumentation-post-document-load 문서 참조

interface IMQAPostDocLoadResourceInstrumentationConfig
  extends InstrumentationConfig {
  allowedInitiatorTypes?: string[];
  ignoreUrls?: (string | RegExp)[];
}
  • allowedInitiatorTypes: 계측할 요청의 이니시에이터 타입을 지정합니다. 기본값은 ["script", "link"]입니다.
  • ignoreUrls: 계측하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 계측되지 않습니다.
socketio instrumentation

(boolean 또는 SocketIoClientInstrumentationConfig, 선택)

Socket.io 클라이언트 계측을 활성화하거나 비활성화합니다. true로 설정하면 Socket.io 클라이언트의 이벤트가 자동으로 계측됩니다. SocketIoClientInstrumentationConfig을 제공하여 계측의 세부 설정을 조정할 수 있습니다.

interface SocketIoClientInstrumentationConfig
  extends InstrumentationConfig {
  target?: string | SocketIOClient;
}
  • target: Socket.io 클라이언트의 타겟 객체를 지정합니다. 기본값은 undefined입니다. 이 값을 설정하면 Socket.io 클라이언트의 이벤트가 자동으로 계측됩니다.
websocket instrumentation

(boolean 또는 IMQAWebSocketInstrumentationConfig, 선택)

WebSocket 계측을 활성화하거나 비활성화합니다. true로 설정하면 WebSocket 연결 이벤트가 자동으로 계측됩니다. IMQAWebSocketInstrumentationConfig을 통해 계측의 세부 설정을 조정할 수 있습니다.

interface IMQAWebSocketInstrumentationConfig extends InstrumentationConfig {
  ignoreUrls?: (string | RegExp)[];
}
  • ignoreUrls: 계측하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 계측되지 않습니다.
webvitals instrumentation

(boolean, 선택)

Web Vitals 계측을 활성화하거나 비활성화합니다. true로 설정하면 Core Web Vitals 지표가 자동으로 계측됩니다.

자세한 계측 정보는 @imqa/instrumentation-webvitals 참조

interface InstrumentationConfig {
  enabled?: boolean;
}
  • enabled: 계측을 활성화할지 여부를 설정합니다. 기본값은 true입니다.
xhr instrumentation

(boolean 또는 IMQAXMLHttpRequestInstrumentationConfig, 선택)

XMLHttpRequest 계측을 활성화하거나 비활성화합니다. true로 설정하면 XMLHttpRequest 요청이 자동으로 계측됩니다. IMQAXMLHttpRequestInstrumentationConfig을 통해 계측의 세부 설정을 조정할 수 있습니다.

자세한 계측 정보는 @imqa/instrumentation-xml-http-request 참조

interface XMLHttpRequestInstrumentationConfig extends InstrumentationConfig {
    clearTimingResources?: boolean;
    propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls;
    ignoreUrls?: Array<string | RegExp>;
    applyCustomAttributesOnSpan?: XHRCustomAttributeFunction;
    ignoreNetworkEvents?: boolean;
    measureRequestSize?: boolean;
    advancedNetworkCapture?: () => boolean;
}
  • clearTimingResources: 타이밍 리소스를 초기화합니다. 기본값은 false입니다.
  • propagateTraceHeaderCorsUrls: CORS 요청에 Trace Header를 전파할 URL 목록을 지정합니다. 기본값은 web.PropagateTraceHeaderCorsUrls입니다.
  • ignoreUrls: 계측하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 계측되지 않습니다.
  • applyCustomAttributesOnSpan: Span에 사용자 정의 속성을 추가하는 함수입니다. 기본값은 undefined입니다.
  • ignoreNetworkEvents: 네트워크 이벤트를 무시합니다. 기본값은 false입니다.
  • measureRequestSize: 요청 크기를 측정합니다. 기본값은 false입니다.
  • advancedNetworkCapture: 고급 네트워크 캡처를 활성화합니다. 기본값은 false입니다.

API

TipIMQA API

IMQA객체는 웹 애플리케이션에서 RUM(Real User Monitoring)과 OpenTelemetry 기능을 초기화하고 관리하는 역할을 담당합니다. 이 객체는 세션 기록, 사용자 행동 추적, 예외 기록 등 다양한 기능을 제공합니다.

IMQA Web Agent를 사용하면 프론트엔드 애플리케이션에서 이벤트를 IMQA로 전송하도록 설정할 수 있습니다. 이를 통해 네트워크 요청과 예외를 백엔드 이벤트와 함께 단일 타임라인에서 확인할 수 있습니다.

아래 내용은 IMQA 객체에 대한 API를 설명합니다. 이 객체는 window.IMQA에 존재합니다. 패키지로 설치한 경우 import IMQA from "@imqa/web-agent"를 통해 객체를 가져올 수 있습니다. 이 IMQA 객체는 계측을 수행중인 중에 커스텀하게 데이터를 수집하거나 앱이 실행되는 중에 발생한 비즈니스 로직에 의한 계측 결과를 추가할 수 있도록 합니다.

init

IMQA.init(config: IMQASDKConfig): void

초기 설정을 통해 IMQA 인스턴스를 초기화합니다. 초기화 설정은 IMQA init을 참고하세요.

  • 매개변수:
    • config (IMQASDKConfig): 초기화 설정을 담은 객체입니다.
      • collectorUrl (string): 콜렉터 주소 (필수)
      • serviceName (string): 서비스 이름 (필수)
      • serviceKey (string): 서비스 키 (필수)
      • serviceVersion (string): 서비스 버전 (필수)
      • 기타 선택적 설정들...

stopSessionRecorder

IMQA.stopSessionRecorder(): void

세션 기록기를 중지합니다.

resumeSessionRecorder

IMQA.resumeSessionRecorder(): void

중지된 세션 기록기를 재개합니다.

addAction

특정 애플리케이션 이벤트(예: 가입, 제출 등)를 명시적으로 추적하기 위해 이벤트 이름과 선택적 이벤트 메타데이터를 포함하여 addAction 함수를 호출할 수 있습니다.

IMQA.addAction(name: string, attributes?: Attributes): void

사용자 행동을 기록합니다.

  • 매개변수:
    • name (string): 행동의 이름
    • attributes (Attributes, 선택 사항): 추가 속성
  • 예시
IMQA.addAction('Form-Completed', {
  formId: 'signup-form',
  formName: 'Signup Form',
  formType: 'signup',
});

recordException

IMQA.recordException(error: any, attributes?: Attributes): void

예외를 기록합니다.

  • 매개변수:
    • error (any): 기록할 예외 객체
    • attributes (Attributes, 선택 사항): 추가 속성

recordLog

사용자 정의 로그를 기록합니다.

  • 매개변수:
    • message (string): 사용자 정의 로그 메시지
    • attributes (Record<string, string>, 선택 사항): 사용자 정의 추가 속성
IMQA.recordLog(message: string, attributes?: Record<string, string>): void

사용방법: 특정 이벤트에 대한 기록을 하고 싶은 경우 (예: API 사용량 초과, 사용자 행동 등) recordLog 함수를 호출하여 로그를 기록할 수 있습니다. 이 로그는 IMQA 대시보드에서 검색 및 필터링할 수 있습니다.

IMQA.recordLog('API 사용량 초과', {
  userId: 'user_123',
  url: 'https://api.imqa.io/usage',
})

userEvent

사용자 이벤트를 추적하고 분석하기 위한 API입니다. 특정 사용자 행동이나 비즈니스 로직의 시작과 끝을 측정하여 전체 duration을 계측할 수 있습니다.

userEvent: {
  start(name?: string, attributes?: Attributes): string;
  end(id: string, attributes?: Attributes): void;
  getActive(): UserEventInstance | undefined;
  cancel(id: string): void;
}

사용자 이벤트는 다음과 같은 주요 메서드를 제공합니다:

  • start(): 사용자 이벤트를 시작하고 고유한 이벤트 ID 반환
  • end(): 지정된 ID의 이벤트를 완료하고 span 기록
  • getActive(): 현재 활성화된 이벤트 정보 반환
  • cancel(): 지정된 ID의 이벤트를 취소 (span 기록 안 함)

자세한 사용 방법은 user event instrumentation 섹션을 참조하세요.

setScreenAttribute

IMQA.setScreenAttribute(name: string): void

IMQA는 기본적으로 화면 이름을 자동으로 수집합니다. 하지만 특정 화면에 대해 더 많은 정보를 제공하고 싶다면 setScreenAttribute 함수를 사용하여 화면 속성을 직접 설정할 수 있습니다. 이 함수는 화면 이름을 지정하고 현재 URL을 전역 변수에 기록합니다.

이 함수는 동적(Dynamic) 방식으로 동작합니다. 즉, 현재 페이지의 URL(location.href)이 변경되지 않는 한, 이 메서드로 설정한 화면 이름을 기준으로 성능을 측정하게 됩니다. 만약 URL이 바뀌게 되면, screenNameOption 설정에 따라 화면 이름이 자동으로 초기화됩니다.

따라서 화면 이름을 지속적으로 유지하면서 정확한 성능 데이터를 수집하려면, URL이 변경되거나 화면 전환이 일어날 때마다 setScreenAttribute 메서드를 다시 호출하는 것이 좋습니다.

이렇게 계측된 각 화면의 성능 데이터는 IMQA의 화면 분석 기능에서 고유한 화면 이름 기준으로 분석됩니다.

자세한 사용 방법은 사용자 가이드 내의 화면 분석 섹션을 참고해주세요.

/**
 * `setScreenAttribute` 함수는 전달된 속성 값을 저장하고, 마지막 URL을 전역 변수에 기록합니다.
 *
 * @param {string} attribute - `attribute` 매개변수는 화면(screen)에 설정하고자 하는 속성을 나타내는 문자열입니다.
 */
function setScreenAttribute(attribute: string) {
  savedScreenAttribute = attribute;
  lastUrl = window?.location?.href;
}

enableAdvancedNetworkCapture

네트워크 캡처를 동적으로 활성화하거나 비활성화하려면 필요에 따라 enableAdvancedNetworkCapture또는 disableAdvancedNetworkCapture함수를 호출하기만 하면 됩니다.

Important네트워크 캡처 활성화

네트워크 캡처를 활성화하면 IMQA가 네트워크 요청을 수집합니다. 이 기능을 활성화 하면 성능 모니터링 및 디버깅에 유용하지만, bodyheader에 담긴 민감한 정보가 함께 계측합니다. 개인 정보 보호 및 보안 요구 사항을 준수해야 합니다. 사용하기 전에 관련 법률 및 규정을 확인하세요.

IMQA.enableAdvancedNetworkCapture(): void

disableAdvancedNetworkCapture

네트워크 캡처를 동적으로 활성화하거나 비활성화하려면 필요에 따라 enableAdvancedNetworkCapture또는 disableAdvancedNetworkCapture함수를 호출하기만 하면 됩니다.

IMQA.disableAdvancedNetworkCapture(): void

setGlobalAttributes

메타 데이터는 계측하는데 필요한 추가 정보를 제공합니다. 이는 클라이언트 세션 중 언제든지 호출할 수 있습니다. 현재 클라이언트 세션과 호출 이후의 모든 이벤트는 메타 데이터와 연결됩니다.

다른 추가 값들은 이벤트 검색에 사용할 수 있도록 지정할 수 있습니다.

IMQA.setGlobalAttributes(attributes: Record<string, string>): void

전역 속성을 설정합니다.

  • 매개변수:
    • attributes (Record<string, string>): 설정할 전역 속성 객체
  • 예시
IMQA.setGlobalAttributes({
  teamName: "your-team-name",
  groupName: "your-group-name",
  // 기타 사용자 지정 속성...
});

setUserIdAttribute

사용자 ID를 추가하면 IMQA에서 세션과 이벤트를 검색/필터링할 수 있습니다. 이는 클라이언트 세션 중 언제든지 호출할 수 있습니다. 현재 클라이언트 세션과 호출 이후의 모든 이벤트는 사용자 ID와 연결됩니다.

setUserIdAttribute(userId: string): void

(userId: string) => void

사용자 ID 속성을 설정합니다.

  • 매개변수:
    • userId (string): 사용자 ID
window.IMQA.setUserIdAttribute("_imqa_user_0001");

커스텀 사용자 ID를 지정하여 특정 사용자의 세션 분석 시 활용할 수 있습니다.

image.png

setAreaCodeAttribute

setAreaCodeAttribute(areaCode: string): void

지역 코드 속성을 설정합니다.

  • 매개변수:
    • areaCode (string): 지역 코드

userEvent

사용자 이벤트를 추적하고 분석하기 위한 API입니다. 특정 사용자 행동이나 비즈니스 로직의 시작과 끝을 측정하여 전체 duration을 계측할 수 있습니다.

userEvent.start

IMQA.userEvent.start(name?: string, attributes?: Attributes): string

사용자 이벤트를 시작하고 고유한 이벤트 ID를 반환합니다. 이 시점부터 발생하는 모든 계측(fetch, console, exception 등)이 이 이벤트의 컨텍스트로 그룹화됩니다.

  • 매개변수:
    • name (string, optional): 이벤트 이름 (기본값: user-event-[randomId])
    • attributes (Attributes, optional): 이벤트에 추가할 커스텀 속성
  • 반환값: 이벤트의 고유 식별자 (string)

userEvent.end

IMQA.userEvent.end(id: string, attributes?: Attributes): void

지정된 ID의 사용자 이벤트를 완료하고 span을 기록합니다. 전체 duration이 자동으로 계산되어 기록됩니다.

  • 매개변수:
    • id (string, required): start()에서 반환된 이벤트 ID
    • attributes (Attributes, optional): 이벤트 완료 시 추가할 속성

userEvent.getActive

IMQA.userEvent.getActive(): UserEventInstance | undefined

현재 활성화된 사용자 이벤트 정보를 반환합니다.

  • 반환값: 활성 이벤트 인스턴스 또는 undefined

userEvent.cancel

IMQA.userEvent.cancel(id: string): void

지정된 ID의 사용자 이벤트를 취소합니다. span을 기록하지 않습니다.

  • 매개변수:
    • id (string, required): 취소할 이벤트 ID

고급 API

사용자 이벤트는 복잡한 워크플로우를 위한 추가 메서드들을 제공합니다:

  • with(id, fn): 특정 이벤트 컨텍스트에서 함수 실행
  • withActive(fn): 현재 활성 이벤트 컨텍스트에서 함수 실행
  • switchTo(id): 특정 이벤트로 컨텍스트 전환
  • getActiveContext(): 현재 활성 컨텍스트 반환
  • hasActiveUserEvent(): 활성 이벤트 존재 여부 확인
  • getContext(id): 특정 이벤트의 컨텍스트 반환

자세한 내용은 사용자 이벤트 계측 문서를 참조하세요.

사용 예시

// 버튼 클릭 이벤트 추적
function handleButtonClick() {
  // 이벤트 시작
  const eventId = IMQA.userEvent.start('button-click', {
    'button.name': 'submit',
    'page.url': window.location.href,
  });

  // 비즈니스 로직 실행
  performBusinessLogic()
    .then(result => {
      // 성공 시 이벤트 완료
      IMQA.userEvent.end(eventId, {
        'action.result': 'success',
        'items.count': result.count,
      });
    })
    .catch(error => {
      // 에러 시 이벤트 완료
      IMQA.userEvent.end(eventId, {
        'action.result': 'error',
        'error.message': error.message,
      });
    });
}

// 폼 제출 이벤트 추적
function handleFormSubmit() {
  const eventId = IMQA.userEvent.start('form-submission', {
    'form.type': 'contact',
    'form.fields': 'name,email,message',
  });

  try {
    validateForm();
    submitForm();

    IMQA.userEvent.end(eventId, {
      'submission.result': 'success',
    });
  } catch (error) {
    IMQA.userEvent.end(eventId, {
      'submission.result': 'error',
      'error.type': error.constructor.name,
    });
    throw error;
  }
}

// 이벤트 취소 예시
function handleCancellableOperation() {
  const eventId = IMQA.userEvent.start('file-upload');

  // 사용자가 취소한 경우
  if (userCancelled) {
    IMQA.userEvent.cancel(eventId);
    return;
  }

  // 정상 처리
  uploadFile().then(() => {
    IMQA.userEvent.end(eventId);
  });
}

getSessionId

getSessionId(): string | undefined

현재 세션의 ID를 반환합니다.

  • 반환값: (string | undefined): 세션 ID 또는 정의되지 않음
const sessionId = IMQA.getSessionId();

getSessionUrl

getSessionUrl(): string | undefined

세션 URL을 생성하여 반환합니다.

  • 반환값: (string | undefined): 세션 URL 또는 정의되지 않음

attachToReactErrorBoundary

React를 사용하는 경우, React error boundary 내에서 발생하는 오류를 자동으로 캡처하기 위해 error boundary 컴포넌트를 attachToReactErrorBoundary 함수에 전달할 수 있습니다.

// ErrorBoundary를 가져옵니다 (react-error-boundary를 예제로 사용) 
import { ErrorBoundary } from 'react-error-boundary';
 
// 여기서 ErrorBoundary 컴포넌트에 연결되어
// 해당 컴포넌트 내에서 발생하는 모든 오류를 감지합니다.
IMQA.attachToReactErrorBoundary(ErrorBoundary);
attachToReactErrorBoundary(errorBoundary: ErrorBoundaryComponent): void
  • 매개변수:
    • errorBoundary (ErrorBoundaryComponent): 연결할 Error Boundary 컴포넌트
  • 예시
// ErrorBoundary 가져오기 (예시로 react-error-boundary를 사용)
import { ErrorBoundary } from 'react-error-boundary';

// ErrorBoundary 컴포넌트에 연결하여 모든 인스턴스에서 발생하는 오류를 캡처합니다.
IMQA.attachToReactErrorBoundary(ErrorBoundary);

CORS 요청에 대한 리소스 타이밍 활성화

프론트엔드 애플리케이션이 다른 도메인으로 API 요청을 하는 경우, 선택적으로 요청과 함께 Timing-Allow-Origin 헤더를 보내도록 활성화할 수 있습니다. 이를 통해 IMQA는 PerformanceResourceTiming을 통해 DNS 조회, 응답 다운로드 등과 같은 요청에 대한 상세한 리소스 타이밍 정보를 캡처할 수 있습니다.

expresscors 패키지를 사용하는 경우, 다음 코드를 사용하여 헤더를 활성화할 수 있습니다:

var cors = require('cors');
var onHeaders = require('on-headers');

// ... 기타 코드

app.use(function (req, res, next) {
  onHeaders(res, function () {
    var allowOrigin = res.getHeader('Access-Control-Allow-Origin');
    if (allowOrigin) {
      res.setHeader('Timing-Allow-Origin', allowOrigin);
    }
  });
  next();
});
app.use(cors());

WebView 연동

IMQA Web Agent는 모바일 네이티브 파라미터를 WebView와 연동하여 사용할 수 있습니다. 이를 통해 네이티브 앱과 웹 애플리케이션 간의 데이터 공유 및 통합된 사용자 경험을 제공합니다.

네이티브 앱에서 WebView를 통해 IMQA Web Agent를 사용할 때, 다음과 같은 파라미터를 자동으로 전달합니다.

  • __imqa_service_name: 서비스 이름
  • __imqa_service_version: 서비스 버전
  • __imqa_service_key: 서비스 키
  • __imqa_service_type: 서비스 타입 (기본값: web)
  • __imqa_session_id: 세션 ID
  • __imqa_collector_url: 콜렉터 URL
  • __imqa_deactivated: IMQA Web Agent 비활성화 여부 (기본값: false), 비활성화인 경우 IMQA Web Agent는 작동하지 않습니다.
  • __imqa_shared_session: 세션 및 서비스 파라미터 공유 여부 (기본값: true), 비활성화인 경우 init에서 설정한 값을 사용합니다.
  • __imqa_service_namespace: 서비스 네임스페이스
  • __imqa_deployment_environment_name: 배포 환경 이름

네이티브에서 사용하는 웹뷰는 네이티브 SDK에서 파라미터를 웹뷰에 자동으로 전달합니다. IMQA Web Agent는 이를 자동으로 감지하여 파라미터를 사용합니다. 이 설정은 IMQA Web Agent의 초기화 과정에서 자동으로 처리됩니다.

웹 브라우저 단독으로 사용할 때는 웹뷰 파라미터를 적용받지 않고 init에 설정된 값을 사용합니다.

예제 프로그램

index.html을 열고 아래 코드를 추가합니다. 만약 내부망 이슈로 인해 적절한 collector 주소가 설정되어 있지 않은 경우 오류가 발생하지만 브라우저 inspection 도구의 network 탭에서 Trace와 Log 데이터를 직접 확인해 볼 수 있습니다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>IMQA Agent Test Example</title>
    <script
      src="https://cdn.imqa.io/release/npm/@web-agent/latest/index.js"
      crossorigin="anonymous">
    </script>
    <script>
      IMQA.init({
        collectorUrl: "https://in-otel.imqa.io",
        serviceName: "your-service-name",
        serviceKey: "YOUR_SERVICE_KEY",
        serviceVersion: "1.0.0"
      });
    </script>
  </head>
  <body>
    <h1>IMQA Agent Test Example</h1>
    <button id="work-btn">Do Work</button>
    <button id="error-btn">Throw Error</button>
    <button id="fetch-btn">Fetch Data</button>
    <button id="xhr-btn">XHR</button>
    <p>Click the buttons to test IMQA tracing and error reporting.</p>
  </body>
  <script>
    // console instrumentation
    function doWork() {
      console.log("Work is done and span is ended");
    }
    // error instrumentation
    function throwError() {
      throw new Error("Test Error");
    }
    // xhr instrumentation
    function xhrBtn() {
      console.log("xhrBtn");
      const xhr = new XMLHttpRequest();
      xhr.open("GET", "https://jsonplaceholder.typicode.com/todos/1");
      xhr.onload = function () {
        if (xhr.status === 200) {
          console.log(xhr.response);
        }
      };
      xhr.send();
    }
    // fetch instrumentation
    function fetchBtn() {
      console.log("fetchBtn");
      fetch("https://jsonplaceholder.typicode.com/todos/1")
        .then(function (response) {
          return response.json();
        })
        .then(function (json) {
          console.log(json);
        });
    }
    // Attach event handlers
    window.onload = () => {
      document.getElementById("work-btn").addEventListener("click", () => {
        doWork();
      });
      document.getElementById("error-btn").addEventListener("click", () => {
        throwError();
      });
      document.getElementById("xhr-btn").addEventListener("click", () => {
        xhrBtn();
      });
      document.getElementById("fetch-btn").addEventListener("click", () => {
        fetchBtn();
      });
    };
  </script>
</html>

IMQA Web Agent 지원사항

IMQA Web Agent 브라우저 및 프레임워크 지원 사항

권장 브라우저

브라우저최소 버전주요 지원 기능
Chrome60+모든 계측 기능 지원 (Console, Document Load, Fetch, WebSocket, WebVitals, XHR, User Interaction, Visibility, Connectivity, LongTask, Browser Exception)
Firefox55+모든 계측 기능 지원 (Console, Document Load, Fetch, WebSocket, WebVitals, XHR, User Interaction, Visibility, Connectivity, LongTask, Browser Exception)
Safari11+모든 계측 기능 지원 (Console, Document Load, Fetch, WebSocket, WebVitals, XHR, User Interaction, Visibility, Connectivity, LongTask, Browser Exception)
Edge80+모든 계측 기능 지원 (Console, Document Load, Fetch, WebSocket, WebVitals, XHR, User Interaction, Visibility, Connectivity, LongTask, Browser Exception)

지원되는 레거시 브라우저

브라우저지원 버전제한사항
Internet Explorer11Fetch API 미지원, WebSocket 지원 불완전, Socket.IO 제한, WebVitals 미지원
Chrome~52Fetch API 제한, WebSocket 제한, Socket.IO 제한, WebVitals 제한
Safari~11Fetch API 제한, WebSocket 제한, Socket.IO 제한, WebVitals 제한
Firefox~57Fetch API 제한, WebSocket 제한, Socket.IO 제한, WebVitals 제한
Edge~79Fetch API 제한, WebSocket 제한, Socket.IO 제한, WebVitals 제한

지원되지 않는 브라우저

브라우저버전미지원 사유
Internet Explorer10 이하모든 계측 기능 미지원
Chrome51 이하모든 계측 기능 미지원
Safari10 이하모든 계측 기능 미지원
Firefox56 이하모든 계측 기능 미지원
Edge78 이하모든 계측 기능 미지원
Android Browser4.4 이하모든 계측 기능 미지원
Opera Mini-모든 계측 기능 미지원
UC Browser-모든 계측 기능 미지원

WebView 환경에 IMQA Web Agent 지원 사항

지원되는 WebView

플랫폼WebView최소 버전
iOSWKWebViewiOS 13+
AndroidWebViewAndroid 7.0+

주요 제한사항

제한 유형제한 사항세부 내용
JavaScript 제한eval() 사용 제한-
window.open() 제한-
fetch API 제한-
네트워크 제한CORS 제한-
HTTPS 강제-
특정 호스트 접근 제한-
보안 제한CSP 제한Content Security Policy 제한
HTTPS 인증서 검증-
웹소켓 연결 제한-

플랫폼별 특수 제한

플랫폼제한 사항
iOS WKWebVieweval() 사용 시 보안 경고 발생, fetch API의 CORS 문제, 쿠키 동기화 문제
Android WebViewJavaScript 실행 권한 설정 필요, 네트워크 요청 타임아웃, 캐시 처리 문제

권장 설정

설정 유형권장 설정
JavaScript 설정JavaScript 실행 권한 활성화, eval() 사용 허용, window.open() 허용
네트워크 설정CORS 허용, HTTPS 인증서 검증 비활성화, 타임아웃 설정
보안 설정CSP 설정, 쿠키 동기화 설정, 캐시 설정
ImportantWarning
  • WebView의 설정은 앱 개발자에 의해 제한될 수 있습니다
  • 모든 WebView 환경에서 동일한 동작을 보장할 수 없습니다
  • WebView의 버전에 따라 동작이 다를 수 있습니다

IMQA Web Agent 프레임워크 지원 사항

지원되는 프레임워크

프레임워크최소 버전주요 지원 기능
Vue.js2.6+Vue 2.6+, Vue 3.x, Vuex, Vue Router 지원
Angular8+Angular 8+, Zone.js 0.11.4, RxJS 지원
Next.js9+-
Nuxt.js2+-
Remix--
Svelte3+-
SvelteKit--

지원되지 않는 프레임워크/환경

프레임워크/환경버전미지원 사유
jQuery 기반 프레임워크-모든 계측 기능 미지원
서버 사이드 렌더링(SSR)-모든 계측 기능 미지원
Backbone.js-구형 프레임워크로 인한 미지원
Ember.js3.x 이하구형 프레임워크로 인한 미지원
Vue.js1.x구형 프레임워크로 인한 미지원
AngularJS1.x구형 프레임워크로 인한 미지원

package manager로 설치하여 사용하기 위한 필수 기술 요구사항

TipTip

npm, yarn, pnpm, bun 등의 패키지 매니저로 @imqa/web-agent 를 설치하여 사용할 수 있는 환경에서의 기술 요구사항입니다. CDN 설치 방식에서는 이 항목은 해당되지 않습니다.

필수 기술 요구사항 및 지원 기능

요구사항 유형필수 기능
JavaScript 기능ES6+ 문법, Promise, async/await, Fetch API 지원
Web APIWebSocket, Performance API, MutationObserver, IntersectionObserver 지원
모듈 시스템CommonJS (index.js), ES Modules (index.mjs), TypeScript 타입 정의 (index.d.ts)

권장 사항

항목권장 내용
브라우저최신 브라우저 버전 사용
개발 언어TypeScript 사용
프레임워크모던 프레임워크 사용 (Vue, Angular, Next)
프로토콜HTTPS 프로토콜 사용

기타

  • TypeScript를 사용하는 경우 타입 정의 파일(index.d.ts)을 활용하시기 바랍니다
  • UMD 번들은 전역 객체 IMQA를 통해 접근할 수 있습니다

이 문서는 @imqa/web-agent 패키지의 현재 버전(NPM Version)을 기준으로 작성되었으며, 향후 업데이트에 따라 변경될 수 있습니다.