Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Send source for transactions #2180

Merged
merged 14 commits into from Aug 5, 2022
6 changes: 6 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Features

- Send source for transactions ([#2180](https://github.com/getsentry/sentry-java/pull/2180))

## 6.3.0

### Features
Expand Down
Expand Up @@ -20,6 +20,9 @@
import io.sentry.SentryLevel;
import io.sentry.SentryOptions;
import io.sentry.SpanStatus;
import io.sentry.TransactionContext;
import io.sentry.TransactionOptions;
import io.sentry.protocol.TransactionNameSource;
import io.sentry.util.Objects;
import java.io.Closeable;
import java.io.IOException;
Expand Down Expand Up @@ -160,26 +163,33 @@ private void startTracing(final @NotNull Activity activity) {

// in case appStartTime isn't available, we don't create a span for it.
if (firstActivityCreated || appStartTime == null || coldStart == null) {
final TransactionOptions transactionOptions = new TransactionOptions();

transactionOptions.setWaitForChildren(true);
transactionOptions.setTransactionFinishedCallback(
(finishingTransaction) -> {
activityFramesTracker.setMetrics(activity, finishingTransaction.getEventId());
});

transaction =
hub.startTransaction(
activityName,
UI_LOAD_OP,
(Date) null,
true,
(finishingTransaction) -> {
activityFramesTracker.setMetrics(activity, finishingTransaction.getEventId());
});
new TransactionContext(activityName, TransactionNameSource.COMPONENT, UI_LOAD_OP),
transactionOptions);
} else {
// start transaction with app start timestamp
final TransactionOptions transactionOptions = new TransactionOptions();

transactionOptions.setStartTimestamp(appStartTime);
transactionOptions.setWaitForChildren(true);
transactionOptions.setTransactionFinishedCallback(
(finishingTransaction) -> {
activityFramesTracker.setMetrics(activity, finishingTransaction.getEventId());
});

transaction =
hub.startTransaction(
activityName,
UI_LOAD_OP,
appStartTime,
true,
(finishingTransaction) -> {
activityFramesTracker.setMetrics(activity, finishingTransaction.getEventId());
});
new TransactionContext(activityName, TransactionNameSource.COMPONENT, UI_LOAD_OP),
transactionOptions);
// start specific span for app start

appStartSpan =
Expand Down
Expand Up @@ -16,7 +16,10 @@
import io.sentry.Scope;
import io.sentry.SentryLevel;
import io.sentry.SpanStatus;
import io.sentry.TransactionContext;
import io.sentry.TransactionOptions;
import io.sentry.android.core.SentryAndroidOptions;
import io.sentry.protocol.TransactionNameSource;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.Map;
Expand Down Expand Up @@ -249,8 +252,15 @@ private void startTracing(final @NotNull View target, final @NotNull String even
// we can only bind to the scope if there's no running transaction
final String name = getActivityName(activity) + "." + viewId;
final String op = UI_ACTION + "." + eventType;

final TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.setWaitForChildren(true);
transactionOptions.setIdleTimeout(options.getIdleTimeout());
transactionOptions.setTrimEnd(true);

final ITransaction transaction =
hub.startTransaction(name, op, true, options.getIdleTimeout(), true);
hub.startTransaction(
new TransactionContext(name, TransactionNameSource.COMPONENT, op), transactionOptions);

hub.configureScope(
scope -> {
Expand Down
Expand Up @@ -23,6 +23,8 @@ import io.sentry.SpanStatus
import io.sentry.TraceContext
import io.sentry.TransactionContext
import io.sentry.TransactionFinishedCallback
import io.sentry.TransactionOptions
import io.sentry.protocol.TransactionNameSource
import java.util.Date
import kotlin.test.BeforeTest
import kotlin.test.Test
Expand Down Expand Up @@ -51,7 +53,7 @@ class ActivityLifecycleIntegrationTest {

fun getSut(apiVersion: Int = 29, importance: Int = RunningAppProcessInfo.IMPORTANCE_FOREGROUND): ActivityLifecycleIntegration {
whenever(hub.options).thenReturn(options)
whenever(hub.startTransaction(any(), any(), anyOrNull(), any(), any<TransactionFinishedCallback>())).thenReturn(transaction)
whenever(hub.startTransaction(any(), any<TransactionOptions>())).thenReturn(transaction)
whenever(buildInfo.sdkInfoVersion).thenReturn(apiVersion)

whenever(application.getSystemService(any())).thenReturn(am)
Expand Down Expand Up @@ -251,7 +253,7 @@ class ActivityLifecycleIntegrationTest {
val activity = mock<Activity>()
sut.onActivityCreated(activity, fixture.bundle)

verify(fixture.hub, never()).startTransaction(any(), any(), anyOrNull(), any(), any<TransactionFinishedCallback>())
verify(fixture.hub, never()).startTransaction(any(), any<TransactionOptions>())
}

@Test
Expand All @@ -264,7 +266,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityCreated(activity, fixture.bundle)

verify(fixture.hub).startTransaction(any(), any(), anyOrNull(), any(), any<TransactionFinishedCallback>())
verify(fixture.hub).startTransaction(any(), any<TransactionOptions>())
}

@Test
Expand All @@ -279,11 +281,11 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityCreated(activity, fixture.bundle)

verify(fixture.hub).startTransaction(
any(),
check {
assertEquals("ui.load", it)
assertEquals("ui.load", it.operation)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
anyOrNull(), any(), any<TransactionFinishedCallback>()
any<TransactionOptions>()
)
}

Expand Down Expand Up @@ -312,9 +314,10 @@ class ActivityLifecycleIntegrationTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity", it)
assertEquals("Activity", it.name)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any(), anyOrNull(), any(), any<TransactionFinishedCallback>()
any<TransactionOptions>()
)
}

Expand Down Expand Up @@ -532,7 +535,7 @@ class ActivityLifecycleIntegrationTest {
val activity = mock<Activity>()
sut.onActivityCreated(activity, mock())

verify(fixture.hub).startTransaction(any(), any(), anyOrNull(), any(), any<TransactionFinishedCallback>())
verify(fixture.hub).startTransaction(any(), any<TransactionOptions>())
}

@Test
Expand Down Expand Up @@ -631,7 +634,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityCreated(activity, fixture.bundle)

// call only once
verify(fixture.hub).startTransaction(any(), any(), eq(date), any(), any())
verify(fixture.hub).startTransaction(any(), check<TransactionOptions> { assertEquals(date, it.startTimestamp) })
}

@Test
Expand All @@ -647,7 +650,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityCreated(activity, fixture.bundle)

// call only once
verify(fixture.hub).startTransaction(any(), any(), eq(null), any(), any())
verify(fixture.hub).startTransaction(any(), check<TransactionOptions> { assertNull(it.startTimestamp) })
}

@Test
Expand Down Expand Up @@ -730,15 +733,15 @@ class ActivityLifecycleIntegrationTest {
val activity = mock<Activity>()
sut.onActivityCreated(activity, fixture.bundle)

verify(fixture.hub).startTransaction(any(), any(), eq(date), any(), any())
verify(fixture.hub).startTransaction(any(), check<TransactionOptions> { assertEquals(date, it.startTimestamp) })
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityPostResumed(activity)

val newActivity = mock<Activity>()
sut.onActivityCreated(newActivity, fixture.bundle)

val nullDate: Date? = null
verify(fixture.hub).startTransaction(any(), any(), eq(nullDate), any(), any())
verify(fixture.hub).startTransaction(any(), check<TransactionOptions> { assertNull(it.startTimestamp) })
}

@Test
Expand Down
Expand Up @@ -10,7 +10,6 @@ import android.view.Window
import android.widget.AbsListView
import android.widget.ListAdapter
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.anyOrNull
import com.nhaarman.mockitokotlin2.check
import com.nhaarman.mockitokotlin2.clearInvocations
import com.nhaarman.mockitokotlin2.mock
Expand All @@ -22,7 +21,9 @@ import io.sentry.Scope
import io.sentry.SentryTracer
import io.sentry.SpanStatus
import io.sentry.TransactionContext
import io.sentry.TransactionOptions
import io.sentry.android.core.SentryAndroidOptions
import io.sentry.protocol.TransactionNameSource
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
Expand Down Expand Up @@ -72,7 +73,7 @@ class SentryGestureListenerTracingTest {

whenever(activity.window).thenReturn(window)

whenever(hub.startTransaction(any(), any(), any(), anyOrNull(), any<Boolean>()))
whenever(hub.startTransaction(any(), any<TransactionOptions>()))
.thenReturn(transaction)
whenever(hub.options).thenReturn(options)
return SentryGestureListener(
Expand All @@ -93,7 +94,7 @@ class SentryGestureListenerTracingTest {
sut.onSingleTapUp(fixture.event)

verify(fixture.hub, never()).startTransaction(
any(), anyOrNull(), any(), anyOrNull(), any<Boolean>()
any(), any<TransactionOptions>()
)
}

Expand All @@ -104,7 +105,7 @@ class SentryGestureListenerTracingTest {
sut.onSingleTapUp(fixture.event)

verify(fixture.hub, never()).startTransaction(
any(), anyOrNull(), any(), anyOrNull(), any<Boolean>()
any(), any<TransactionOptions>()
)
}

Expand All @@ -115,7 +116,7 @@ class SentryGestureListenerTracingTest {
sut.onSingleTapUp(fixture.event)

verify(fixture.hub, never()).startTransaction(
any(), anyOrNull(), any(), anyOrNull(), any<Boolean>()
any(), any<TransactionOptions>()
)
}

Expand Down Expand Up @@ -184,9 +185,10 @@ class SentryGestureListenerTracingTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity.test_button", it)
assertEquals("Activity.test_button", it.name)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
anyOrNull(), any(), anyOrNull(), any<Boolean>()
any<TransactionOptions>()
)
}

Expand All @@ -197,8 +199,11 @@ class SentryGestureListenerTracingTest {
sut.onSingleTapUp(fixture.event)

verify(fixture.hub).startTransaction(
any(), check { assertEquals("ui.action.click", it) }, any(),
anyOrNull(), any<Boolean>()
check {
assertEquals("ui.action.click", it.operation)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any<TransactionOptions>()
)
}

Expand All @@ -211,9 +216,10 @@ class SentryGestureListenerTracingTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity.test_button", it)
assertEquals("Activity.test_button", it.name)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any(), any(), anyOrNull(), any<Boolean>()
any<TransactionOptions>()
)

clearInvocations(fixture.hub)
Expand All @@ -229,7 +235,7 @@ class SentryGestureListenerTracingTest {
whenever(it.getChildAt(0)).thenReturn(newTarget)
}

whenever(fixture.hub.startTransaction(any(), any(), any(), anyOrNull(), any<Boolean>()))
whenever(fixture.hub.startTransaction(any(), any<TransactionOptions>()))
.thenAnswer {
// verify that the active transaction gets finished when a new one appears
assertEquals(true, fixture.transaction.isFinished)
Expand All @@ -240,9 +246,10 @@ class SentryGestureListenerTracingTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity.test_checkbox", it)
assertEquals("Activity.test_checkbox", it.name)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any(), any(), anyOrNull(), any<Boolean>()
any<TransactionOptions>()
)
}

Expand All @@ -254,18 +261,17 @@ class SentryGestureListenerTracingTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity.test_scroll_view", it)
},
check {
assertEquals("ui.action.click", it)
assertEquals("Activity.test_scroll_view", it.name)
assertEquals("ui.action.click", it.operation)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any(), anyOrNull(), any<Boolean>()
any<TransactionOptions>()
)

clearInvocations(fixture.hub)

// second view interaction with a different interaction type (scroll)
whenever(fixture.hub.startTransaction(any(), any(), any(), anyOrNull(), any<Boolean>()))
whenever(fixture.hub.startTransaction(any(), any<TransactionOptions>()))
.thenAnswer {
// verify that the active transaction gets finished when a new one appears
assertEquals(true, fixture.transaction.isFinished)
Expand All @@ -277,12 +283,11 @@ class SentryGestureListenerTracingTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity.test_scroll_view", it)
},
check {
assertEquals("ui.action.scroll", it)
assertEquals("Activity.test_scroll_view", it.name)
assertEquals("ui.action.scroll", it.operation)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any(), anyOrNull(), any<Boolean>()
any<TransactionOptions>()
)
}

Expand All @@ -296,9 +301,10 @@ class SentryGestureListenerTracingTest {

verify(fixture.hub).startTransaction(
check {
assertEquals("Activity.test_button", it)
assertEquals("Activity.test_button", it.name)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
},
any(), any(), anyOrNull(), any<Boolean>()
any<TransactionOptions>()
)

// second view interaction
Expand Down