diff --git a/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt b/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt index a405229f6..82fec64d7 100644 --- a/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt +++ b/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt @@ -39,6 +39,9 @@ import com.datadog.android.rum.GlobalRumMonitor import com.datadog.android.rum.Rum import com.datadog.android.rum.RumConfiguration import com.datadog.android.rum.tracking.AcceptAllNavDestinations +import com.datadog.android.sessionreplay.SessionReplay +import com.datadog.android.sessionreplay.SessionReplayConfiguration +import com.datadog.android.sessionreplay.compose.ComposeExtensionSupport import com.datadog.android.timber.DatadogTree import com.datadog.android.trace.AndroidTracer import com.datadog.android.trace.Trace @@ -188,12 +191,20 @@ open class GeeksvilleApplication : val tracer = AndroidTracer.Builder().build() GlobalTracer.registerIfAbsent(tracer) + val sessionReplayConfig = + SessionReplayConfiguration.Builder(sampleRate = 20.0f) + // in case you need Jetpack Compose support + .addExtensionSupport(ComposeExtensionSupport()) + .build() + + SessionReplay.enable(sessionReplayConfig) + Timber.plant(Timber.DebugTree(), DatadogTree(logger)) } } fun setAttributes(firmwareVersion: String, deviceHardware: DeviceHardware) { - GlobalRumMonitor.get().addAttribute("firmware_version", firmwareVersion) + GlobalRumMonitor.get().addAttribute("firmware_version", firmwareVersion.extractSemanticVersion()) GlobalRumMonitor.get().addAttribute("device_hardware", deviceHardware.hwModelSlug) } @@ -212,3 +223,11 @@ fun AddNavigationTracking(navController: NavHostController) { destinationPredicate = AcceptAllNavDestinations(), ) } + +fun String.extractSemanticVersion(): String { + // Regex to capture up to three numeric parts separated by dots + val regex = """^(\d+)(?:\.(\d+))?(?:\.(\d+))?""".toRegex() + val matchResult = regex.find(this) + return matchResult?.groupValues?.drop(1)?.filter { it.isNotEmpty() }?.joinToString(".") + ?: this // Fallback to original if no match +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b883f9b2f..76e06c9f8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -92,6 +92,8 @@ dd-sdk-android-gradle-plugin = { group = "com.datadoghq", name = "dd-sdk-android dd-sdk-android-logs = { group = "com.datadoghq", name = "dd-sdk-android-logs", version.ref = "dd-sdk-android" } dd-sdk-android-okhttp = { group = "com.datadoghq", name = "dd-sdk-android-okhttp", version.ref = "dd-sdk-android" } dd-sdk-android-rum = { group = "com.datadoghq", name = "dd-sdk-android-rum", version.ref = "dd-sdk-android" } +dd-sdk-android-session-replay = { group = "com.datadoghq", name = "dd-sdk-android-session-replay", version.ref = "dd-sdk-android" } +dd-sdk-android-session-replay-compose = { group = "com.datadoghq", name = "dd-sdk-android-session-replay-compose", version.ref = "dd-sdk-android" } dd-sdk-android-timber = { group = "com.datadoghq", name = "dd-sdk-android-timber", version.ref = "dd-sdk-android" } dd-sdk-android-trace = { group = "com.datadoghq", name = "dd-sdk-android-trace", version.ref = "dd-sdk-android" } detekt-formatting = { group = "io.gitlab.arturbosch.detekt", name = "detekt-formatting", version.ref = "detekt" } @@ -195,7 +197,7 @@ osm = ["osmdroid-android", "osmbonuspack", "mgrs"] firebase = ["firebase-analytics", "firebase-crashlytics"] # Datadog -datadog = ["dd-sdk-android-compose", "dd-sdk-android-logs", "dd-sdk-android-okhttp", "dd-sdk-android-rum", "dd-sdk-android-timber", "dd-sdk-android-trace"] +datadog = ["dd-sdk-android-compose", "dd-sdk-android-logs", "dd-sdk-android-okhttp", "dd-sdk-android-rum", "dd-sdk-android-session-replay", "dd-sdk-android-session-replay-compose", "dd-sdk-android-timber", "dd-sdk-android-trace"] # Protobuf protobuf = ["protobuf-kotlin"]