diff --git a/packages/core/src/scope.ts b/packages/core/src/scope.ts index 02ca7a570b17..dae18881f483 100644 --- a/packages/core/src/scope.ts +++ b/packages/core/src/scope.ts @@ -443,9 +443,13 @@ 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); + if (this._client) { + 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 });