Skip to content

Commit d27c347

Browse files
fix(core): Permanent idle timeout cancel finishes the transaction with the last finished child
1 parent 09f326a commit d27c347

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

packages/core/src/tracing/idletransaction.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,10 @@ export class IdleTransaction extends Transaction {
239239
restartOnChildSpanChange: true,
240240
},
241241
): void {
242+
this._idleTimeoutCanceledPermanently = restartOnChildSpanChange === false;
242243
if (this._idleTimeoutID) {
243244
clearTimeout(this._idleTimeoutID);
244245
this._idleTimeoutID = undefined;
245-
this._idleTimeoutCanceledPermanently = restartOnChildSpanChange === false;
246246

247247
if (Object.keys(this.activities).length === 0 && this._idleTimeoutCanceledPermanently) {
248248
this._finishReason = IDLE_TRANSACTION_FINISH_REASONS[5];
@@ -269,7 +269,7 @@ export class IdleTransaction extends Transaction {
269269
* @param spanId The span id that represents the activity
270270
*/
271271
private _pushActivity(spanId: string): void {
272-
this.cancelIdleTimeout();
272+
this.cancelIdleTimeout(undefined, { restartOnChildSpanChange: !this._idleTimeoutCanceledPermanently });
273273
__DEBUG_BUILD__ && logger.log(`[Tracing] pushActivity: ${spanId}`);
274274
this.activities[spanId] = true;
275275
__DEBUG_BUILD__ && logger.log('[Tracing] new activities count', Object.keys(this.activities).length);

packages/tracing/test/idletransaction.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,40 @@ describe('IdleTransaction', () => {
248248
});
249249

250250
describe('cancelIdleTimeout', () => {
251+
it('permanent idle timeout cancel is not restarted by child span start', () => {
252+
const idleTimeout = 10;
253+
const transaction = new IdleTransaction({ name: 'foo', startTimestamp: 1234 }, hub, idleTimeout);
254+
transaction.initSpanRecorder(10);
255+
256+
const firstSpan = transaction.startChild({});
257+
transaction.cancelIdleTimeout(undefined, { restartOnChildSpanChange: false });
258+
const secondSpan = transaction.startChild({});
259+
firstSpan.finish();
260+
secondSpan.finish();
261+
262+
expect(transaction.endTimestamp).toBeDefined();
263+
});
264+
265+
it('permanent idle timeout cancel finished the transaction with the last child', () => {
266+
const idleTimeout = 10;
267+
const transaction = new IdleTransaction({ name: 'foo', startTimestamp: 1234 }, hub, idleTimeout);
268+
transaction.initSpanRecorder(10);
269+
270+
const firstSpan = transaction.startChild({});
271+
transaction.cancelIdleTimeout(undefined, { restartOnChildSpanChange: false });
272+
const secondSpan = transaction.startChild({});
273+
const thirdSpan = transaction.startChild({});
274+
275+
firstSpan.finish();
276+
expect(transaction.endTimestamp).toBeUndefined();
277+
278+
secondSpan.finish();
279+
expect(transaction.endTimestamp).toBeUndefined();
280+
281+
thirdSpan.finish();
282+
expect(transaction.endTimestamp).toBeDefined();
283+
});
284+
251285
it('permanent idle timeout cancel finishes transaction if there are no activities', () => {
252286
const idleTimeout = 10;
253287
const transaction = new IdleTransaction({ name: 'foo', startTimestamp: 1234 }, hub, idleTimeout);

0 commit comments

Comments
 (0)