diff --git a/packages/core/src/tracing/idleSpan.ts b/packages/core/src/tracing/idleSpan.ts index e1e3585579a7..e9a7906f9b0d 100644 --- a/packages/core/src/tracing/idleSpan.ts +++ b/packages/core/src/tracing/idleSpan.ts @@ -17,6 +17,7 @@ import { import { timestampInSeconds } from '../utils/time'; import { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext'; import { SentryNonRecordingSpan } from './sentryNonRecordingSpan'; +import { SentrySpan } from './sentrySpan'; import { SPAN_STATUS_ERROR } from './spanstatus'; import { startInactiveSpan } from './trace'; @@ -326,7 +327,12 @@ export function startIdleSpan(startSpanOptions: StartSpanOptions, options: Parti // or if this is the idle span itself being started, // or if the started span has already been closed, // we don't care about it for activity - if (_finished || startedSpan === span || !!spanToJSON(startedSpan).timestamp) { + if ( + _finished || + startedSpan === span || + !!spanToJSON(startedSpan).timestamp || + (startedSpan instanceof SentrySpan && startedSpan.isStandaloneSpan()) + ) { return; } diff --git a/packages/core/test/lib/tracing/idleSpan.test.ts b/packages/core/test/lib/tracing/idleSpan.test.ts index 3eec7836a681..677428c941cd 100644 --- a/packages/core/test/lib/tracing/idleSpan.test.ts +++ b/packages/core/test/lib/tracing/idleSpan.test.ts @@ -586,6 +586,28 @@ describe('startIdleSpan', () => { expect(spanToJSON(idleSpan).status).not.toEqual('deadline_exceeded'); expect(spanToJSON(idleSpan).timestamp).toBeDefined(); }); + + it("doesn't reset the timeout for standalone spans", () => { + const idleSpan = startIdleSpan({ name: 'idle span' }, { finalTimeout: 99_999 }); + expect(idleSpan).toBeDefined(); + + // Start any span to cancel idle timeout + startInactiveSpan({ name: 'span' }); + + // Wait some time + vi.advanceTimersByTime(TRACING_DEFAULTS.childSpanTimeout - 1000); + expect(spanToJSON(idleSpan).status).not.toEqual('deadline_exceeded'); + expect(spanToJSON(idleSpan).timestamp).toBeUndefined(); + + // new standalone span should not reset the timeout + const standaloneSpan = startInactiveSpan({ name: 'standalone span', experimental: { standalone: true } }); + expect(standaloneSpan).toBeDefined(); + + // Wait for timeout to exceed + vi.advanceTimersByTime(1001); + expect(spanToJSON(idleSpan).status).not.toEqual('deadline_exceeded'); + expect(spanToJSON(idleSpan).timestamp).toBeDefined(); + }); }); describe('disableAutoFinish', () => {