Skip to content

Commit 32600d3

Browse files
committed
handle timestamp edge cases
1 parent ab5e86b commit 32600d3

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

packages/core/src/tracing/idleSpan.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,22 @@ export function startIdleSpan(startSpanOptions: StartSpanOptions, options: Parti
119119
return;
120120
}
121121

122-
const latestEndTimestamp = Math.max(...spans.map(span => spanToJSON(span).timestamp || 0));
122+
const childEndTimestamps = spans
123+
.map(span => spanToJSON(span).timestamp)
124+
.filter(timestamp => !!timestamp) as number[];
125+
const latestSpanEndTimestamp = childEndTimestamps.length ? Math.max(...childEndTimestamps) : undefined;
123126

124-
if (latestEndTimestamp <= 0) {
125-
span.end(timestamp);
126-
return;
127-
}
128-
129-
// If the timestamp is smaller than the latest end timestamp of a span, we still want to use it
130-
// Need to convert the timestamp to seconds to ensure Math.min() works as expected
131-
// Note that other than this, we can just pass the timestamp as-is to `span.end()`
132-
// because that will convert to seconds internally anyhow
133127
const spanEndTimestamp = spanTimeInputToSeconds(timestamp);
134-
const endTimestamp = Math.min(spanEndTimestamp, latestEndTimestamp);
128+
const spanStartTimestamp = spanToJSON(span).start_timestamp;
129+
130+
// The final endTimestamp should:
131+
// * Never be before the span start timestamp
132+
// * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp
133+
// * Otherwise be the passed end timestamp
134+
const endTimestamp = Math.max(
135+
spanStartTimestamp || -Infinity,
136+
Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity),
137+
);
135138

136139
span.end(endTimestamp);
137140
}

0 commit comments

Comments
 (0)