Skip to content

Commit

Permalink
RUM-7643 Correctly handle TTNS when resource was stopped with error
Browse files Browse the repository at this point in the history
  • Loading branch information
mariusc83 committed Dec 10, 2024
1 parent 558855a commit b3b77fb
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ internal sealed class RumRawEvent {

internal data class ErrorSent(
val viewId: String,
val resourceId: String? = null,
val resourceEndTimestampInNanos: Long? = null,
override val eventTime: Time = Time()
) : RumRawEvent()

Expand All @@ -151,6 +153,7 @@ internal sealed class RumRawEvent {

internal data class ErrorDropped(
val viewId: String,
val resourceId: String? = null,
override val eventTime: Time = Time()
) : RumRawEvent()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,15 +139,15 @@ internal class RumResourceScope(
) {
if (key != event.key) return
attributes.putAll(event.attributes)
reportResourceStoppedMetric(event.eventTime.nanoTime)
sendError(
event.message,
event.source,
event.statusCode,
event.throwable.loggableStackTrace(),
event.throwable.javaClass.canonicalName,
ErrorEvent.Category.EXCEPTION,
writer
writer,
event.eventTime.nanoTime
)
}

Expand All @@ -157,7 +157,6 @@ internal class RumResourceScope(
writer: DataWriter<Any>
) {
if (key != event.key) return
reportResourceStoppedMetric(event.eventTime.nanoTime)
attributes.putAll(event.attributes)

val errorCategory =
Expand All @@ -170,7 +169,8 @@ internal class RumResourceScope(
event.stackTrace,
event.errorType,
errorCategory,
writer
writer,
event.eventTime.nanoTime
)
}

Expand Down Expand Up @@ -345,7 +345,8 @@ internal class RumResourceScope(
stackTrace: String?,
errorType: String?,
errorCategory: ErrorEvent.Category?,
writer: DataWriter<Any>
writer: DataWriter<Any>,
resourceStopTimestampInNanos: Long
) {
attributes.putAll(GlobalRumMonitor.get(sdkCore).getAttributes())
val errorFingerprint = attributes.remove(RumAttributes.ERROR_FINGERPRINT) as? String
Expand Down Expand Up @@ -446,10 +447,13 @@ internal class RumResourceScope(
)
}
.onError {
it.eventDropped(rumContext.viewId.orEmpty(), StorageEvent.Error)
it.eventDropped(
rumContext.viewId.orEmpty(),
StorageEvent.Error(resourceId, resourceStopTimestampInNanos)
)
}
.onSuccess {
it.eventSent(rumContext.viewId.orEmpty(), StorageEvent.Error)
it.eventSent(rumContext.viewId.orEmpty(), StorageEvent.Error(resourceId, resourceStopTimestampInNanos))
}
.submit()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -575,8 +575,8 @@ internal open class RumViewScope(
.apply {
if (!isFatal) {
// if fatal, then we don't have time for the notification, app is crashing
onError { it.eventDropped(rumContext.viewId.orEmpty(), StorageEvent.Error) }
onSuccess { it.eventSent(rumContext.viewId.orEmpty(), StorageEvent.Error) }
onError { it.eventDropped(rumContext.viewId.orEmpty(), StorageEvent.Error()) }
onSuccess { it.eventSent(rumContext.viewId.orEmpty(), StorageEvent.Error()) }
}
}
.submit()
Expand Down Expand Up @@ -774,6 +774,14 @@ internal open class RumViewScope(
if (event.viewId == viewId || event.viewId in oldViewIds) {
pendingErrorCount--
errorCount++
if (event.resourceId != null && event.resourceEndTimestampInNanos != null) {
networkSettledMetricResolver.resourceWasStopped(
InternalResourceContext(
event.resourceId,
event.resourceEndTimestampInNanos
)
)
}
sendViewUpdate(event, writer)
}
}
Expand All @@ -794,6 +802,9 @@ internal open class RumViewScope(
private fun onErrorDropped(event: RumRawEvent.ErrorDropped) {
if (event.viewId == viewId || event.viewId in oldViewIds) {
pendingErrorCount--
if (event.resourceId != null) {
networkSettledMetricResolver.resourceWasDropped(event.resourceId)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,14 @@ internal class DatadogRumMonitor(
)
)

is StorageEvent.Error -> handleEvent(RumRawEvent.ErrorSent(viewId))
is StorageEvent.Error -> handleEvent(
RumRawEvent.ErrorSent(
viewId,
event.resourceId,
event.resourceStopTimestampInNanos
)
)

is StorageEvent.LongTask -> handleEvent(RumRawEvent.LongTaskSent(viewId, false))
is StorageEvent.FrozenFrame -> handleEvent(RumRawEvent.LongTaskSent(viewId, true))
is StorageEvent.View -> {
Expand All @@ -587,7 +594,7 @@ internal class DatadogRumMonitor(
when (event) {
is StorageEvent.Action -> handleEvent(RumRawEvent.ActionDropped(viewId))
is StorageEvent.Resource -> handleEvent(RumRawEvent.ResourceDropped(viewId, event.resourceId))
is StorageEvent.Error -> handleEvent(RumRawEvent.ErrorDropped(viewId))
is StorageEvent.Error -> handleEvent(RumRawEvent.ErrorDropped(viewId, event.resourceId))
is StorageEvent.LongTask -> handleEvent(RumRawEvent.LongTaskDropped(viewId, false))
is StorageEvent.FrozenFrame -> handleEvent(RumRawEvent.LongTaskDropped(viewId, true))
is StorageEvent.View -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ internal sealed class StorageEvent {
val type: ActionEvent.ActionEventActionType,
val eventEndTimestampInNanos: Long
) : StorageEvent()

data class Resource(val resourceId: String, val resourceStopTimestampInNanos: Long) : StorageEvent()
object Error : StorageEvent()
data class Error(val resourceId: String? = null, val resourceStopTimestampInNanos: Long? = null) : StorageEvent()
object LongTask : StorageEvent()
object FrozenFrame : StorageEvent()
}
Original file line number Diff line number Diff line change
Expand Up @@ -1235,9 +1235,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1316,9 +1313,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1395,9 +1389,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1493,9 +1484,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1592,9 +1580,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1688,9 +1673,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1785,9 +1767,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1867,9 +1846,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -1949,9 +1925,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -2030,9 +2003,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -2112,9 +2082,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -2199,9 +2166,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -2286,9 +2250,6 @@ internal class RumResourceScopeTest {
}
verify(mockParentScope, never()).handleEvent(any(), any())
verifyNoMoreInteractions(mockWriter)
verify(mockNetworkSettledMetricResolver).resourceWasStopped(
InternalResourceContext(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
assertThat(result).isEqualTo(null)
}

Expand Down Expand Up @@ -2920,7 +2881,10 @@ internal class RumResourceScopeTest {

// Then
verify(rumMonitor.mockInstance as AdvancedRumMonitor)
.eventSent(fakeParentContext.viewId.orEmpty(), StorageEvent.Error)
.eventSent(
fakeParentContext.viewId.orEmpty(),
StorageEvent.Error(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
}

@Test
Expand Down Expand Up @@ -2949,7 +2913,10 @@ internal class RumResourceScopeTest {

// Then
verify(rumMonitor.mockInstance as AdvancedRumMonitor)
.eventDropped(fakeParentContext.viewId.orEmpty(), StorageEvent.Error)
.eventDropped(
fakeParentContext.viewId.orEmpty(),
StorageEvent.Error(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
}

@Test
Expand Down Expand Up @@ -2980,7 +2947,10 @@ internal class RumResourceScopeTest {

// Then
verify(rumMonitor.mockInstance as AdvancedRumMonitor)
.eventDropped(fakeParentContext.viewId.orEmpty(), StorageEvent.Error)
.eventDropped(
fakeParentContext.viewId.orEmpty(),
StorageEvent.Error(testedScope.resourceId, mockEvent.eventTime.nanoTime)
)
}

// endregion
Expand Down
Loading

0 comments on commit b3b77fb

Please sign in to comment.