개요

프론트 엔드 오류는 실제 사용자 모니터링(RUM)을 사용하여 수집됩니다. 오류 메시지와 스택 트레이스는 사용 가능한 경우 포함됩니다.

오류 소스

프런트엔드 오류는 다음과 같은 여러 원인으로 인해 발생합니다.

  • 에이전트: SDK 실행 시
  • 콘솔: console.error() API 호출 시
  • 커스텀: [RUM addError API]와 함께 전송 시(#collect-errors-manually)
  • 보고: ReportingObserver API에서
  • 소스: 소스 코드에서 처리되지 않은 예외 또는 처리되지 않은 약속 거부 발생 시

오류 속성

모든 RUM 이벤트 유형의 기본 속성에 대한 내용은 수집된 데이터를 참조하세요. 샘플링 또는 글로벌 컨텍스트 구성에 대한 내용은 RUM 데이터 및 콘텍스트 수정하기를 참조하세요.

속성유형설명
error.source문자열오류가 발생한 곳 (예:console).
error.type문자열오류 유형(또는 경우에 따라 오류 코드).
error.message문자열이벤트를 설명하는 간결하고 사람이 읽을 수 있는 한 줄 메시지.
error.stack문자열스택 트레이스 또는 오류에 대한 보완 정보.

소스 오류

소스 오류에는 오류에 대한 코드 레벨 정보가 포함됩니다. 다양한 오류 유형에 대한 자세한 내용은 MDN 문서에서 확인할 수 있습니다.

속성유형설명
error.type문자열오류 유형(또는 경우에 따라 오류 코드).

수동으로 오류 수집

처리된 예외, 처리된 약속 거부 및 RUM Browser SDK에서 자동으로 추적되지 않는 기타 오류를 addError()API를 통해 모니터링하세요:

addError(
    error: unknown,
    context?: Context
);

참고: 오류 추적 기능은 custom, source 또는 report로 설정된 소스를 전송하는 오류 및 스택 트레이스가 포함된 오류를 처리합니다. 다른 소스(예: console) 또는 브라우저 확장 프로그램으로 전송된 오류는 처리하지 않습니다.

import { datadogRum } from '@datadog/browser-rum';

// 컨텍스트와 함께 커스텀 오류 전송
const error = new Error('Something wrong occurred.');

datadogRum.addError(error, {
    pageStatus: 'beta',
});

// 네트워크 오류 전송
fetch('<SOME_URL>').catch(function(error) {
    datadogRum.addError(error);
})

// 처리된 예외 오류 전송
try {
    // 일부 코드 로직
} catch (error) {
    datadogRum.addError(error);
}
// 컨텍스트와 함께 커스텀 오류 전송
const error = new Error('Something wrong occurred.');

window.DD_RUM.onReady(function() {
    window.DD_RUM.addError(error, {
        pageStatus: 'beta',
    });
});

// 네트워크 오류 전송
fetch('<SOME_URL>').catch(function(error) {
    window.DD_RUM.onReady(function() {
        window.DD_RUM.addError(error);
    });
})

// 처리된 예외 오류 전송
try {
    //Some code logic
} catch (error) {
    window.DD_RUM.onReady(function() {
        window.DD_RUM.addError(error);
    })
}
// 컨텍스트와 함께 커스텀 오류 전송
const error = new Error('Something wrong occurred.');

window.DD_RUM && window.DD_RUM.addError(error, {
    pageStatus: 'beta',
});

// 네트워크 오류 전송
fetch('<SOME_URL>').catch(function(error) {
    window.DD_RUM && window.DD_RUM.addError(error);
})

// 처리된 예외 오류 전송
try {
    // 일부 코드 로직
} catch (error) {
    window.DD_RUM && window.DD_RUM.addError(error);
}

React 오류 경계 계측

RUM Browser SDK addError() API를 사용하여 React 오류 경계를 계측함으로써 React 렌더링 오류를 모니터링할 수 있습니다.

수집된 렌더링 오류에는 컴포넌트 스택이 포함되며, 이 스택은 소스맵 업로드 후 다른 오류 스택 추적과 마찬가지로 축소되지 않습니다.

모니터링을 위해 React 오류 경계를 계측하려면 다음을 사용하세요:

import { datadogRum } from '@datadog/browser-rum';

class ErrorBoundary extends React.Component {
  ...

  componentDidCatch(error, info) {
    const renderingError = new Error(error.message);
    renderingError.name = `ReactRenderingError`;
    renderingError.stack = info.componentStack;
    renderingError.cause = error;

    datadogRum.addError(renderingError);
  }

  ...
}
class ErrorBoundary extends React.Component {
  ...

  componentDidCatch(error, info) {
    const renderingError = new Error(error.message);
    renderingError.name = `ReactRenderingError`;
    renderingError.stack = info.componentStack;
    renderingError.cause = error;

    DD_RUM.onReady(function() {
       DD_RUM.addError(renderingError);
    });
  }

  ...
}
class ErrorBoundary extends React.Component {
  ...

  componentDidCatch(error, info) {
    const renderingError = new Error(error.message);
    renderingError.name = `ReactRenderingError`;
    renderingError.stack = info.componentStack;
    renderingError.cause = error;

     window.DD_RUM &&
       window.DD_RUM.addError(renderingError);

  }

  ...
}

트러블슈팅

스크립트 오류

보안상의 이유로 브라우저는 크로스 오리진 스크립트에 의해 트리거된 오류의 세부 정보를 숨깁니다. 이 경우 Error Details 탭에 “Script error"라는 최소한의 메시지와 함께 오류가 표시됩니다.

실제 사용자 모니터링 스크립트 오류 예시

크로스 오리진 스크립트 및 세부 정보가 숨겨지는 이유에 대한 자세한 내용은 CORS글로벌 이벤트 핸들러에 대한 이 참고 사항을 참조하세요. 이 오류의 원인은 다음과 같습니다:

  • JavaScript 파일은 다른 호스트 이름(예: example.comstatic.example.com의 어셋 포함)에서 호스팅됩니다.
  • 귀하의 웹사이트에는 CDN에서 호스팅되는 JavaScript 라이브러리가 포함되어 있습니다.
  • 귀하의 웹사이트에는 공급자의 서버에서 호스팅되는 타사 JavaScript 라이브러리가 포함되어 있습니다.

다음 두 단계를 수행하여 크로스 오리진 스크립트에 대한 가시성을 확보하세요:

  1. crossorigin="anonymous"로 JavaScript 라이브러리를 호출하세요.

    crossorigin="anonymous"를 사용하면 스크립트 가져오기 요청은 안전하게 수행됩니다. 쿠키나 HTTP 인증을 통해 민감한 데이터가 전달되지 않습니다.

  2. Access-Control-Allow-Origin HTTP 응답 헤더를 설정하세요.

    • Access-Control-Allow-Origin: *은 모든 출처에서 리소스를 가져올 수 있도록 허용합니다.
    • Access-Control-Allow-Origin: example.com는 하나의 허용된 오리진을 지정합니다. 서버가 여러 오리진 클라이언트를 지원하는 경우 요청하는 특정 클라이언트의 오리진을 반환해야 합니다.

참고 자료