diff --git a/CHANGELOG.md b/CHANGELOG.md index a50420644e..69e38c5c43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +- (core) Add new `setTraceCorrelation` method to events [#2159](https://github.com/bugsnag/bugsnag-js/pull/2159) + ### Fixed - (react-native) Use synchronous native module calls when New Architecture is enabled [#2152](https://github.com/bugsnag/bugsnag-js/pull/2152) diff --git a/packages/core/event.d.ts b/packages/core/event.d.ts index 805142700d..85f70cfe99 100644 --- a/packages/core/event.d.ts +++ b/packages/core/event.d.ts @@ -25,6 +25,7 @@ export default class EventWithInternals extends Event { _featuresIndex: { [key: string]: number } _user: User _handledState: HandledState + _correlation?: { spanId: string, traceId: string } _session?: Session toJSON(): { payloadVersion: '4' @@ -40,6 +41,7 @@ export default class EventWithInternals extends Event { request: Request breadcrumbs: Breadcrumb[] context: string | undefined + correlation: { spanId: string, traceId: string } | undefined groupingHash: string | undefined metaData: { [key: string]: any } user: User diff --git a/packages/core/event.js b/packages/core/event.js index 348a972c23..1920330f3b 100644 --- a/packages/core/event.js +++ b/packages/core/event.js @@ -32,6 +32,7 @@ class Event { this._featuresIndex = {} this._user = {} this._session = undefined + this._correlation = undefined this.errors = [ createBugsnagError(errorClass, errorMessage, Event.__type, stacktrace) @@ -48,6 +49,19 @@ class Event { return metadataDelegate.add(this._metadata, section, keyOrObj, maybeVal) } + /** + * Associate this event with a specific trace. This is usually done automatically when + * using bugsnag-js-performance, but can also be set manually if required. + * + * @param traceId the ID of the trace the event occurred within + * @param spanId the ID of the span that the event occurred within + */ + setTraceCorrelation (traceId, spanId) { + if (traceId != null) { + this._correlation = { traceId, spanId } + } + } + getMetadata (section, key) { return metadataDelegate.get(this._metadata, section, key) } @@ -101,7 +115,8 @@ class Event { metaData: this._metadata, user: this._user, session: this._session, - featureFlags: this.getFeatureFlags() + featureFlags: this.getFeatureFlags(), + correlation: this._correlation } } } diff --git a/packages/core/test/event.test.ts b/packages/core/test/event.test.ts index a9c8e57b9d..0b0a8f0b28 100644 --- a/packages/core/test/event.test.ts +++ b/packages/core/test/event.test.ts @@ -420,4 +420,13 @@ describe('@bugsnag/core/event', () => { })) }) }) + + describe('event.setTraceCorrelation()', () => { + it('allows setting the span and trace id', () => { + const event = new Event('Err', 'bad', []) + event.setTraceCorrelation('test-trace-id', 'test-span-id') + const serialized = event.toJSON() + expect(serialized.correlation).toEqual({ traceId: 'test-trace-id', spanId: 'test-span-id' }) + }) + }) }) diff --git a/packages/core/types/event.d.ts b/packages/core/types/event.d.ts index f0a1d8c925..f790198547 100644 --- a/packages/core/types/event.d.ts +++ b/packages/core/types/event.d.ts @@ -53,6 +53,9 @@ declare class Event { public addFeatureFlags(featureFlags: FeatureFlag[]): void public clearFeatureFlag(name: string): void public clearFeatureFlags(): void + + // trace correlation + public setTraceCorrelation(traceId: string, spanId: string): void } interface HandledState {