Henry

Datadog RUM에서 SDK 로그 제외하기

· 4분 읽기

Amplitude와 푸시 SDK 로그가 실제 에러를 가리고 있었다. 최근 30일 데이터를 분류한 뒤 수집 단계에서 제외했다.

상위에는 늘 비슷한 에러가 있었다

Datadog 신규 에러 알림을 Slack으로 보내기 시작한 뒤 Datadog을 전보다 자주 열어봤다. 상위에는 늘 비슷한 항목이 있었다. 대부분 Amplitude나 푸시 SDK가 남긴 콘솔 로그였다.

내가 담당하는 서비스에서는 최근 30일 기준으로 이런 로그가 전체 에러 이벤트의 약 20%를 차지했다. 트래픽이 많은 다른 서비스는 상위 목록 대부분이 같은 로그였다. 그 아래에 있는 오류를 보려면 매번 같은 항목을 지나쳐야 했다.

에러 타입만 보고 통째로 지울 수는 없었다

처음에는 자주 보이는 타입을 통째로 제외하면 될 줄 알았다. 직접 열어보니 같은 SDK와 에러 타입 안에 정상적인 안내와 실제 오류가 섞여 있었다.

  • 결제 위젯의 handled 오류에는 출석 체크 중입니다, 필수 약관에 동의해주세요 같은 안내와 알 수 없는 에러가 발생했습니다 같은 메시지가 같이 있었다.
  • Failed to fetch에는 일반적인 네트워크 실패, 브라우저 확장 프로그램 오류, 실제 API 장애가 함께 묶였다.
  • 푸시 권한 거부는 사용자가 알림을 거절한 정상 동작이지만, 같은 SDK 로그에 서비스워커 5xx가 일부 포함돼 있었다.
  • Error, UnknownError 타입 전체를 제외하면 앞으로 생길 실제 오류도 놓칠 수 있었다.

오래 담당한 서비스는 발생 화면과 Session Replay를 보면 어느 정도 구분할 수 있었다. 다른 서비스까지 같은 감으로 판단하기는 어려웠다. 최근 데이터를 다시 꺼내 원인별로 나눠봤다.

최근 30일 데이터를 다시 봤다

상위 노이즈 계열의 최근 30일 발생분을 원인별로 나눠 확인했다.

  • Amplitude 계열은 모두 네트워크 전송 실패였다. 재시도 소진이 54%, fetch 실패가 42%였고 애플리케이션 코드 오류는 확인되지 않았다.
  • 푸시 SDK 계열의 99.9%는 네트워크·봇 또는 권한 거부 로그였다. 나머지 0.1%에는 서비스워커 5xx와 fetch 실패가 포함돼 있었다.
  • 일별 발생량은 서비스 트래픽과 비슷하게 움직였고 특정 시점의 장애성 증가도 없었다.

푸시 SDK 계열의 0.1%처럼 실제 오류 가능성이 남은 항목도 있었다. 이런 로그는 없애기 전에 다른 경로로 확인할 수 있는지부터 봤다.

모니터 쿼리에서 빼는 걸로는 부족했다

처음에는 Datadog 모니터 쿼리에 제외 조건을 넣었다. 그런데 모니터와 일간 리포트, 대시보드마다 같은 조건을 복사해야 했다. 한곳에서 빠뜨리면 같은 로그가 다시 나타났다.

확인한 범위는 SDK 콘솔 로그와 봇 세션이었다. 이 둘은 수집 단계에서 막기로 했다.

// 운영 환경에서는 Amplitude SDK 콘솔 로그를 수집하지 않습니다.
amplitude.init(KEY, undefined, {
  logLevel: isProd ? LogLevel.None : LogLevel.Warn,
})

// 푸시 SDK 초기화 전에 로그 출력을 끕니다.
pushSdk.setLogLevel('none')

// 봇 User-Agent는 RUM 세션을 수집하지 않습니다.
datadogRum.init({
  ...options,
  sessionSampleRate: isBotUA ? 0 : 100,
})

logLevel 설정은 SDK의 콘솔 로거만 끈다. 로거를 거치지 않는 실제 JavaScript 예외는 계속 RUM에 들어오는 것도 확인했다.

못 보게 된 로그는 다른 경로로 확인했다

Amplitude 로그를 수집하지 않으면 전송 장애도 이 콘솔 로그로는 알 수 없다. 대신 전송 실패율이 80%를 넘을 때 알림을 보내는 모니터를 추가했다.

Amplitude 전송 실패율 80% 초과 시 알림 — 수집 전면 장애 가능성. 평시 실패율 약 13%는 광고 차단기 등의 영향을 포함합니다.

평시 수치도 알림에 적었다. 나중에 임계값만 보고 왜 80%로 정했는지 다시 찾지 않기 위해서였다. 서비스워커 5xx는 RUM 리소스 이벤트와 서버 로그에서 따로 확인하기로 했다.

배포 뒤 다시 확인했다

dev 환경에서 일반 User-Agent의 RUM·Amplitude·푸시 요청이 이전과 같은지 확인했다. 봇 User-Agent에서는 RUM 수집 요청이 발생하지 않았다. 푸시 수신과 인앱 배너는 실기기로 확인했다.

운영에 반영한 뒤에는 상위 목록을 채우던 SDK 로그가 더 이상 들어오지 않았다. 로거를 거치지 않는 JavaScript 예외는 계속 RUM에서 확인할 수 있었다. 모니터와 리포트마다 같은 제외 조건을 반복해서 관리할 필요도 없어졌다.

아직 근거가 부족한 항목은 그대로 남겨뒀다. 알림이 조금 더 오는 것보다 실제 오류를 같이 지우는 쪽이 더 위험했다.