RUM에서 수집한 데이터 및 컨텍스트를 다양한 방법으로 수정하여 필요에 따라 지원할 수 있습니다:
개인 식별이 가능한 정보와 같은 민감한 데이터를 보호합니다.
사용자 세션을 해당 사용자의 내부 ID와 연결하여 지원합니다.
데이터 샘플링을 통해 수집하는 RUM 데이터 양을 줄입니다.
데이터의 출처에 대해 기본 속성이 제공하는 것보다 더 많은 컨텍스트를 제공합니다.
기본 RUM 보기 이름 재정의
RUM Browser SDK는 사용자가 방문한 새 페이지마다 또는 페이지 URL이 변경될 때마다(단일 페이지 애플리케이션의 경우) view 이벤트를 자동으로 생성합니다. view 이름은 현재 페이지 URL에서 생성되며, 이때 변수 ID는 자동으로 제거됩니다. 숫자가 하나 이상 포함된 경로 세그먼트는 변수 ID로 간주됩니다. 예를 들어 /dashboard/1234 및 /dashboard/9a는 /dashboard/?가 됩니다.
버전 2.17.0부터 trackViewsManually 옵션을 사용하여 보기 이벤트를 수동으로 추적함으로써 보기 이름을 추가하고 팀이 소유한 전용 서비스에 할당할 수 있습니다:
RUM Browser SDK를 초기화할 때 trackViewsManually를 true로 설정합니다.
React, Angular, Vue 또는 다른 프론트엔드 프레임워크를 사용하는 경우 Datadog은 프레임워크 라우터 수준에서 startView 로직을 구현할 것을 권장합니다.
React 라우터 계측
기본 RUM 보기 이름을 재정의하여 사용자가 React 애플리케이션에서 정의한 방법과 일치하도록 하려면 다음 단계를 수행해야 합니다.
참고: 이 지침서는 React Router v6 라이브러리에만 적용됩니다.
위의 설명대로 RUM browser SDK를 초기화할 때 trackViewsManually를 true로 설정합니다.
각 경로 변경에 대한 보기를 시작합니다.
import{matchRoutes,useLocation}from'react-router-dom';import{routes}from'path/to/routes';import{datadogRum}from"@datadog/browser-rum";exportdefaultfunctionApp(){// Track every route change with useLocation API
letlocation=useLocation();useEffect(()=>{constrouteMatches=matchRoutes(routes,location.pathname);constviewName=routeMatches&&computeViewName(routeMatches);if(viewName){datadogRum.startView({name:viewName});}},[location.pathname]);...}// Compute view name out of routeMatches
functioncomputeViewName(routeMatches){letviewName="";for(letindex=0;index<routeMatches.length;index++){constrouteMatch=routeMatches[index];constpath=routeMatch.route.path;// Skip pathless routes
if(!path){continue;}if(path.startsWith("/")){// Handle absolute child route paths
viewName=path;}else{// Handle route paths ending with "/"
viewName+=viewName.endsWith("/")?path:`/${path}`;}}returnviewName||'/';}
import{matchRoutes,useLocation}from'react-router-dom';import{routes}from'path/to/routes';exportdefaultfunctionApp(){// Track every route change with useLocation API
letlocation=useLocation();useEffect(()=>{constrouteMatches=matchRoutes(routes,location.pathname);constviewName=routeMatches&&computeViewName(routeMatches);if(viewName){DD_RUM.onReady(function(){DD_RUM.startView({name:viewName});});}},[location.pathname]);...}// Compute view name out of routeMatches
functioncomputeViewName(routeMatches){letviewName="";for(letindex=0;index<routeMatches.length;index++){constrouteMatch=routeMatches[index];constpath=routeMatch.route.path;// Skip pathless routes
if(!path){continue;}if(path.startsWith("/")){// Handle absolute child route paths
viewName=path;}else{// Handle route paths ending with "/"
viewName+=viewName.endsWith("/")?path:`/${path}`;}}returnviewName||'/';}
import{matchRoutes,useLocation}from'react-router-dom';import{routes}from'path/to/routes';exportdefaultfunctionApp(){// Track every route change with useLocation API
letlocation=useLocation();useEffect(()=>{constrouteMatches=matchRoutes(routes,location.pathname);constviewName=routeMatches&&computeViewName(routeMatches);if(viewName){window.DD_RUM&&window.DD_RUM.startView({name:viewName});}},[location.pathname]);...}// Compute view name out of routeMatches
functioncomputeViewName(routeMatches){letviewName="";for(letindex=0;index<routeMatches.length;index++){constrouteMatch=routeMatches[index];constpath=routeMatch.route.path;// Skip pathless routes
if(!path){continue;}if(path.startsWith("/")){// Handle absolute child route paths
viewName=path;}else{// Handle route paths ending with "/"
viewName+=viewName.endsWith("/")?path:`/${path}`;}}returnviewName||'/';}
뷰 이름 설정
setViewName(name: string)을 사용하여 현재 뷰의 이름을 업데이트합니다. 이렇게 하면 새 뷰를 시작하지 않고도 사용 중에 뷰 이름을 변경할 수 있습니다.
import{datadogRum}from'@datadog/browser-rum';datadogRum.setViewName('<VIEW_NAME>');// 코드 예시
datadogRum.setViewName('Checkout');
window.DD_RUM.onReady(function(){window.DD_RUM.setViewName('<VIEW_NAME>');})// 코드 예시
window.DD_RUM.onReady(function(){window.DD_RUM.setViewName('Checkout');})
window.DD_RUM&&window.DD_RUM.setViewName('<VIEW_NAME>');// 코드 예시
window.DD_RUM&&window.DD_RUM.setViewName('Checkout');
참고: 뷰 이름을 변경하면 메서드가 호출된 시점부터 뷰와 그 하위 이벤트에 영향을 미칩니다.
RUM 데이터 강화 및 제어
RUM Browser SDK는 RUM 이벤트를 캡처하고 해당 이벤트의 주요 속성을 입력합니다. beforeSend 콜백 기능을 통해 Datadog으로 전송되기 전 RUM Browser SDK에서 수집한 모든 이벤트에 액세스할 수 있습니다.
RUM 이벤트를 가로채면 다음과 같은 작업을 수행할 수 있습니다:
추가적인 컨텍스트 속성으로 RUM 이벤트 강화
RUM 이벤트를 수정하여 해당 내용을 변경하거나 민감한 시퀀스 수정 (편집 가능한 속성 목록)
선택한 RUM 이벤트 삭제
버전 2.13.0부터 beforeSend는 두가지 인수를 사용합니다: RUM Browser SDK에서 생성된 event, 그리고 RUM 이벤트 생성을 트리거한 context입니다.
Global Context API 또는 기능 플래그 데이터 수집으로 추가된 속성과 함께 이벤트에 추가 컨텍스트 속성을 추가할 수 있습니다. 예를 들어, 가져오기 응답 개체에서 추출한 데이터로 RUM 리소스 이벤트에 태그를 지정할 수 있습니다:
import{datadogRum}from'@datadog/browser-rum';datadogRum.init({...,beforeSend:(event,context)=>{// RUM 리소스의 응답 헤더를 수집합니다.
if(event.type==='resource'&&event.resource.type==='fetch'){event.context.responseHeaders=Object.fromEntries(context.response.headers)}returntrue},...});
window.DD_RUM.onReady(function(){window.DD_RUM.init({...,beforeSend:(event,context)=>{// collect a RUM resource's response headers
if(event.type==='resource'&&event.resource.type==='fetch'){event.context.responseHeaders=Object.fromEntries(context.response.headers)}returntrue},...})})
window.DD_RUM&&window.DD_RUM.init({...,beforeSend:(event,context)=>{// collect a RUM resource's response headers
if(event.type==='resource'&&event.resource.type==='fetch'){event.context.responseHeaders=Object.fromEntries(context.response.headers)}returntrue},...});
사용자가 여러 팀에 속한 경우, 호출에 포함된 키-값 쌍을 Global Context API에 추가합니다.
RUM Browser SDK는 event.context 외부에서 추가된 속성을 무시합니다.
기능 플래그를 사용하여 RUM 이벤트 강화
기능 플래그로 RUM 이벤트 데이터를 강화하여 성능 모니터링에 대한 추가 컨텍스트와 가시성을 얻을 수 있습니다. 이를 통해 어떤 사용자에게 특정 사용자 경험이 표시되는지, 그리고 이것이 사용자의 성능에 부정적인 영향을 미치는지 확인할 수 있습니다.
RUM 이벤트 내용 수정
예를 들어 웹 애플리케이션 URL에서 이메일 주소를 삭제할 수 있습니다:
import{datadogRum}from'@datadog/browser-rum';datadogRum.init({...,beforeSend:(event)=>{// 보기 URL에서 이메일 제거
event.view.url=event.view.url.replace(/email=[^&]*/,"email=REDACTED")},...});
window.DD_RUM.onReady(function(){window.DD_RUM.init({...,beforeSend:(event)=>{// 보기 URL에서 이메일 제거
event.view.url=event.view.url.replace(/email=[^&]*/,"email=REDACTED")},...})})
window.DD_RUM&&window.DD_RUM.init({...,beforeSend:(event)=>{// 보기 URL에서 이메일 제거
event.view.url=event.view.url.replace(/email=[^&]*/,"email=REDACTED")},...});
참고: 다른 이벤트와 달리 뷰 이벤트는 수명 주기 동안 발생하는 업데이트를 반영하기 위해 Datadog에 여러 번 전송됩니다. 새 뷰가 활성화된 상태에서도 이전 뷰 이벤트 업데이트를 전송할 수 있으므로 뷰 이벤트 수정 시 유의하는 것이 좋습니다.
beforeSend:(event)=>{// 현재 뷰 이름이 현재 뷰와 이전 뷰 모두에 적용될 수 있으므로 권장하지 않습니다
event.view.name=getCurrentViewName()// 권장
event.view.name=getViewNameForUrl(event.view.url)}
버전 5.28.0부터 뷰 이벤트의 컨텍스트를 수정할 수 있습니다. 컨텍스트는 현재 뷰에만 추가할 수 있으며 startView, setViewContext, setViewContextProperty 함수로 하위 이벤트(예: action, error, timing)를 자동으로 채웁니다.
setViewContextProperty(key: string, value: any) API를 사용하여 RUM 뷰 이벤트 및 해당 하위 이벤트의 컨텍스트를 보강하거나 수정합니다.
import{datadogRum}from'@datadog/browser-rum';datadogRum.setViewContextProperty('<CONTEXT_KEY>','<CONTEXT_VALUE>');// 코드 예시
datadogRum.setViewContextProperty('activity',{hasPaid:true,amount:23.42});
window.DD_RUM.onReady(function(){window.DD_RUM.setViewContextProperty('<CONTEXT_KEY>','<CONTEXT_VALUE>');})// 코드 예시
window.DD_RUM.onReady(function(){window.DD_RUM.setViewContextProperty('activity',{hasPaid:true,amount:23.42});})
window.DD_RUM&&window.DD_RUM.setViewContextProperty('<CONTEXT_KEY>','<CONTEXT_VALUE>');// 코드 예시
window.DD_RUM&&window.DD_RUM.setViewContextProperty('activity',{hasPaid:true,amount:23.42});
뷰 컨텍스트 대체
RUM 뷰 이벤트 및 해당 하위 이벤트의 컨텍스트를 setViewContext(context: Context) API로 바꿉니다.
import{datadogRum}from'@datadog/browser-rum';datadogRum.setViewContext({'<CONTEXT_KEY>':'<CONTEXT_VALUE>'});// 코드 예시
datadogRum.setViewContext({originalUrl:'shopist.io/department/chairs',});
window.DD_RUM.onReady(function(){window.DD_RUM.setViewContext({'<CONTEXT_KEY>':'<CONTEXT_VALUE>'});})// 코드 예시
window.DD_RUM.onReady(function(){window.DD_RUM.setViewContext({originalUrl:'shopist.io/department/chairs',})})
window.DD_RUM&&window.DD_RUM.setViewContext({'<CONTEXT_KEY>':'<CONTEXT_VALUE>'});// 코드 예시
window.DD_RUM&&window.DD_RUM.setViewContext({originalUrl:'shopist.io/department/chairs',});
오류 컨텍스트
dd_context를 사용하여 로컬 오류 컨텍스트 연결
오류 캡처 시 오류가 생성될 때 추가 컨텍스트가 제공될 수 있습니다. addError() API를 통해 추가 정보를 전달하는 대신 dd_context 속성을 오류 인스턴스에 직접 연결할 수 있습니다. RUM Browser SDK는 이 속성을 자동으로 감지하여 최종 오류 이벤트 컨텍스트에 병합합니다.
consterror=newError('Something went wrong')error.dd_context={component:'Menu',param:123,}throwerror
글로벌 컨텍스트
글로벌 컨텍스트 속성 추가
RUM이 초기화된 후 setGlobalContextProperty(key: string, value: any) API를 사용하여 애플리케이션에서 수집된 모든 RUM 이벤트에 추가 컨텍스트를 추가합니다:
import{datadogRum}from'@datadog/browser-rum';datadogRum.setGlobalContextProperty('<CONTEXT_KEY>',<CONTEXT_VALUE>);// 코드 예시
datadogRum.setGlobalContextProperty('activity',{hasPaid:true,amount:23.42});
window.DD_RUM.onReady(function(){window.DD_RUM.setGlobalContextProperty('<CONTEXT_KEY>','<CONTEXT_VALUE>');})// 코드 예시
window.DD_RUM.onReady(function(){window.DD_RUM.setGlobalContextProperty('activity',{hasPaid:true,amount:23.42});})
window.DD_RUM&&window.DD_RUM.setGlobalContextProperty('<CONTEXT_KEY>','<CONTEXT_VALUE>');// 코드 예시
window.DD_RUM&&window.DD_RUM.setGlobalContextProperty('activity',{hasPaid:true,amount:23.42});
글로벌 컨텍스트 속성 제거
이전에 정의된 글로벌 컨텍스트 속성을 제거할 수 있습니다.
import{datadogRum}from'@datadog/browser-rum';datadogRum.removeGlobalContextProperty('<CONTEXT_KEY>');// 코드 예시
datadogRum.removeGlobalContextProperty('codeVersion');
window.DD_RUM.onReady(function(){window.DD_RUM.removeGlobalContextProperty('<CONTEXT_KEY>');})// 코드 예시
window.DD_RUM.onReady(function(){window.DD_RUM.removeGlobalContextProperty('codeVersion');})
window.DD_RUM&&window.DD_RUM.removeGlobalContextProperty('<CONTEXT_KEY>');// 코드 예시
window.DD_RUM&&window.DD_RUM.removeGlobalContextProperty('codeVersion');
글로벌 컨텍스트 대체
모든 RUM 이벤트에 대한 기본 컨텍스트를 setGlobalContext(context: Context) API로 교체합니다.
import{datadogRum}from'@datadog/browser-rum';datadogRum.setGlobalContext({'<CONTEXT_KEY>':'<CONTEXT_VALUE>'});// 코드 예시
datadogRum.setGlobalContext({codeVersion:34,});
window.DD_RUM.onReady(function(){window.DD_RUM.setGlobalContext({'<CONTEXT_KEY>':'<CONTEXT_VALUE>'});})// 코드 예시
window.DD_RUM.onReady(function(){window.DD_RUM.setGlobalContext({codeVersion:34,})})
window.DD_RUM&&window.DD_RUM.setGlobalContext({'<CONTEXT_KEY>':'<CONTEXT_VALUE>'});// 코드 예시
window.DD_RUM&&window.DD_RUM.setGlobalContext({codeVersion:34,});