Browser SDK 설치 가이드
Sophonz Browser SDK는 Opentelemetry Native 기반으로 동작합니다. 이 문서는 웹프론트엔드 (VanillaJS, React, Nextjs등) 프레임워크에서 동작하며 웹성능 지표를 수집하기 위한 데이터 구조를 설명합니다.
Sophonz Browser SDK는 Opentelemetry Native 기반으로 동작합니다. 이 문서는 웹프론트엔드 (VanillaJS, React, Vue, Nextjs등) 프레임워크에서 동작하며 웹성능 지표를 수집하기 위한 에이전트 설치 및 설정 방법을 설명합니다.
프론트엔드 모니터링
웹 프론트엔드 성능 모니터링은 사용자 경험을 개선하고 웹 애플리케이션의 성능을 최적화하는 데 중요한 역할을 합니다. Sophonz를 사용하면 표준화된 방식으로 성능 데이터를 수집하고 분석할 수 있습니다.
수집된 데이터를 바탕으로 다음과 같은 최적화를 수행할 수 있습니다:
- 느린 API 호출 식별 및 최적화
- 클라이언트 사이드 렌더링 성능 개선
- 자주 발생하는 오류 해결
주요 기능
- XMLHttpRequest 및 Fetch API 자동 계측
- 네트워크 요청 및 응답의 상세 추적
- WebSocket 및 Socket.IO 계측
- 사용자 상호작용 (클릭, 마우스 이벤트, 드래그 등)
- Document load, Fetched resources
- History API 및 해시 변경 지원
- 웹 바이탈(Web Vitals) 자동 수집
- 세션 ID를 통한 행동분석
- 자동 컨텍스트 연결을 통한 longtasks 수집
- 에러 수집: uncaught exceptions, unhandled rejections, document errors, console errors
- Timer, Promise, Native async-await, 이벤트, 옵저버 등을 통한 자동 컨텍스트 유지
- SPA (Single Page Application) 지원
- 컴포넌트 전환 시 Post Document Load 이벤트 자동 계측
- 페이지 가시성, 네트워크 연결성 자동 계측
- 사용자 정의 속성 추가
- 사용자 ID
- 사용자 지역
- 수동 계측 지원
- 커스텀 데이터 수집 지원(커스텀 로그, 커스텀 에러)
- 사용자 이벤트 추적 및 분석 (@sophonz/user-event)
- 세션 리플레이 (Session Replay) 기능 (beta)
- DOM 변경 사항 기록
- 사용자 입력 및 상호작용 기록
- 스크린샷 캡처
- Sophonz Mobile SDK(Android, iOS)와 연동하여 네이티브 앱과 웹뷰 환경 계측 지원
- 네이티브 환경과 웹뷰 환경 컨텍스트 자동 연결
- 레거시 브라우저 지원 (IE11, Chrome 52, Edge Legacy 79, Safari 11, Firefox 57 등)
빠른 설치
CDN을 통한 설치
웹사이트에서 Sophonz로 계측을 시작하는 가장 쉬운 방법은 아래 코드를 <head></head> 태그 내부에 추가하는 방법입니다:
최신 버전
Sophonz에서 제공하는 최신의 기능을 사용하려면 아래 코드를 사용하세요. 이 코드는 항상 최신 버전을 사용합니다.
Sophonz 관리 계정 로그인 후 글로벌 관리 > 서비스 관리에서 새로운 서비스를 등록하고 발급된 서비스 키를 사용하여 설치하세요.
<script src="https://cdn.sophonz.com/release/npm/@browser-sdk/latest/index.js">
</script>
<script>
window.Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
});
</script>
serviceName은 서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.
특정 버전
특정 버전을 사용하기 위한 설치 코드는 아래와 같습니다. {{VERSION}} 부분을 사용하려는 버전으로 대체하세요. 사용가능한 버전과 릴리즈 노트는 릴리즈 노트에서 확인할 수 있습니다.
<script
src="https://cdn.sophonz.com/release/npm/@browser-sdk/{{VERSION}}/index.js"
integrity="{{VERSION_SRI_HASH_INTEGRITY}}"
crossorigin="anonymous">
</script>
<script>
window.Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
});
</script>
Sophonz SDK 지원하는 모든 옵션은 설정을 참조해주세요. collectorUrl, serviceName, serviceKey, serviceVersion을 올바르게 제공하면 웹사이트가 준비되며 다른 필수 작업은 필요하지 않습니다. 수집된 추적 정보를 지정된 Sophonz 수집기로 전송합니다.
NPM 을 통한 설치
https://www.npmjs.com/package/@sophonz/browser-sdk
다른 옵션은 프로젝트 내에서 이 라이브러리를 번들로 묶고 초기화하는 것입니다. 프로젝트 디렉토리 내에서 npm install @sophonz/browser-sdk를 실행하세요.
에이전트는 다른 기능보다 우선적으로 초기화되어야 관련 정보들을 수집할 수 있습니다.
import Sophonz from '@sophonz/browser-sdk';
Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
});
폐쇄망 설치
Web앱과 WebView에서 모두 적용 가능하며, 아래 설치 방법 중 하나를 선택하여 진행합니다.
서비스 키 발급 Sophonz 관리자 계정 로그인 → 글로벌 관리 > 서비스 관리에서 서비스 등록 후 키 발급 모든 설치 완료 후 계측은 자동으로 수행되며, 커스텀 데이터 수집 등 추가 사용법은 Sophonz Browser SDK API 문서 참고
Option 1: 폐쇄망에서 직접 다운로드 후 스크립트 추가
- 폐쇄망에서는 CDN을 통해 직접 실행할 수 없으므로 인터넷이 연결된 환경에서 미리 번들링된 자바스크립트 파일을 다운로드를 받습니다.
- 다운로드된
index.js파일을 적절한 이름sophonz-sdk.js로 변경하여 프로젝트 내부에 포함 시킵니다. 아래 예시는 프로젝트내public폴더 내에 위치하고 있다고 가정합니다. - 아래 코드와 같이
<head>태그 안에 추가합니다.
<script src="./public/sophonz-sdk.js">
</script>
<script>
window.Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_SERVICE}}'
});
</script>
serviceName은 서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.
collectorUrl,serviceName,serviceVersion,serviceKey값은 필수값입니다.
- 모든 준비가 완료되었습니다. 이후 모든 계측은 자동으로 수행됩니다. 계측을 수행중인 중에 커스텀하게 데이터를 수집하거나 앱이 실행되는 중에 발생한 비즈니스 로직에 의한 계측 결과를 추가할 수 있도록 하려면 Sophonz Browser SDK API를 참조해주세요.
Option 2: npm 또는 yarn등으로 설치 후 초기화
- Web App 프로젝트에
@sophonz/browser-sdk패키지를 설치합니다. 현재 stable 배포버전은입니다.
npm
npm install @sophonz/browser-sdk
yarn
yarn add @sophonz/browser-sdk
- Web App 프로젝트 entry point 에
@sophonz/browser-sdk를 import 하고, init으로 Sophonz를 초기화 합니다. 여기서는 React와 Vuejs 2의 예시를 들었습니다.
- React
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { App } from "./my-app";
import Sophonz from "@sophonz/browser-sdk";
Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_SERVICE}}'
});
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 Sophonz from "@sophonz/browser-sdk"; // Sophonz agent
Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_SERVICE}}'
});
const app = new Vue({
router,
store,
render: (h) => h(App),
}).$mount("#app");
serviceName은 서비스 등록 시 입력한 패키지명과 동일해야 하며 패키지 이름에는 a-z, A-Z, 0-9, -, _, .만 입력할 수 있습니다.
collectorUrl,serviceName,serviceVersion,serviceKey값은 필수값입니다.
- 모든 준비가 완료되었습니다. 이후 모든 계측은 자동으로 수행됩니다. 계측을 수행중인 중에 커스텀하게 데이터를 수집하거나 앱이 실행되는 중에 발생한 비즈니스 로직에 의한 계측 결과를 추가할 수 있도록 하려면 Sophonz Browser SDK API 문서를 참조해주세요.
Option 3: 폐쇄망에서 package.json에 직접 의존성 추가
Sophonz-browser-sdk-latest.tgz파일 다운로드
https://cdn.sophonz.com/release/npm/@browser-sdk/latest/Sophonz-browser-sdk-latest.tgz
- 프로젝트 내부 적절한 경로에 배치 후
npm install /path/to/Sophonz-browser-sdk-latest.tgz
npm install /path/to/Sophonz-browser-sdk-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
│ └── Sophonz
│ └── Sophonz-browser-sdk-latest.tgz
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
아래와 같이 설치합니다.
npm install ./third-pary-packages/Sophonz/Sophonz-browser-sdk-latest.tgz
- 이후 2안과 같이 설정 진행하면 됩니다.
Option 4: npm install 을 사용할 수 없는 경우
Sophonz-browser-sdk-latest.tgz파일 다운로드 후 압축 해제
https://cdn.sophonz.com/release/npm/@browser-sdk/latest/Sophonz-browser-sdk-latest.tgz
- 프로젝트
node_modules/@sophonz/browser-sdk폴더에 압축해제된package내의 파일들을 복사합니다.
node_modules/@sophonz/browser-sdk
├── CHANGELOG.md
├── README.md
├── build
│ ├── index.d.ts
│ ├── index.js
│ └── sri-hash.txt
└── package.json
- 프로젝트의
package.json을 열고dependencies에"@sophonz/browser-sdk": "latest"를 추가합니다. - 이후 2안과 같이 설정 진행하면 됩니다.
레거시 브라우저 설치 (Support IE11)
Sophonz Browser SDK는 레거시 브라우저를 제한적으로 지원합니다. 제한적으로 지원되는 레거시 브라우저 참조.
Internet Explorer 11 에서 테스트 되었습니다.
패키지 매니저로 설치
- 패키지 매니저(
npm,yarn,pnpm,bun등)로 설치한 경우,@sophonz/browser-sdk패키지를 설치합니다.
npm install @sophonz/browser-sdk
- 아래와 같이
@sophonz/browser-sdk/legacy를 import하여 사용합니다.
import Sophonz from "@sophonz/browser-sdk/legacy";
Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
// 기타 설정...
});
umd 포맷으로 번들링이 되어 있어 commonjs, amd, iife 등 다양한 환경에서 사용할 수 있습니다.
CDN 혹은 로컬 설치
- CDN 혹은 로컬
js파일을 HTML에 추가합니다. 아래 예시에서는index.html파일에 Sophonz Browser SDK의 CDN 경로를 추가하고 초기화 합니다. 폐쇄망의 경우 자세한 설치 및 설정은 폐쇄망 설치 섹션을 참고하세요.
<script
src="https://cdn.sophonz.com/release/npm/@browser-sdk/latest/index-legacy.js"
type="text/javascript"></script>
<script>
window.Sophonz.init({
collectorUrl: '{{SOPHONZ_COLLECTOR_URL}}',
serviceName: '{{NAME_OF_YOUR_WEB_SERVICE}}',
serviceVersion: '{{VERSION_OF_YOUR_WEB_SERVICE}}',
serviceKey: '{{KEY_OF_YOUR_WEB_SERVICE}}'
// 기타 설정...
});
</script>
index-legacy.js 자바스크립트 파일은 레거시 브라우저에서 사용할 수 있도록 번들링된 파일입니다. 이 파일은 첨부된 파일을 압축해제하여 build 폴더에 있는 index-legacy.js 파일을 프로젝트에 추가하여 사용할 수 있습니다.
Sophonz-browser-sdk-latest.tgzstable 배포버전 파일 다운로드https://cdn.sophonz.com/release/npm/@browser-sdk/latest/Sophonz-browser-sdk-latest.tgz
특정 버전의 설치는 버전 @browser-sdk/{VERSION}을 사용하여 설치합니다. 지원되는 버전은 1.0.0 이상입니다. 이후 Sophonz를 초기화하는 코드는 동일합니다. 설정이 완료되면 모든 계측이 자동으로 수행됩니다.
소스맵 업로드 (Vite)
@sophonz/vite-sourcemap 플러그인
Vite를 사용하는 프로젝트에서 빌드 후 소스맵을 자동으로 Sophonz 서버로 업로드할 수 있습니다. 이를 통해 프로덕션 환경에서 발생한 에러의 원본 소스코드 위치를 정확하게 추적할 수 있습니다.
주요 기능
- ✅ Vite 빌드 완료 후 소스맵 자동 업로드
- ✅ 멀티파트 폼 데이터로 파일 업로드
- ✅ 포함/제외 패턴으로 파일 필터링
- ✅ gzip 압축 지원
- ✅ 동시 업로드 제한 및 재시도 로직
- ✅ CI 환경 감지
- ✅ 업로드 후 로컬 소스맵 파일 삭제 옵션
설치
npm install @sophonz/vite-sourcemap --save-dev
기본 설정
// vite.config.ts
import { defineConfig } from 'vite'
import sourcemapUpload from '@sophonz/vite-sourcemap'
export default defineConfig({
build: {
sourcemap: true, // 중요: 소스맵 생성을 활성화해야 합니다
},
plugins: [
sourcemapUpload({
endpoint: 'https://api.sophonz.com/api/sourcemaps',
apiKey: process.env.SOURCEMAP_API_KEY,
release: process.env.GIT_SHA,
appVersion: process.env.npm_package_version,
}),
],
})
고급 설정 옵션
| 옵션 | 타입 | 기본값 | 설명 |
|---|---|---|---|
endpoint | string | - | (필수) 소스맵을 업로드할 API 엔드포인트 |
method | 'POST' | 'PUT' | 'POST' | HTTP 메서드 |
apiKey | string | - | Bearer 토큰 또는 API 키 |
release | string | - | 릴리즈 식별자 (예: git SHA) |
appVersion | string | - | 앱 버전 (semver) |
build | string | - | 빌드 번호 또는 CI 빌드 ID |
include | (string | RegExp)[] | - | 포함할 파일 패턴 |
exclude | (string | RegExp)[] | - | 제외할 파일 패턴 |
urlPrefix | string | - | 업로드 파일명에 추가할 접두사 |
transformPath | (path: string) => string | - | 경로 변환 함수 |
concurrency | number | 6 | 동시 업로드 수 |
retries | number | 3 | 재시도 횟수 |
gzip | boolean | true | gzip 압축 사용 여부 |
deleteAfterUpload | boolean | false | 업로드 후 로컬 파일 삭제 |
ciOnly | boolean | false | CI 환경에서만 실행 |
verbose | boolean | CI에서 true | 상세 로그 출력 |
사용 예시
// vite.config.ts
import sourcemapUpload from '@sophonz/vite-sourcemap'
export default defineConfig({
build: {
sourcemap: true,
},
plugins: [
sourcemapUpload({
// 필수: 업로드 엔드포인트
endpoint: 'https://api.sophonz.com/api/sourcemaps',
// 인증
apiKey: process.env.Sophonz_AUTH_TOKEN,
// 릴리즈 정보
release: process.env.Sophonz_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 환경을 자동으로 감지합니다:
CIGITHUB_ACTIONSGITLAB_CIBUILDKITECIRCLECITRAVISBITBUCKET_BUILD_NUMBER
verbose: true 옵션을 사용하면 업로드 과정을 상세하게 확인할 수 있습니다. 소스맵이 성공적으로 업로드되면 프로덕션 환경에서 발생한 에러의 정확한 소스 코드 위치를 확인할 수 있습니다.
설정 (Options)
| 옵션 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
collectorUrl | string | optional | 콜렉터 주소를 지정합니다. 기본값은 https://in-otel.sophonz.com입니다. |
authorizationToken | string | optional | 인증 토큰을 설정합니다. |
serviceName | string | optional | 서비스 이름을 지정합니다. (서비스 등록할 때의 패키지명) 텔레메트리 데이터 저장에 필수적입니다. |
serviceKey | string | optional | 서비스 키를 설정합니다. 텔레메트리 데이터 저장에 필수적입니다. |
serviceVersion | string | optional | 서비스 버전을 지정합니다. 텔레메트리 데이터 저장에 필수적이며, 빈 문자열이나 비문자열일 경우 경고가 발생합니다. |
deploymentEnvironment | string | optional | 배포 환경을 설정합니다. setGlobalAttributes()를 통해 지속되는 environment 속성의 값을 설정할 수 있습니다. |
defaultAttributes | Attributes | optional | 기본 리소스 속성을 설정합니다. 모든 Span에 추가되는 전역 속성으로 사용됩니다. |
samplingProbability | number | string | optional | 샘플링 확률을 설정합니다. 0에서 1 사이의 값으로 지정하며, 기본값은 1입니다. |
advancedNetworkCapture | boolean | optional | 네트워크 요청 및 응답의 상세 추적을 활성화합니다. 기본값은 false입니다. |
blockClass | string | optional | 세션 리플레이에서 가려야 할 요소의 CSS 클래스를 지정합니다. |
consoleCapture | boolean | optional | 콘솔 캡처 기능을 활성화합니다. 기본값은 false입니다. |
debug | boolean | optional | 디버깅 모드를 활성화합니다. 기본값은 false입니다. |
disableIntercom | boolean | optional | Intercom 연동을 비활성화합니다. 기본값은 false입니다. |
disableReplay | boolean | optional | 세션 리플레이 기능을 비활성화합니다. 기본값은 true입니다. |
ignoreClass | string | optional | 세션 리플레이에서 무시할 요소의 CSS 클래스를 지정합니다. |
ignoreUrls | Array<string | RegExp> | optional | 추적하지 않을 URL 패턴을 지정합니다. 정규식이나 문자열 배열로 설정할 수 있으며, 부분 일치 또는 정확히 일치하는 URL은 추적되지 않습니다. |
instrumentations | Instrumentations | optional | 사용자 지정 Instrumentations 설정을 지정합니다. 기본값은 빈 객체 {}입니다. |
maskAllInputs | boolean | optional | 모든 입력 요소를 마스킹합니다. 기본값은 true입니다. |
maskAllText | boolean | optional | 모든 텍스트를 마스킹합니다. 기본값은 false입니다. |
maskClass | string | optional | 텍스트 마스킹에 사용할 CSS 클래스를 지정합니다. |
recordCanvas | boolean | optional | 캔버스 요소 기록 여부를 설정합니다. 기본값은 false입니다. |
sampling | number | optional | 세션 레코더 샘플링 설정을 지정합니다. |
tracePropagationTargets | Array<string | RegExp> | optional | Trace Header를 전파할 대상 도메인 또는 정규식 목록을 지정합니다. |
webVitals | boolean | optional | 웹 비타일을 활성화합니다. 기본값은 false입니다. |
websocket | boolean | optional | 웹소켓 계측을 활성화합니다. 기본값은 false입니다. |
socketio | boolean | optional | Socket.IO 계측을 활성화합니다. 기본값은 false입니다. |
captureMetric | boolean | optional | 메트릭 수집을 활성화합니다. 기본값은 false입니다. (beta) |
disablePreflight | boolean | optional | preflight 요청 비활성화 여부 (기본값: false) preflight는 CORS 요청을 위한 OPTIONS 요청입니다. |
exporterProtocol | json or proto | optional | exporter 프로토콜을 설정합니다. 기본값은 json입니다. |
screenNameOption | ScreenNameOption | optional | 화면 이름 옵션을 설정합니다. 기본값은 { screenNameType: "routeOnly", urlWithSearchParams: false }입니다. |