코어 웹바이탈 계측
@imqa/instrumentation-webvitals
개요
WebVitals 계측은 웹 애플리케이션의 핵심 성능 지표인 Core Web Vitals를 자동으로 측정하고 모니터링하는 기능을 제공합니다. LCP(Largest Contentful Paint), FID(First Input Delay), CLS(Cumulative Layout Shift) 등 Google에서 정의한 웹 성능 기준을 실시간으로 추적하여 사용자 경험을 개선할 수 있습니다.
주요 기능
Core Web Vitals 측정
- LCP: 최대 콘텐츠풀 페인트 시간 측정
- FID: 첫 번째 입력 지연 시간 측정
- CLS: 누적 레이아웃 이동 점수 계산
- INP: 다음 페인트까지의 상호작용 지연 시간
추가 성능 메트릭
- TTFB: 첫 바이트까지의 시간
- FCP: 첫 번째 콘텐츠풀 페인트
- TTI: 상호작용 가능 시간
- TBT: 총 차단 시간
Histogram Metrics 지원
- Web Vitals 데이터를 OpenTelemetry Histogram Metric으로 전송
- Span과 Metric 동시 전송으로 다양한 분석 지원
- 각 메트릭별 분포도 및 백분위수 분석 가능
실시간 성능 모니터링
- 성능 임계값 기반 알림
- 디바이스별, 브라우저별 성능 분석
- 페이지별 상세 성능 리포트
계측 범위
WebVitals 계측은 다음과 같은 성능 지표를 추적합니다:
- 로딩 성능: 페이지 로드 및 콘텐츠 렌더링 시간
- 상호작용성: 사용자 입력에 대한 응답 속도
- 시각적 안정성: 레이아웃 변경으로 인한 시각적 불안정성
- 네트워크 성능: 서버 응답 시간 및 리소스 로딩
주요 속성
| 속성 | 설명 |
|---|---|
service.name | Telemetry를 생성하는 서비스의 이름 |
service.version | 서비스 버전 |
service.namespace | 서비스 네임스페이스 |
deployment.environment.name | 배포 환경 |
telemetry.sdk.language | Telemetry SDK의 프로그래밍 언어 |
telemetry.sdk.name | Telemetry SDK의 이름 |
telemetry.sdk.version | Telemetry SDK의 버전 |
process.runtime.name | 런타임 이름 (예: "browser") |
os.name | 운영체제 이름 |
os.version | 운영체제 버전 |
imqa.browser.device | 디바이스 타입 |
imqa.browser.name | 브라우저 이름 |
imqa.browser.version | 브라우저 전체 버전 |
imqa.browser.version_major | 브라우저 메이저 버전 |
service.key | 서비스 식별 키 |
imqa.agent.version | IMQA 에이전트 버전 |
rum.version | RUM (Real User Monitoring) 버전 |
rum.scriptInstance | RUM 스크립트 인스턴스 식별자 |
session.id | 사용자 세션 식별자 |
인스트루멘테이션 범위
WebVitals Telemetry는 주로 다음과 같은 인스트루멘테이션 범위를 통해 캡처됩니다:
@imqa/instrumentation-webvitals: Core Web Vitals 및 기타 성능 메트릭 캡처
WebVitals 스팬
WebVitals 스팬은 웹 성능 지표를 캡처합니다:
traceId: 트레이스의 고유 식별자spanId: 스팬의 고유 식별자name: 성능 지표의 이름 (예: "LCP", "FID", "CLS")kind: 스팬의 타입 (INTERNAL = 1)startTimeUnixNano: 에포크 이후의 메트릭 측정 시작 시간 (나노초)endTimeUnixNano: 에포크 이후의 메트릭 측정 완료 시간 (나노초)status: 결과 상태 (OK = 0)
WebVitals 스팬 속성
각 WebVitals 스팬은 다음과 같은 속성을 포함합니다:
| 속성 | 타입 | 설명 |
|---|---|---|
web-vital.name | string | 성능 지표의 이름 (fcp, ttfb, fid, cls, lcp, inp) |
web-vital.value | number | 지표의 값 (밀리초 또는 비율) |
web-vital.delta | number | 이전 값과의 차이 |
web-vital.navigation_type | string | 네비게이션 타입 |
web-vital.rating | string | 지표의 등급 (good, needs-improvement, poor) |
imqa.span.type | string | 스팬 타입 (webvitals) |
location.href | string | 현재 페이지 URL |
environment | string | 환경 이름 |
deployment.environment | string | 배포 환경 |
screen.name | string | 화면/페이지 이름 |
screen.type | string | 화면/페이지 타입 |
session.id | string | 사용자 세션 식별자 |
url.full | string | 요청 전체 URL (예: "https://example.com/articles/4?s=1&t1" ) |
component | string | 인스트루멘테이션 컴포넌트 이름 |
사용 방법
이 스키마는 IMQA 모니터링 시스템으로 Telemetry 데이터를 처리하고 저장하기 전에 웹 성능 지표를 위한 Telemetry 데이터를 검증하는 데 사용됩니다. 이는 모든 필수 필드가 올바르게 포함되어 있는지 확인합니다.
계측 설정
(
boolean, 선택)
Web Vitals 계측을 활성화하거나 비활성화합니다. true로 설정하면 Core Web Vitals 지표가 자동으로 계측됩니다.
interface InstrumentationConfig {
enabled?: boolean;
}
enabled: 계측을 활성화할지 여부를 설정합니다. 기본값은true입니다.
Histogram Metric 속성
Web Vitals 데이터는 Span과 함께 Histogram Metric으로도 전송됩니다. Histogram Metric은 다음과 같은 속성을 포함합니다:
| 속성 | 타입 | 설명 |
|---|---|---|
imqa.span.type | string | 메트릭 타입 (webvitals) |
web-vital.name | string | 성능 지표의 이름 |
web-vital.delta | number | 이전 값과의 차이 |
web-vital.navigation_type | string | 네비게이션 타입 |
web-vital.rating | string | 지표의 등급 |
Histogram Metric은 다음과 같은 이점을 제공합니다:
- 메트릭 값의 분포 분석
- P50, P75, P90, P95, P99 백분위수 계산
- 시간별 추이 분석
- 다양한 차원별 집계 분석
예시
유효한 WebVitals Telemetry 객체는 다음과 같은 내용을 포함합니다:
- 서비스, 브라우저 및 환경을 식별하는 리소스 정보
LCP,FID,CLS와 같은 웹 성능 지표를 캡처하는 WebVitals 스팬- 동일한 속성을 가진 Histogram Metric으로 전송되는 성능 데이터
- 지표의 값과 등급을 포함하는 성능 메트릭
데이터는 다양한 Telemetry 수집 및 분석 도구와 호환되는 OpenTelemetry 프로토콜 형식을 따릅니다.
구현 예시
// Web Vitals 계측이 활성화되면 자동으로 수행됨
// 각 메트릭은 Span과 Histogram Metric으로 동시 전송
// FCP (First Contentful Paint) 측정 시
// - Span: web-vital.name='fcp', web-vital.value=1500, web-vital.rating='good'
// - Metric: histogram 'webvitals' with value=1500
// LCP (Largest Contentful Paint) 측정 시
// - Span: web-vital.name='lcp', web-vital.value=2500, web-vital.rating='needs-improvement'
// - Metric: histogram 'webvitals' with value=2500