Skip to content

Commit 33cab84

Browse files
committed
Create child span for time waiting for manual UI load ending
1 parent ac5d621 commit 33cab84

File tree

4 files changed

+60
-14
lines changed

4 files changed

+60
-14
lines changed

embrace-android-features/src/main/kotlin/io/embrace/android/embracesdk/internal/capture/activity/LifecycleStage.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ enum class LifecycleStage(private val typeName: String) {
77
CREATE("create"),
88
START("start"),
99
RESUME("resume"),
10-
RENDER("render");
10+
RENDER("render"),
11+
READY("ready");
1112

1213
fun spanName(componentName: String): String = "$componentName-$typeName"
1314
}

embrace-android-features/src/main/kotlin/io/embrace/android/embracesdk/internal/capture/activity/UiLoadTraceEmitter.kt

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,19 @@ class UiLoadTraceEmitter(
107107
timestampMs = timestampMs,
108108
lifecycleStage = LifecycleStage.RESUME
109109
)
110-
} else if (traceCompleteTrigger(instanceId) == TraceCompleteTrigger.RESUME) {
111-
endTrace(
112-
instanceId = instanceId,
113-
timestampMs = timestampMs,
114-
)
110+
} else {
111+
if (traceCompleteTrigger(instanceId) == TraceCompleteTrigger.RESUME) {
112+
endTrace(
113+
instanceId = instanceId,
114+
timestampMs = timestampMs,
115+
)
116+
} else if (!hasRenderEvent && traceCompleteTrigger(instanceId) == TraceCompleteTrigger.MANUAL) {
117+
startChildSpan(
118+
instanceId = instanceId,
119+
timestampMs = timestampMs,
120+
lifecycleStage = LifecycleStage.READY
121+
)
122+
}
115123
}
116124
}
117125

@@ -122,11 +130,18 @@ class UiLoadTraceEmitter(
122130
lifecycleStage = LifecycleStage.RESUME
123131
)
124132

125-
if (traceCompleteTrigger(instanceId) == TraceCompleteTrigger.RESUME) {
133+
val endType = traceCompleteTrigger(instanceId)
134+
if (endType == TraceCompleteTrigger.RESUME) {
126135
endTrace(
127136
instanceId = instanceId,
128137
timestampMs = timestampMs,
129138
)
139+
} else if (!hasRenderEvent && endType == TraceCompleteTrigger.MANUAL) {
140+
startChildSpan(
141+
instanceId = instanceId,
142+
timestampMs = timestampMs,
143+
lifecycleStage = LifecycleStage.READY
144+
)
130145
}
131146
}
132147

@@ -148,17 +163,35 @@ class UiLoadTraceEmitter(
148163
lifecycleStage = LifecycleStage.RENDER
149164
)
150165

151-
if (traceCompleteTrigger(instanceId) == TraceCompleteTrigger.RENDER) {
152-
endTrace(
153-
instanceId = instanceId,
154-
timestampMs = timestampMs,
155-
)
166+
val endType = traceCompleteTrigger(instanceId)
167+
when (endType) {
168+
TraceCompleteTrigger.RENDER -> {
169+
endTrace(
170+
instanceId = instanceId,
171+
timestampMs = timestampMs,
172+
)
173+
}
174+
175+
TraceCompleteTrigger.MANUAL -> {
176+
startChildSpan(
177+
instanceId = instanceId,
178+
timestampMs = timestampMs,
179+
lifecycleStage = LifecycleStage.READY
180+
)
181+
}
182+
183+
else -> {}
156184
}
157185
}
158186
}
159187

160188
override fun complete(instanceId: Int, timestampMs: Long) {
161189
if (traceCompleteTrigger(instanceId) == TraceCompleteTrigger.MANUAL) {
190+
endChildSpan(
191+
instanceId = instanceId,
192+
timestampMs = timestampMs,
193+
lifecycleStage = LifecycleStage.READY
194+
)
162195
endTrace(
163196
instanceId = instanceId,
164197
timestampMs = timestampMs,

embrace-android-features/src/test/java/io/embrace/android/embracesdk/internal/capture/activity/UiLoadTraceEmitterTest.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,17 @@ internal class UiLoadTraceEmitterTest {
298298
}
299299
}
300300

301+
val traceEndTime = trace.endTimeNanos.nanosToMillis()
301302
if (manualEnd) {
302-
assertNotEquals(trace.endTimeNanos.nanosToMillis(), lastEventEndTimeMs)
303+
assertEmbraceSpanData(
304+
span = checkNotNull(spanMap["emb-$activityName-ready"]).toNewPayload(),
305+
expectedStartTimeMs = lastEventEndTimeMs,
306+
expectedEndTimeMs = traceEndTime,
307+
expectedParentId = trace.spanId
308+
)
309+
assertNotEquals(traceEndTime, lastEventEndTimeMs)
303310
} else {
304-
assertEquals(trace.endTimeNanos.nanosToMillis(), lastEventEndTimeMs)
311+
assertEquals(traceEndTime, lastEventEndTimeMs)
305312
}
306313
}
307314
}

embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/UiLoadTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import io.embrace.android.embracesdk.testframework.actions.EmbraceActionInterfac
2424
import io.embrace.android.embracesdk.testframework.actions.EmbraceActionInterface.Companion.STARTUP_BACKGROUND_TIME
2525
import io.opentelemetry.api.trace.SpanId
2626
import org.junit.Assert.assertEquals
27+
import org.junit.Assert.assertNotNull
2728
import org.junit.Assert.assertTrue
2829
import org.junit.Rule
2930
import org.junit.Test
@@ -149,6 +150,10 @@ internal class UiLoadTest {
149150
expectedCustomAttributes = mapOf("manual-end" to "true")
150151
)
151152

153+
assertNotNull(findSpansByName("emb-$MANUAL_STOP_ACTIVITY_NAME-create").single())
154+
assertNotNull(findSpansByName("emb-$MANUAL_STOP_ACTIVITY_NAME-start").single())
155+
assertNotNull(findSpansByName("emb-$MANUAL_STOP_ACTIVITY_NAME-ready").single())
156+
152157
assertEmbraceSpanData(
153158
span = findSpansByName("loading-time").single(),
154159
expectedStartTimeMs = expectedTraceStartTime + calculateTotalTime(lifecycleStages = 3),

0 commit comments

Comments
 (0)