Skip to content

Commit

Permalink
feat(reactnative): add support for the correlation fields to the Re…
Browse files Browse the repository at this point in the history
…actNative EventDeserializer
  • Loading branch information
lemnik committed Jun 28, 2024
1 parent b541fca commit 95e7a6e
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.bugsnag.android

import java.util.UUID

internal class EventDeserializer(
private val client: Client,
private val projectPackages: Collection<String>
Expand Down Expand Up @@ -86,17 +88,61 @@ internal class EventDeserializer(
metadata.forEach {
event.addMetadata(it.key, it.value as Map<String, Any>)
}

val correlation = map["correlation"] as? Map<String, Any?>
correlation?.let {
deserializeCorrelation(it, event)
}

return event
}

private fun deserializeCorrelation(
correlation: Map<String, Any?>,
event: Event
) {
val traceId = (correlation["traceId"] as? String)
?.takeIf { it.length == TRACE_ID_LENGTH }
?.let {
val mostSigBits = it.substring(0, HEX_LONG_LENGTH).hexToLong()
val leastSigBits = it.substring(HEX_LONG_LENGTH).hexToLong()

if (mostSigBits != null && leastSigBits != null) {
UUID(mostSigBits, leastSigBits)
} else {
null
}
}
val spanId = (correlation["spanId"] as? String)
?.takeIf { it.length == HEX_LONG_LENGTH }
?.hexToLong()

if (traceId != null && spanId != null) {
event.setTraceCorrelation(traceId, spanId)
}
}

private fun getOriginalUnhandled(
map: Map<String, Any>,
unhandled: Boolean
): Boolean {
val unhandledOverridden = map.getOrElse("unhandledOverridden", { false }) as Boolean
val unhandledOverridden = (map.getOrElse("unhandledOverridden") { false }) as Boolean
return when {
unhandledOverridden -> !unhandled
else -> unhandled
}
}

@Suppress("MagicNumber")
private fun String.hexToLong(): Long? {
if (length != HEX_LONG_LENGTH || this[0] == '-' || this[3] == '-') return null
val firstByte = this.substring(0, 2).toLongOrNull(HEX_LONG_LENGTH) ?: return null
val remaining = this.substring(2).toLongOrNull(HEX_LONG_LENGTH) ?: return null
return (firstByte shl 56) or remaining
}

companion object {
private const val TRACE_ID_LENGTH = 32
private const val HEX_LONG_LENGTH = 16
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnitRunner
import java.util.Date
import java.util.UUID

@RunWith(MockitoJUnitRunner::class)
class EventDeserializerTest {
Expand Down Expand Up @@ -39,6 +40,10 @@ class EventDeserializerTest {
map["app"] = mapOf(Pair("id", "app-id"))
map["device"] =
mapOf(Pair("id", "device-id"), Pair("runtimeVersions", mutableMapOf<String, Any>()))
map["correlation"] = mapOf(
"traceId" to "b39e53513eec3c68b5e5c34dc43611e0",
"spanId" to "51d886b3a693a406"
)

`when`(client.config).thenReturn(TestData.generateConfig())
`when`(client.getLogger()).thenReturn(object : Logger {})
Expand Down Expand Up @@ -91,6 +96,13 @@ class EventDeserializerTest {
assertEquals("device-id", event.device.id)
assertEquals("123", event.getMetadata("custom", "id"))
assertEquals(TestData.generateConfig().apiKey, event.apiKey)

assertEquals(
UUID(-5503870086187041688L, -5339647044406079008L),
TestHooks.getCorrelatedTraceId(event)
)

assertEquals(5897611818193626118L, TestHooks.getCorrelatedSpanId(event))
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
package com.bugsnag.android;

import androidx.annotation.Nullable;

import java.util.UUID;

class TestHooks {
static boolean getUnhandledOverridden(Event event) {
return event.getImpl().getUnhandledOverridden();
}

@Nullable
static UUID getCorrelatedTraceId(Event event) {
TraceCorrelation traceCorrelation = event.getImpl().getTraceCorrelation();
return traceCorrelation != null ? traceCorrelation.getTraceId() : null;
}

@Nullable
static Long getCorrelatedSpanId(Event event) {
TraceCorrelation traceCorrelation = event.getImpl().getTraceCorrelation();
return traceCorrelation != null ? traceCorrelation.getSpanId() : null;
}

static MetadataState generateMetadataState() {
return new MetadataState();
}
Expand Down

0 comments on commit 95e7a6e

Please sign in to comment.