ReportingObserver API로 코드 상태 파악

프로덕션 앱에서 지원 중단된 API를 찾아보세요.

에릭 비델만

ReportingObserver를 사용하면 사이트에서 지원 중단된 API를 사용하거나 브라우저 개입이 실행되는 시점을 알 수 있습니다. 기본 기능은 원래 Chrome 69에서 출시되었습니다. Chrome 84부터 작업자에서 사용할 수 있습니다.

const observer = new ReportingObserver((reports, observer) => {
  for (const report of reports) {
    console.log(report.type, report.url, report.body);
  }
}, {buffered: true});

observer.observe();

이 콜백을 사용하여 분석을 위해 백엔드 또는 분석 제공업체에 보고서를 보냅니다.

그것이 왜 유용한가요? 이 API까지는 지원 중단 및 개입 경고가 DevTools에서 콘솔 메시지로만 제공되었습니다. 특히 개입은 기기 및 네트워크 조건과 같은 다양한 실제 제약 조건에 의해서만 트리거됩니다. 따라서 로컬에서 사이트를 개발/테스트할 때는 이러한 메시지가 표시되지 않을 수도 있습니다. ReportingObserver는 이 문제의 해결책을 제공합니다. 사용자가 실제로 문제를 경험하면 웹 개발자는 이에 관한 알림을 받을 수 있습니다.

배경

얼마 전에 웹 앱에서 발생하는 '항목'을 모니터링하는 API가 얼마나 많은 API가 있는지 알게 되어 블로그 게시물 (웹 앱 관찰)을 작성했습니다. 예를 들어 DOM에 관한 정보를 관찰할 수 있는 API인 ResizeObserver, IntersectionObserver, MutationObserver가 있습니다. PerformanceObserver는 성능 측정을 캡처합니다. window.onerrorwindow.onunhandledrejection와 같은 메서드는 문제가 발생해도 Google에 알려줍니다.

그러나 기존 API로 포착할 수 없는 다른 유형의 경고도 있습니다. 사이트에서 지원 중단된 API를 사용하거나 브라우저 개입에 대해 실행되는 경우 DevTools에서 먼저 이를 알립니다.

지원 중단 및 개입에 대한 DevTools 콘솔 경고
DevTools 콘솔에서 브라우저가 시작한 경고

자연스럽게 window.onerror가 이러한 경고를 캡처한다고 생각할 것입니다. 그렇지 않습니다. 사용자 에이전트 자체에서 직접 생성된 경고에 대해서는 window.onerror가 실행되지 않기 때문입니다. 코드 실행으로 인한 런타임 오류 (자바스크립트 예외 및 구문 오류)가 발생하면 실행됩니다.

ReportingObserver가 느슨한 부분을 선택합니다. 지원 중단개입과 같은 브라우저에서 발생한 경고에 관한 알림을 프로그래매틱 방식으로 제공하는 방법을 제공합니다. 이를 보고 도구로 사용하면 사용자가 실시간 사이트에서 예기치 않은 문제를 경험하게 되는지 궁금해 하는 시간을 줄일 수 있습니다.

API

ReportingObserverIntersectionObserverResizeObserver와 같은 다른 Observer API와 다르지 않습니다. 콜백을 호출하면 정보를 제공합니다. 콜백이 수신하는 정보는 페이지로 인해 발생한 문제의 목록입니다.

const observer = new ReportingObserver((reports, observer) => {
  for (const report of reports) {
    // → report.type === 'deprecation'
    // → report.url === 'https://reporting-observer-api-demo.glitch.me'
    // → report.body.id === 'XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload'
    // → report.body.message === 'Synchronous XMLHttpRequest is deprecated...'
    // → report.body.lineNumber === 11
    // → report.body.columnNumber === 22
    // → report.body.sourceFile === 'https://reporting-observer-api-demo.glitch.me'
    // → report.body.anticipatedRemoval === <JS_DATE_STR> or null
  }
});

observer.observe();

필터링된 보고서

보고서를 미리 필터링하여 특정 보고서 유형만 관찰할 수 있습니다. 현재 'deprecation''intervention'의 두 가지 보고서 유형이 있습니다.

const observer = new ReportingObserver((reports, observer) => {
  …
}, {types: ['deprecation']});

버퍼링된 보고서

관찰자 인스턴스가 생성되기 전에 생성된 보고서를 보려면 buffered: true 옵션을 사용하세요.

const observer = new ReportingObserver((reports, observer) => {
  …
}, {types: ['intervention'], buffered: true});

이 옵션은 ReportingObserver를 사용하는 라이브러리의 지연 로드와 같은 상황에 적합합니다. 관찰자는 늦게 추가되지만 페이지 로드 초기에 발생한 어떤 것도 놓치지 않습니다.

관찰 중지

disconnect() 메서드를 사용하여 관찰을 중지합니다.

observer.disconnect();

브라우저 개입을 분석 제공업체에 보고

const observer = new ReportingObserver((reports, observer) => {
  for (const report of reports) {
    sendReportToAnalytics(JSON.stringify(report.body));
  }
}, {types: ['intervention'], buffered: true});

observer.observe();

API가 삭제될 때 알림 받기

const observer = new ReportingObserver((reports, observer) => {
  for (const report of reports) {
    if (report.type === 'deprecation') {
      sendToBackend(`Using a deprecated API in ${report.body.sourceFile} which will be
                     removed on ${report.body.anticipatedRemoval}. Info: ${report.body.message}`);
    }
  }
});

observer.observe();

결론

ReportingObserver는 웹 앱의 잠재적인 문제를 발견하고 모니터링하는 추가적인 방법을 제공합니다. 이는 코드베이스의 상태 (또는 코드베이스 부족)를 이해하는 데에도 유용한 도구입니다. 백엔드로 보고서를 보내고, 실제 문제를 파악하고, 코드를 업데이트하고, 수익을 창출하세요

향후 작업

앞으로 ReportingObserver이 JavaScript의 모든 유형의 문제를 포착하는 실질적인 API가 되기를 바랍니다. 앱에서 발생하는 모든 문제를 포착하는 API 하나가 있다고 가정해 보겠습니다.

  • 브라우저 개입
  • 지원 중단
  • 기능 정책 위반 Chromium 문제 #867471을 참고하세요.
  • 자바스크립트 예외 및 오류 (현재 window.onerror에서 서비스 제공)
  • 처리되지 않은 JS 프로미스 거부 (현재 window.onunhandledrejection에서 서비스 제공)

추가 리소스:

Unsplash시워트 오털루히어로 이미지