diff --git a/packages/tracing/src/idletransaction.ts b/packages/tracing/src/idletransaction.ts index 7e876bb18660..e63e08224d7c 100644 --- a/packages/tracing/src/idletransaction.ts +++ b/packages/tracing/src/idletransaction.ts @@ -221,7 +221,11 @@ export class IdleTransaction extends Transaction { // Remember timestampWithMs is in seconds, timeout is in ms const end = timestampWithMs() + timeout / 1000; - setTimeout(() => { + if (this._initTimeout) { + clearTimeout(this._initTimeout); + } + + this._initTimeout = setTimeout(() => { if (!this._finished) { this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[1]); this.finish(end); diff --git a/packages/tracing/test/idletransaction.test.ts b/packages/tracing/test/idletransaction.test.ts index b60fec726c54..c2e5006f1958 100644 --- a/packages/tracing/test/idletransaction.test.ts +++ b/packages/tracing/test/idletransaction.test.ts @@ -193,6 +193,42 @@ describe('IdleTransaction', () => { jest.advanceTimersByTime(DEFAULT_IDLE_TIMEOUT); expect(transaction.endTimestamp).toBeUndefined(); }); + + it('does not finish when idleTimeout is not exceed after last activity finished', () => { + const idleTimeout = 10; + const transaction = new IdleTransaction({ name: 'foo', startTimestamp: 1234 }, hub, idleTimeout); + transaction.initSpanRecorder(10); + + const span = transaction.startChild({}); + span.finish(); + + jest.advanceTimersByTime(2); + + const span2 = transaction.startChild({}); + span2.finish(); + + jest.advanceTimersByTime(8); + + expect(transaction.endTimestamp).toBeUndefined(); + }); + + it('finish when idleTimeout is exceeded after last activity finished', () => { + const idleTimeout = 10; + const transaction = new IdleTransaction({ name: 'foo', startTimestamp: 1234 }, hub, idleTimeout); + transaction.initSpanRecorder(10); + + const span = transaction.startChild({}); + span.finish(); + + jest.advanceTimersByTime(2); + + const span2 = transaction.startChild({}); + span2.finish(); + + jest.advanceTimersByTime(10); + + expect(transaction.endTimestamp).toBeDefined(); + }); }); describe('heartbeat', () => {