File tree Expand file tree Collapse file tree 6 files changed +88
-0
lines changed
embrace-android-api/src/main/kotlin/io/embrace/android/embracesdk/spans
embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/spans
integrationTest/kotlin/io/embrace/android/embracesdk/testcases
main/java/io/embrace/android/embracesdk Expand file tree Collapse file tree 6 files changed +88
-0
lines changed Original file line number Diff line number Diff line change @@ -264,4 +264,6 @@ public interface TracingApi {
264264 * if was completed in a prior session.
265265 */
266266 public fun getSpan (spanId : String ): EmbraceSpan ?
267+
268+ public fun createOperation (name : String ): Workflow
267269}
Original file line number Diff line number Diff line change 1+ package io.embrace.android.embracesdk.spans
2+
3+ public interface Workflow {
4+ public fun start (segmentName : String? = null): Boolean
5+ public fun startSegment (segmentName : String ): Boolean
6+ public fun end (errorCode : ErrorCode ? = null): Boolean
7+ }
Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ import io.embrace.android.embracesdk.spans.EmbraceSpan
66import io.embrace.android.embracesdk.spans.EmbraceSpanEvent
77import io.embrace.android.embracesdk.spans.ErrorCode
88import io.embrace.android.embracesdk.spans.TracingApi
9+ import io.embrace.android.embracesdk.spans.Workflow
910
1011class EmbraceTracer (
1112 private val spanService : SpanService ,
@@ -78,4 +79,6 @@ class EmbraceTracer(
7879 )
7980
8081 override fun getSpan (spanId : String ): EmbraceSpan ? = spanService.getSpan(spanId = spanId)
82+
83+ override fun createOperation (name : String ): Workflow = Operation (name = name, spanService = spanService)
8184}
Original file line number Diff line number Diff line change 1+ package io.embrace.android.embracesdk.internal.spans
2+
3+ import io.embrace.android.embracesdk.spans.EmbraceSpan
4+ import io.embrace.android.embracesdk.spans.ErrorCode
5+ import io.embrace.android.embracesdk.spans.Workflow
6+
7+ class Operation (
8+ private val name : String ,
9+ private val spanService : SpanService ,
10+ ) : Workflow {
11+ @Volatile
12+ private var root: EmbraceSpan ? = null
13+
14+ @Volatile
15+ private var currentSegment: EmbraceSpan ? = null
16+
17+ override fun start (segmentName : String? ): Boolean {
18+ spanService.startSpan(name)?.apply {
19+ root = this
20+ segmentName?.let {
21+ startSegment(it)
22+ }
23+ }
24+
25+ return root != null && (segmentName == null || currentSegment != null )
26+ }
27+
28+ override fun startSegment (segmentName : String ): Boolean {
29+ root?.run {
30+ currentSegment?.stop()
31+ currentSegment = spanService.startSpan(parent = root, name = " $name -$segmentName " )
32+ }
33+
34+ return currentSegment != null
35+ }
36+
37+ override fun end (errorCode : ErrorCode ? ): Boolean {
38+ currentSegment?.stop(errorCode)
39+ return root?.stop(errorCode) != null
40+ }
41+ }
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ package io.embrace.android.embracesdk.testcases
33import androidx.test.ext.junit.runners.AndroidJUnit4
44import io.embrace.android.embracesdk.arch.assertIsTypePerformance
55import io.embrace.android.embracesdk.assertions.assertEmbraceSpanData
6+ import io.embrace.android.embracesdk.assertions.findSpansByName
67import io.embrace.android.embracesdk.concurrency.SingleThreadTestScheduledExecutor
78import io.embrace.android.embracesdk.fakes.FakeSpanExporter
89import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig
@@ -329,6 +330,35 @@ internal class TracingApiTest {
329330 )
330331 }
331332
333+ @Test
334+ fun `record operation` () {
335+ testRule.runTest(
336+ testCaseAction = {
337+ recordSession {
338+ clock.tick(100L )
339+ val op = embrace.createOperation(" my-op" )
340+ clock.tick(100L )
341+ op.start(" first" )
342+ clock.tick(100L )
343+ op.start(" second" )
344+ clock.tick(100L )
345+ op.start(" third" )
346+ clock.tick(100L )
347+ op.end(ErrorCode .FAILURE )
348+ }
349+ },
350+ assertAction = {
351+ with (getSingleSessionEnvelope()) {
352+ assertNotNull(findSpansByName(name = " my-op" ))
353+ assertNotNull(findSpansByName(name = " my-op-first" ))
354+ assertNotNull(findSpansByName(name = " my-op-second" ))
355+ assertNotNull(findSpansByName(name = " my-op-third" ))
356+ }
357+ }
358+ )
359+ }
360+
361+
332362 private fun EmbracePayloadAssertionInterface.getSdkInitSpanFromBackgroundActivity (): List <Span > {
333363 val lastSentBackgroundActivity = getSingleSessionEnvelope(ApplicationState .BACKGROUND )
334364 val spans = checkNotNull(lastSentBackgroundActivity.data.spans)
Original file line number Diff line number Diff line change @@ -13,6 +13,7 @@ import io.embrace.android.embracesdk.spans.AutoTerminationMode
1313import io.embrace.android.embracesdk.spans.EmbraceSpan
1414import io.embrace.android.embracesdk.spans.EmbraceSpanEvent
1515import io.embrace.android.embracesdk.spans.ErrorCode
16+ import io.embrace.android.embracesdk.spans.Workflow
1617import io.opentelemetry.api.OpenTelemetry
1718import io.opentelemetry.sdk.logs.export.LogRecordExporter
1819import io.opentelemetry.sdk.trace.export.SpanExporter
@@ -377,6 +378,10 @@ public class Embrace private constructor(
377378 return impl.getSpan(spanId)
378379 }
379380
381+ override fun createOperation (name : String ): Workflow {
382+ return impl.createOperation(name)
383+ }
384+
380385 /* *
381386 * Adds a [SpanExporter] to the tracer.
382387 *
You can’t perform that action at this time.
0 commit comments