From 56937f6ae081d316e01bc2e1ffa0d367204d536a Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Wed, 8 Feb 2023 15:31:37 +0100 Subject: [PATCH 1/3] feat(replay): Send client_report when replay sending fails This leverages the new client_report categories. --- packages/replay/src/replay.ts | 12 ++++++++++-- packages/replay/src/util/addEvent.ts | 8 ++++++++ packages/types/src/clientreport.ts | 4 +++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/replay/src/replay.ts b/packages/replay/src/replay.ts index bb66d0fa28fd..f5bb068ed6a2 100644 --- a/packages/replay/src/replay.ts +++ b/packages/replay/src/replay.ts @@ -1,6 +1,6 @@ /* eslint-disable max-lines */ // TODO: We might want to split this file up import { EventType, record } from '@sentry-internal/rrweb'; -import { captureException } from '@sentry/core'; +import { captureException, getCurrentHub } from '@sentry/core'; import type { Breadcrumb, ReplayRecordingMode } from '@sentry/types'; import { logger } from '@sentry/utils'; @@ -807,9 +807,17 @@ export class ReplayContainer implements ReplayContainerInterface { } catch (err) { this._handleException(err); - // This means we retried 3 times, and all of them failed + // This means we retried 3 times and all of them failed, + // or we ran into a problem we don't want to retry, like rate limiting. // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments this.stop(); + + const hub = getCurrentHub(); + const client = hub.getClient(); + + if (client) { + client.recordDroppedEvent('send_error', 'replay'); + } } } diff --git a/packages/replay/src/util/addEvent.ts b/packages/replay/src/util/addEvent.ts index cb66d0c7822c..d260ce09b820 100644 --- a/packages/replay/src/util/addEvent.ts +++ b/packages/replay/src/util/addEvent.ts @@ -2,6 +2,7 @@ import { logger } from '@sentry/utils'; import { SESSION_IDLE_DURATION } from '../constants'; import type { AddEventResult, RecordingEvent, ReplayContainer } from '../types'; +import { getCurrentHub } from '@sentry/core'; /** * Add an event to the event buffer @@ -46,5 +47,12 @@ export async function addEvent( } catch (error) { __DEBUG_BUILD__ && logger.error(error); replay.stop(); + + const hub = getCurrentHub(); + const client = hub.getClient(); + + if (client) { + client.recordDroppedEvent('internal_sdk_error', 'replay'); + } } } diff --git a/packages/types/src/clientreport.ts b/packages/types/src/clientreport.ts index 7b4e181d1102..b6ab1766e68c 100644 --- a/packages/types/src/clientreport.ts +++ b/packages/types/src/clientreport.ts @@ -6,7 +6,9 @@ export type EventDropReason = | 'network_error' | 'queue_overflow' | 'ratelimit_backoff' - | 'sample_rate'; + | 'sample_rate' + | 'send_error' + | 'internal_sdk_error'; export type Outcome = { reason: EventDropReason; From 1a08cd92d249296393240cc344f0e3d2b7c5661d Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 9 Feb 2023 10:18:59 +0100 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Lukas Stracke --- packages/replay/src/replay.ts | 3 +-- packages/replay/src/util/addEvent.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/replay/src/replay.ts b/packages/replay/src/replay.ts index f5bb068ed6a2..c162a26cd5da 100644 --- a/packages/replay/src/replay.ts +++ b/packages/replay/src/replay.ts @@ -812,8 +812,7 @@ export class ReplayContainer implements ReplayContainerInterface { // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments this.stop(); - const hub = getCurrentHub(); - const client = hub.getClient(); + const client = getCurrentHub().getClient(); if (client) { client.recordDroppedEvent('send_error', 'replay'); diff --git a/packages/replay/src/util/addEvent.ts b/packages/replay/src/util/addEvent.ts index d260ce09b820..7c5347f750cf 100644 --- a/packages/replay/src/util/addEvent.ts +++ b/packages/replay/src/util/addEvent.ts @@ -48,8 +48,7 @@ export async function addEvent( __DEBUG_BUILD__ && logger.error(error); replay.stop(); - const hub = getCurrentHub(); - const client = hub.getClient(); + const client = getCurrentHub().getClient(); if (client) { client.recordDroppedEvent('internal_sdk_error', 'replay'); From 6ba949eec8c60ebddad591c46d799092362ae311 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 9 Feb 2023 10:34:54 +0100 Subject: [PATCH 3/3] fix lint --- packages/replay/src/util/addEvent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/replay/src/util/addEvent.ts b/packages/replay/src/util/addEvent.ts index 7c5347f750cf..e243ce11b56b 100644 --- a/packages/replay/src/util/addEvent.ts +++ b/packages/replay/src/util/addEvent.ts @@ -1,8 +1,8 @@ +import { getCurrentHub } from '@sentry/core'; import { logger } from '@sentry/utils'; import { SESSION_IDLE_DURATION } from '../constants'; import type { AddEventResult, RecordingEvent, ReplayContainer } from '../types'; -import { getCurrentHub } from '@sentry/core'; /** * Add an event to the event buffer