Skip to content

Commit

Permalink
Merge pull request #1397 from embrace-io/telemetry-prioritisation
Browse files Browse the repository at this point in the history
Implement prioritisation of stored telemetry
  • Loading branch information
fractalwrench authored Sep 23, 2024
2 parents a9c6a60 + 8ad02d6 commit 2dc5f93
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.embrace.android.embracesdk.internal.delivery

/**
* Compares [StoredTelemetryMetadata] in priority order. Our priority rules are:
*
* Crash > Session
* Session > Log
* Log > Network
* Otherwise, older timestamps take precedence as they are more likely to get deleted if the SDK
* runs out of disk space.
*
* We considered the possibility of starvation & scoring payloads based on age, but we decided
* that crashes/sessions are generally far more important so should always be delivered first.
*/
internal object StoredTelemetryComparator : Comparator<StoredTelemetryMetadata> {

override fun compare(lhs: StoredTelemetryMetadata, rhs: StoredTelemetryMetadata): Int {
return compareBy(StoredTelemetryMetadata::envelopeType)
.thenBy(StoredTelemetryMetadata::timestamp)
.compare(lhs, rhs)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import kotlin.Result.Companion.failure
class StoredTelemetryMetadata(
val timestamp: Long,
val uuid: String,
val type: SupportedEnvelopeType,
val filename: String = "v1_${timestamp}_${type.description}_$uuid.json"
val envelopeType: SupportedEnvelopeType,
val filename: String = "v1_${timestamp}_${envelopeType.description}_$uuid.json"
) {

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import java.lang.reflect.Type
* Enumerates the different types of telemetry that are supported when persisting to disk.
*/
enum class SupportedEnvelopeType(
val type: Type,
val serializedType: Type,
val description: String
) {

SESSION(Envelope.sessionEnvelopeType, "session"),
CRASH(Envelope.logEnvelopeType, "crash"),
SESSION(Envelope.sessionEnvelopeType, "session"),
LOG(Envelope.logEnvelopeType, "log"),
NETWORK(Envelope.logEnvelopeType, "network");

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.embrace.android.embracesdk.internal.delivery

import io.embrace.android.embracesdk.internal.delivery.SupportedEnvelopeType.CRASH
import io.embrace.android.embracesdk.internal.delivery.SupportedEnvelopeType.LOG
import io.embrace.android.embracesdk.internal.delivery.SupportedEnvelopeType.NETWORK
import io.embrace.android.embracesdk.internal.delivery.SupportedEnvelopeType.SESSION
import org.junit.Assert.assertEquals
import org.junit.Test

class StoredTelemetryComparatorTest {

private val crash = StoredTelemetryMetadata(1, "crash", CRASH)
private val session = StoredTelemetryMetadata(1, "session", SESSION)
private val session2 = StoredTelemetryMetadata(100, "session2", SESSION)
private val session3 = StoredTelemetryMetadata(1000, "session3", SESSION)
private val log = StoredTelemetryMetadata(1, "log", LOG)
private val network = StoredTelemetryMetadata(1, "network", NETWORK)

@Test
fun `sort values`() {
val result = listOf(network, log, session2, crash, session3, session)
.sortedWith(StoredTelemetryComparator)
.map(StoredTelemetryMetadata::uuid)
val expected = listOf(crash, session, session2, session3, log, network)
.map(StoredTelemetryMetadata::uuid)
assertEquals(expected, result)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class StoredTelemetryMetadataTest {
assertEquals(input, filename)
assertEquals(TIMESTAMP, timestamp)
assertEquals(UUID, uuid)
assertEquals(type, this.type)
assertEquals(type, this.envelopeType)
}
}
}
Expand Down

0 comments on commit 2dc5f93

Please sign in to comment.