Skip to content

Commit e2ac120

Browse files
Wire in correct session ids for native crashes (#3275)
* fix: rate limit manual end via user session * persist inactivity timeout for user sessions * return correct ID in SdkStateApiDelegate * refactor: alter timer syntax * refactor inactivity timeout * update semantic conventions * enforce manual session end requirements correctly * handle backwards time shift * support correct session ordinals * wire through session ids * refactor: prevent setting part id without user session id * wire in correct session ids for native crashes
1 parent 3ced05c commit e2ac120

13 files changed

Lines changed: 46 additions & 34 deletions

File tree

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/envelope/log/LogEnvelopeSourceImpl.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import io.embrace.android.embracesdk.internal.payload.Envelope
1111
import io.embrace.android.embracesdk.internal.payload.Envelope.Companion.createLogEnvelope
1212
import io.embrace.android.embracesdk.internal.payload.LogPayload
1313
import io.embrace.android.embracesdk.semconv.EmbSessionAttributes
14-
import io.opentelemetry.kotlin.semconv.SessionAttributes
1514

1615
internal class LogEnvelopeSourceImpl(
1716
private val metadataSource: EnvelopeMetadataSource,
@@ -40,7 +39,7 @@ internal class LogEnvelopeSourceImpl(
4039
val nativeCrash = payload.logs?.firstOrNull()
4140
val envelope = cachedLogEnvelopeStore.get(
4241
createNativeCrashEnvelopeMetadata(
43-
sessionId = nativeCrash?.attributes?.findAttributeValue(SessionAttributes.SESSION_ID),
42+
sessionPartId = nativeCrash?.attributes?.findAttributeValue(EmbSessionAttributes.EMB_SESSION_PART_ID),
4443
processIdentifier = nativeCrash?.attributes?.findAttributeValue(EmbSessionAttributes.EMB_PROCESS_IDENTIFIER)
4544
)
4645
)

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/resurrection/PayloadResurrectionServiceImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ internal class PayloadResurrectionServiceImpl(
6969
val nativeCrashService = nativeCrashServiceProvider()
7070
val undeliveredPayloads = cacheStorageService.getUndeliveredPayloads()
7171
val payloadsToResurrect = undeliveredPayloads.filterNot { it.isCrashEnvelope() }
72-
val nativeCrashes = nativeCrashService?.getNativeCrashes()?.associateBy { it.sessionId } ?: emptyMap()
72+
val nativeCrashes = nativeCrashService?.getNativeCrashes()?.associateBy { it.sessionPartId } ?: emptyMap()
7373
val processedCrashes = mutableSetOf<NativeCrashData>()
7474

7575
payloadsToResurrect.forEach { payload ->
@@ -126,7 +126,7 @@ internal class PayloadResurrectionServiceImpl(
126126
if (resource != null && metadata != null) {
127127
cachedLogEnvelopeStore.create(
128128
storedTelemetryMetadata = createNativeCrashEnvelopeMetadata(
129-
sessionId = nativeCrash.sessionId
129+
sessionPartId = nativeCrash.sessionPartId
130130
),
131131
resource = resource,
132132
metadata = metadata
@@ -180,7 +180,7 @@ internal class PayloadResurrectionServiceImpl(
180180
val nativeCrash = if (nativeCrashService != null && sessionId != null) {
181181
nativeCrashProvider(sessionId)?.apply {
182182
val nativeCrashEnvelopeMetadata = createNativeCrashEnvelopeMetadata(
183-
sessionId = sessionId,
183+
sessionPartId = sessionId,
184184
processIdentifier = processIdentifier
185185
)
186186

@@ -269,7 +269,7 @@ internal class PayloadResurrectionServiceImpl(
269269
* Attach crash data to the existing session span in the payload if it exists
270270
*/
271271
private fun Span.attachCrashToSession(nativeCrashData: NativeCrashData): Span {
272-
return if (attributes?.findAttributeValue(SessionAttributes.SESSION_ID) == nativeCrashData.sessionId) {
272+
return if (attributes?.findAttributeValue(SessionAttributes.SESSION_ID) == nativeCrashData.sessionPartId) {
273273
copy(
274274
attributes = attributes?.plus(
275275
Attribute(

embrace-android-core/src/test/kotlin/io/embrace/android/embracesdk/internal/envelope/log/LogEnvelopeSourceImplTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import io.embrace.android.embracesdk.internal.otel.logs.LogRequest
1717
import io.embrace.android.embracesdk.internal.otel.sdk.findAttributeValue
1818
import io.embrace.android.embracesdk.internal.payload.LogPayload
1919
import io.embrace.android.embracesdk.semconv.EmbSessionAttributes
20-
import io.opentelemetry.kotlin.semconv.SessionAttributes
2120
import org.junit.Assert.assertEquals
2221
import org.junit.Assert.assertTrue
2322
import org.junit.Before
@@ -97,10 +96,10 @@ internal class LogEnvelopeSourceImplTest {
9796
fun `check native crash envelope`() {
9897
val crashPayload = LogPayload(logs = listOf(nativeCrashLog))
9998
val crashLogAttributes = checkNotNull(nativeCrashLog.attributes)
100-
val expectedSessionId = crashLogAttributes.findAttributeValue(SessionAttributes.SESSION_ID)
99+
val expectedSessionId = crashLogAttributes.findAttributeValue(EmbSessionAttributes.EMB_SESSION_PART_ID)
101100
val expectedProcessIdentifier = crashLogAttributes.findAttributeValue(EmbSessionAttributes.EMB_PROCESS_IDENTIFIER)
102101
val cachedCrashEnvelopeMetadata = createNativeCrashEnvelopeMetadata(
103-
sessionId = expectedSessionId,
102+
sessionPartId = expectedSessionId,
104103
processIdentifier = expectedProcessIdentifier,
105104
)
106105
logSource.singleLogPayloadsSource = listOf(

embrace-android-core/src/test/kotlin/io/embrace/android/embracesdk/internal/resurrection/PayloadResurrectionServiceImplTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ class PayloadResurrectionServiceImplTest {
496496
sessionId: String,
497497
) = NativeCrashData(
498498
nativeCrashId = nativeCrashId,
499-
sessionId = sessionId,
499+
sessionPartId = sessionId,
500500
timestamp = 0L,
501501
crash = null,
502502
symbols = null,

embrace-android-delivery/src/main/kotlin/io/embrace/android/embracesdk/internal/delivery/storage/CachedLogEnvelopeStore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ interface CachedLogEnvelopeStore {
3737

3838
companion object {
3939
fun createNativeCrashEnvelopeMetadata(
40-
sessionId: String? = null,
40+
sessionPartId: String? = null,
4141
processIdentifier: String? = null,
4242
) = StoredTelemetryMetadata(
4343
timestamp = 0L,
44-
uuid = sessionId ?: "none",
44+
uuid = sessionPartId ?: "none",
4545
processIdentifier = processIdentifier ?: "none",
4646
envelopeType = SupportedEnvelopeType.CRASH,
4747
payloadType = PayloadType.NATIVE_CRASH,

embrace-android-delivery/src/test/kotlin/io/embrace/android/embracesdk/internal/delivery/storage/CachedLogEnvelopeStoreImplTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class CachedLogEnvelopeStoreImplTest {
5151
)
5252

5353
val anotherCrashMetadata = createNativeCrashEnvelopeMetadata(
54-
sessionId = "another-session",
54+
sessionPartId = "another-session",
5555
processIdentifier = "another-process"
5656
)
5757

@@ -69,7 +69,7 @@ class CachedLogEnvelopeStoreImplTest {
6969

7070
companion object {
7171
val fakeNativeCrashEnvelope = createNativeCrashEnvelopeMetadata(
72-
sessionId = "old-session-id",
72+
sessionPartId = "old-session-id",
7373
processIdentifier = "old-process-id"
7474
)
7575
}

embrace-android-instrumentation-crash-ndk/src/main/kotlin/io/embrace/android/embracesdk/internal/instrumentation/crash/ndk/NativeCrashDataSourceImpl.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,20 @@ internal class NativeCrashDataSourceImpl(
3838
val nativeCrashNumber = args.ordinalStore.incrementAndGet(Ordinal.NATIVE_CRASH)
3939
val crashAttributes = TelemetryAttributes().apply {
4040
setAttribute(
41-
key = SessionAttributes.SESSION_ID,
42-
value = nativeCrash.sessionId,
41+
key = EmbSessionAttributes.EMB_SESSION_PART_ID,
42+
value = nativeCrash.sessionPartId,
4343
keepBlankishValues = false,
4444
)
4545

46-
nativeCrash.userSessionId?.let {
46+
nativeCrash.userSessionId?.let { userSessionId ->
47+
setAttribute(
48+
key = SessionAttributes.SESSION_ID,
49+
value = userSessionId,
50+
keepBlankishValues = false,
51+
)
4752
setAttribute(
4853
key = EmbSessionAttributes.EMB_USER_SESSION_ID,
49-
value = it,
54+
value = userSessionId,
5055
keepBlankishValues = false,
5156
)
5257
}

embrace-android-instrumentation-crash-ndk/src/test/kotlin/io/embrace/android/embracesdk/internal/instrumentation/crash/ndk/NativeCrashDataSourceImplTest.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ internal class NativeCrashDataSourceImplTest {
5959
assertEquals("value", attributes[sessionPropertyName])
6060
assertEquals("background", attributes[EmbSessionAttributes.EMB_STATE])
6161
assertEquals(
62-
testNativeCrashData.sessionId,
62+
testNativeCrashData.sessionPartId,
63+
attributes[EmbSessionAttributes.EMB_SESSION_PART_ID]
64+
)
65+
assertEquals(
66+
testNativeCrashData.userSessionId,
6367
attributes[SessionAttributes.SESSION_ID]
6468
)
6569
assertEquals(
@@ -81,7 +85,7 @@ internal class NativeCrashDataSourceImplTest {
8185
nativeCrashDataSource.sendNativeCrash(
8286
nativeCrash = NativeCrashData(
8387
nativeCrashId = "nativeCrashId",
84-
sessionId = "null",
88+
sessionPartId = "null",
8589
timestamp = 1700000000000,
8690
crash = null,
8791
symbols = null,
@@ -94,6 +98,9 @@ internal class NativeCrashDataSourceImplTest {
9498
val attributes = schemaType.attributes()
9599
assertEquals(EmbType.System.NativeCrash, schemaType.telemetryType)
96100
assertEquals("1", attributes[EmbAndroidAttributes.EMB_ANDROID_CRASH_NUMBER])
101+
assertNull(attributes[EmbSessionAttributes.EMB_SESSION_PART_ID])
102+
assertNull(attributes[SessionAttributes.SESSION_ID])
103+
assertNull(attributes[EmbSessionAttributes.EMB_USER_SESSION_ID])
97104
assertNull(attributes[embNativeCrashException])
98105
assertNull(attributes[embNativeCrashSymbols])
99106
}
@@ -104,7 +111,7 @@ internal class NativeCrashDataSourceImplTest {
104111
nativeCrashDataSource.sendNativeCrash(
105112
nativeCrash = NativeCrashData(
106113
nativeCrashId = "nativeCrashId",
107-
sessionId = "",
114+
sessionPartId = "",
108115
timestamp = 1700000000000,
109116
crash = "",
110117
symbols = emptyMap(),
@@ -117,6 +124,9 @@ internal class NativeCrashDataSourceImplTest {
117124
val attributes = schemaType.attributes()
118125
assertEquals(EmbType.System.NativeCrash, schemaType.telemetryType)
119126
assertEquals("1", attributes[EmbAndroidAttributes.EMB_ANDROID_CRASH_NUMBER])
127+
assertNull(attributes[EmbSessionAttributes.EMB_SESSION_PART_ID])
128+
assertNull(attributes[SessionAttributes.SESSION_ID])
129+
assertNull(attributes[EmbSessionAttributes.EMB_USER_SESSION_ID])
120130
assertNull(attributes[EmbSessionAttributes.EMB_STATE])
121131
assertNull(attributes[embNativeCrashException])
122132
assertNull(attributes[embNativeCrashSymbols])
@@ -125,7 +135,7 @@ internal class NativeCrashDataSourceImplTest {
125135

126136
private val testNativeCrashData: NativeCrashData = NativeCrashData(
127137
nativeCrashId = "nativeCrashId",
128-
sessionId = "sessionId",
138+
sessionPartId = "sessionId",
129139
userSessionId = "userSessionId",
130140
timestamp = 1700000000000,
131141
crash = "base64binarystring",

embrace-android-otel-fakes/src/main/kotlin/io/embrace/android/embracesdk/fixtures/LogTestFixtures.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import io.embrace.android.embracesdk.internal.arch.schema.EmbType
66
import io.embrace.android.embracesdk.internal.arch.schema.SendMode
77
import io.embrace.android.embracesdk.internal.payload.Attribute
88
import io.embrace.android.embracesdk.internal.payload.Log
9-
import io.embrace.android.embracesdk.internal.payload.NativeCrashData
10-
import io.opentelemetry.kotlin.semconv.SessionAttributes
119

1210
val testLog: Log = Log(
1311
traceId = "ceadd56622414a06ae382e4e5a70bcf7",
@@ -44,7 +42,7 @@ val nativeCrashLog = Log(
4442
attributes = listOf(
4543
Attribute(EmbSessionAttributes.EMB_PRIVATE_SEND_MODE, SendMode.IMMEDIATE.name),
4644
EmbType.System.NativeCrash.toPayload(),
47-
Attribute(SessionAttributes.SESSION_ID, "bb6b5b1ea2ff48928382fe81d7991ced"),
45+
Attribute(EmbSessionAttributes.EMB_SESSION_PART_ID, "bb6b5b1ea2ff48928382fe81d7991ced"),
4846
Attribute(EmbSessionAttributes.EMB_PROCESS_IDENTIFIER, "8115ec91-3e5e-4d8a-816d-cc40306f9822"),
4947
)
5048
)

embrace-android-payload/src/main/kotlin/io/embrace/android/embracesdk/internal/payload/NativeCrashData.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.squareup.moshi.JsonClass
66
@JsonClass(generateAdapter = true)
77
data class NativeCrashData(
88
@Json(name = "report_id") val nativeCrashId: String,
9-
@Json(name = "sid") val sessionId: String,
9+
@Json(name = "sid") val sessionPartId: String,
1010
@Json(name = "usid") val userSessionId: String? = null,
1111
@Json(name = "ts") val timestamp: Long,
1212
@Json(name = "crash") val crash: String?,

0 commit comments

Comments
 (0)