From 8f403306215ae59d14d566985400d3deb5a38663 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 23 Jan 2025 17:04:28 -0500 Subject: [PATCH 1/2] feat(v8/core): Add client outcomes for breadcrumbs buffer --- packages/core/src/scope.ts | 8 +++++--- packages/core/src/types-hoist/clientreport.ts | 3 ++- packages/core/src/types-hoist/datacategory.ts | 6 +++++- packages/core/test/lib/baseclient.test.ts | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/packages/core/src/scope.ts b/packages/core/src/scope.ts index 02ca7a570b17..36e780aac5a9 100644 --- a/packages/core/src/scope.ts +++ b/packages/core/src/scope.ts @@ -443,9 +443,11 @@ class ScopeClass implements ScopeInterface { ...breadcrumb, }; - const breadcrumbs = this._breadcrumbs; - breadcrumbs.push(mergedBreadcrumb); - this._breadcrumbs = breadcrumbs.length > maxCrumbs ? breadcrumbs.slice(-maxCrumbs) : breadcrumbs; + this._breadcrumbs.push(mergedBreadcrumb); + if (this._breadcrumbs.length > maxCrumbs) { + this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs); + this._client?.recordDroppedEvent('buffer_overflow', 'log_item'); + } this._notifyScopeListeners(); diff --git a/packages/core/src/types-hoist/clientreport.ts b/packages/core/src/types-hoist/clientreport.ts index b6ab1766e68c..069adec43c62 100644 --- a/packages/core/src/types-hoist/clientreport.ts +++ b/packages/core/src/types-hoist/clientreport.ts @@ -8,7 +8,8 @@ export type EventDropReason = | 'ratelimit_backoff' | 'sample_rate' | 'send_error' - | 'internal_sdk_error'; + | 'internal_sdk_error' + | 'buffer_overflow'; export type Outcome = { reason: EventDropReason; diff --git a/packages/core/src/types-hoist/datacategory.ts b/packages/core/src/types-hoist/datacategory.ts index bd1c0b693e4d..98c4657cf011 100644 --- a/packages/core/src/types-hoist/datacategory.ts +++ b/packages/core/src/types-hoist/datacategory.ts @@ -14,7 +14,7 @@ export type DataCategory = | 'replay' // Events with `event_type` csp, hpkp, expectct, expectstaple | 'security' - // Attachment bytes stored (unused for rate limiting + // Attachment bytes stored (unused for rate limiting) | 'attachment' // Session update events | 'session' @@ -30,5 +30,9 @@ export type DataCategory = | 'metric_bucket' // Span | 'span' + // Log event + | 'log_item' + // Log bytes stored (unused for rate limiting) + | 'log_byte' // Unknown data category | 'unknown'; diff --git a/packages/core/test/lib/baseclient.test.ts b/packages/core/test/lib/baseclient.test.ts index ce480879bb27..338e88ee72e8 100644 --- a/packages/core/test/lib/baseclient.test.ts +++ b/packages/core/test/lib/baseclient.test.ts @@ -201,6 +201,22 @@ describe('BaseClient', () => { expect(isolationScopeBreadcrumbs).toEqual([{ message: 'hello3', timestamp: expect.any(Number) }]); }); + test('it records `buffer_overflow` client discard reason when buffer overflows', () => { + const options = getDefaultTestClientOptions({ maxBreadcrumbs: 1 }); + const client = new TestClient(options); + const recordLostEventSpy = jest.spyOn(client, 'recordDroppedEvent'); + setCurrentClient(client); + getIsolationScope().setClient(client); + client.init(); + + addBreadcrumb({ message: 'hello1' }); + addBreadcrumb({ message: 'hello2' }); + addBreadcrumb({ message: 'hello3' }); + + expect(recordLostEventSpy).toHaveBeenCalledTimes(2); + expect(recordLostEventSpy).toHaveBeenLastCalledWith('buffer_overflow', 'log_item'); + }); + test('calls `beforeBreadcrumb` and adds the breadcrumb without any changes', () => { const beforeBreadcrumb = jest.fn(breadcrumb => breadcrumb); const options = getDefaultTestClientOptions({ beforeBreadcrumb }); From aaa27b6d5836e87e296d4e4136a714271c0552d1 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 24 Jan 2025 10:11:53 -0500 Subject: [PATCH 2/2] remove optional chaining --- packages/core/src/scope.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/scope.ts b/packages/core/src/scope.ts index 36e780aac5a9..dae18881f483 100644 --- a/packages/core/src/scope.ts +++ b/packages/core/src/scope.ts @@ -446,7 +446,9 @@ class ScopeClass implements ScopeInterface { this._breadcrumbs.push(mergedBreadcrumb); if (this._breadcrumbs.length > maxCrumbs) { this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs); - this._client?.recordDroppedEvent('buffer_overflow', 'log_item'); + if (this._client) { + this._client.recordDroppedEvent('buffer_overflow', 'log_item'); + } } this._notifyScopeListeners();