Skip to content

Commit 87e43f9

Browse files
committed
fix: improvements to convertToRum
1 parent 43ce111 commit 87e43f9

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed

src/v3/convertToRum.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,28 +112,33 @@ export function convertTraceToRUM<
112112
nonEmbeddedSpans.add(getSpanKey(spanAndAnnotation.span))
113113
}
114114
}
115-
const embeddedSpans: {
116-
[typeAndName: string]: EmbeddedEntry
117-
} = {}
115+
const embeddedSpans = new Map<string, EmbeddedEntry>()
118116

119117
for (const spanAndAnnotation of embeddedEntries) {
120118
const { span } = spanAndAnnotation
121119
const typeAndName = getSpanKey(span)
122-
const existingEmbeddedEntry = embeddedSpans[typeAndName]
120+
const existingEmbeddedEntry = embeddedSpans.get(typeAndName)
123121

124122
if (existingEmbeddedEntry) {
125-
embeddedSpans[typeAndName] = updateEmbeddedEntry(
126-
existingEmbeddedEntry,
127-
spanAndAnnotation,
123+
embeddedSpans.set(
124+
typeAndName,
125+
updateEmbeddedEntry(existingEmbeddedEntry, spanAndAnnotation),
128126
)
129127
} else {
130-
embeddedSpans[typeAndName] = createEmbeddedEntry(spanAndAnnotation)
128+
embeddedSpans.set(typeAndName, createEmbeddedEntry(spanAndAnnotation))
129+
}
130+
}
131+
132+
// Filter out entries with zero duration
133+
for (const [key, value] of embeddedSpans) {
134+
if (value.totalDuration === 0) {
135+
embeddedSpans.delete(key)
131136
}
132137
}
133138

134139
return {
135140
...otherTraceRecordingAttributes,
136-
embeddedSpans,
141+
embeddedSpans: Object.fromEntries(embeddedSpans),
137142
nonEmbeddedSpans: [...nonEmbeddedSpans],
138143
}
139144
}

src/v3/recordingComputeUtils.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ function getComputedRenderBeaconSpans<
197197
string,
198198
{
199199
firstStart: number
200-
lastEnd: number | undefined
200+
firstContentfulRenderEnd: number | undefined
201201
firstLoadingEnd: number | undefined
202202
firstContentStart: number | undefined
203203
renderCount: number
@@ -227,15 +227,19 @@ function getComputedRenderBeaconSpans<
227227
)
228228
if (!scopeMatch) continue
229229
const start = startTime.now
230-
const contentEnd =
231-
renderedOutput === 'content' ? start + duration : undefined
230+
const contentfulRenderEnd =
231+
entry.span.type === 'component-render' && renderedOutput === 'content'
232+
? start + duration
233+
: undefined
232234

233235
const spanTimes = renderSpansByBeacon.get(name)
234236

237+
// TODO: make sure that sumOfRenderDurations takes into account that mismatch between render-start and full render - might be discarded and re-render - should extend the first render duration from the first render start to the first end
238+
235239
if (!spanTimes) {
236240
renderSpansByBeacon.set(name, {
237241
firstStart: start,
238-
lastEnd: contentEnd,
242+
firstContentfulRenderEnd: contentfulRenderEnd,
239243
renderCount: entry.span.type === 'component-render' ? 1 : 0,
240244
sumOfDurations: duration,
241245
firstContentStart: renderedOutput === 'content' ? start : undefined,
@@ -246,10 +250,10 @@ function getComputedRenderBeaconSpans<
246250
})
247251
} else {
248252
spanTimes.firstStart = Math.min(spanTimes.firstStart, start)
249-
spanTimes.lastEnd =
250-
contentEnd && spanTimes.lastEnd
251-
? Math.max(spanTimes.lastEnd, contentEnd)
252-
: contentEnd ?? spanTimes.lastEnd
253+
spanTimes.firstContentfulRenderEnd =
254+
contentfulRenderEnd && spanTimes.firstContentfulRenderEnd
255+
? Math.min(spanTimes.firstContentfulRenderEnd, contentfulRenderEnd)
256+
: contentfulRenderEnd ?? spanTimes.firstContentfulRenderEnd
253257
if (entry.span.type === 'component-render') {
254258
spanTimes.renderCount += 1
255259
}
@@ -277,18 +281,19 @@ function getComputedRenderBeaconSpans<
277281

278282
// Calculate duration and startOffset for each beacon
279283
for (const [beaconName, spanTimes] of renderSpansByBeacon) {
280-
if (!spanTimes.lastEnd) continue
284+
if (!spanTimes.firstContentfulRenderEnd) continue
281285
computedRenderBeaconSpans[beaconName] = {
282286
startOffset: spanTimes.firstStart - input.startTime.now,
283-
timeToContent: spanTimes.lastEnd - spanTimes.firstStart,
284-
timeToLoading: spanTimes.firstLoadingEnd
287+
firstRenderTillContent:
288+
spanTimes.firstContentfulRenderEnd - spanTimes.firstStart,
289+
firstRenderTillLoading: spanTimes.firstLoadingEnd
285290
? spanTimes.firstLoadingEnd - spanTimes.firstStart
286291
: 0,
287-
timeToData: spanTimes.firstContentStart
292+
firstRenderTillData: spanTimes.firstContentStart
288293
? spanTimes.firstContentStart - spanTimes.firstStart
289294
: 0,
290295
renderCount: spanTimes.renderCount,
291-
sumOfDurations: spanTimes.sumOfDurations,
296+
sumOfRenderDurations: spanTimes.sumOfDurations,
292297
}
293298
}
294299

src/v3/traceRecordingTypes.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ export interface ComputedSpan {
1919
export interface ComputedRenderSpan {
2020
/** time relative to beginning of the trace */
2121
startOffset: number
22-
/** time from startOffset to the first moment we are able to start rendering the data */
23-
timeToData: number
2422
/** time from startOffset to the first loading state rendered */
25-
timeToLoading: number
26-
/** time from startOffset to fully displaying the content */
27-
timeToContent: number
23+
firstRenderTillLoading: number
24+
/** time from startOffset to the first moment we are able to start rendering the data */
25+
firstRenderTillData: number
26+
/** time from startOffset to first displaying the complete content */
27+
firstRenderTillContent: number
2828
renderCount: number
2929
/** the sum of all render durations */
30-
sumOfDurations: number
30+
sumOfRenderDurations: number
3131
}
3232

3333
export interface TraceRecordingBase<TracerScopeT> {

0 commit comments

Comments
 (0)