Skip to content

Commit

Permalink
Configure Sentry crash reporting
Browse files Browse the repository at this point in the history
  • Loading branch information
sdsantos committed Sep 25, 2024
1 parent 7164ba4 commit e329aa4
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 1 deletion.
5 changes: 5 additions & 0 deletions composeApp/src/commonMain/kotlin/org/ooni/probe/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,14 @@ fun App(
}
}

Logger.addLogWriter(dependencies.crashMonitoring.logWriter)

LaunchedEffect(Unit) {
logAppStart(dependencies)
}
LaunchedEffect(Unit) {
dependencies.crashMonitoring.setup()
}
LaunchedEffect(Unit) {
dependencies.bootstrapTestDescriptors()
dependencies.bootstrapPreferences()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ import org.ooni.probe.domain.ShouldShowVpnWarning
import org.ooni.probe.domain.TestRunStateManager
import org.ooni.probe.domain.UploadMissingMeasurements
import org.ooni.probe.shared.PlatformInfo
import org.ooni.probe.shared.monitoring.CrashMonitoring
import org.ooni.probe.ui.dashboard.DashboardViewModel
import org.ooni.probe.ui.descriptor.DescriptorViewModel
import org.ooni.probe.ui.descriptor.add.AddDescriptorViewModel
Expand Down Expand Up @@ -118,6 +119,10 @@ class Dependencies(
private val writeFile: WriteFile by lazy { WriteFileOkio(FileSystem.SYSTEM, baseFileDir) }
private val deleteFiles: DeleteFiles by lazy { DeleteFilesOkio(FileSystem.SYSTEM, baseFileDir) }

// Monitoring

val crashMonitoring by lazy { CrashMonitoring(preferenceRepository) }

// Engine

private val taskEventMapper by lazy { TaskEventMapper(networkTypeFinder, json) }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package org.ooni.probe.shared.monitoring

import co.touchlab.kermit.LogWriter
import co.touchlab.kermit.Severity
import io.sentry.kotlin.multiplatform.Sentry
import io.sentry.kotlin.multiplatform.SentryLevel
import io.sentry.kotlin.multiplatform.protocol.Breadcrumb
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach
import org.ooni.probe.data.models.SettingsKey
import org.ooni.probe.data.repositories.PreferenceRepository

class CrashMonitoring(
private val preferencesRepository: PreferenceRepository,
) {
private var isEnabled = false

suspend fun setup() {
preferencesRepository.getValueByKey(SettingsKey.SEND_CRASH)
.onEach { sendCrash ->
if (sendCrash == true) {
Sentry.init {
it.dsn = SENTRY_DSN
}
isEnabled = true
} else {
isEnabled = false
Sentry.close()
}
}
.collect()
}

val logWriter = object : LogWriter() {
override fun isLoggable(
tag: String,
severity: Severity,
): Boolean = isEnabled && severity != Severity.Verbose

override fun log(
severity: Severity,
message: String,
tag: String,
throwable: Throwable?,
) {
if (!isEnabled) return

if (severity == Severity.Error) {
if (throwable != null) {
addBreadcrumb(severity, message, tag)
Sentry.captureException(throwable)
} else {
Sentry.captureMessage(message)
}
} else {
addBreadcrumb(severity, message, tag)
}
}

private fun addBreadcrumb(
severity: Severity,
message: String,
tag: String,
) {
Sentry.addBreadcrumb(
Breadcrumb(
level = when (severity) {
Severity.Verbose,
Severity.Debug,
-> SentryLevel.DEBUG

Severity.Info -> SentryLevel.INFO
Severity.Warn -> SentryLevel.WARNING
Severity.Error -> SentryLevel.ERROR
Severity.Assert -> SentryLevel.ERROR
},
type = when (severity) {
Severity.Debug -> "debug"
Severity.Error -> "error"
else -> "default"
},
message = message,
category = tag,
),
)
}
}

companion object {
private const val SENTRY_DSN =
"https://9dcd83d9519844188803aa817cdcd416@o155150.ingest.sentry.io/5619989"
}
}
4 changes: 4 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ kottie = { module = "io.github.alexzhirkevich:compottie", version = "2.0.0-rc01"
# Permissions
moko-permissions = { module ="dev.icerock.moko:permissions-compose", version = "0.18.0" }

# Crash Reporting
sentry = { module = "io.sentry:sentry-kotlin-multiplatform", version = "0.9.0" }

# Testing
android-test-core = { module = "androidx.test:core", version = "1.6.1" }

Expand All @@ -87,6 +90,7 @@ tooling = [
"markdown",
"kottie",
"moko-permissions",
"sentry",
]
android = [
"android-oonimkall",
Expand Down
6 changes: 6 additions & 0 deletions iosApp/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ def shared_pods

pod 'sqlite3', '~> 3.42.0'

pod("Sentry") {
version = "~> 8.25"
linkOnly = true
extraOpts += listOf("-compiler-option", "-fmodules")
}

pod "libcrypto", :podspec => "#{ooni_pods_location}/libcrypto.podspec"
pod "libevent", :podspec => "#{ooni_pods_location}/libevent.podspec"
pod "libssl", :podspec => "#{ooni_pods_location}/libssl.podspec"
Expand Down
8 changes: 7 additions & 1 deletion iosApp/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ PODS:
- libtor (2024.05.22-093305)
- libz (2024.05.22-093305)
- oonimkall (2024.05.22-093305)
- Sentry (8.36.0):
- Sentry/Core (= 8.36.0)
- Sentry/Core (8.36.0)
- sqlite3 (3.42.0):
- sqlite3/common (= 3.42.0)
- sqlite3/common (3.42.0)
Expand All @@ -18,10 +21,12 @@ DEPENDENCIES:
- libtor (from `https://github.com/ooni/probe-cli/releases/download/v3.22.0/libtor.podspec`)
- libz (from `https://github.com/ooni/probe-cli/releases/download/v3.22.0/libz.podspec`)
- oonimkall (from `https://github.com/ooni/probe-cli/releases/download/v3.22.0/oonimkall.podspec`)
- Sentry
- sqlite3 (~> 3.42.0)

SPEC REPOS:
trunk:
- Sentry
- sqlite3

EXTERNAL SOURCES:
Expand All @@ -48,8 +53,9 @@ SPEC CHECKSUMS:
libtor: c72b23da6a5d2e16173149784f11cf66156c35be
libz: 83658eb2a0db785623ffdf9ce13407e6b8b5c8f9
oonimkall: 9768ce9dad18265d45d2ea972c84fb0bd5237cc3
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
sqlite3: f163dbbb7aa3339ad8fc622782c2d9d7b72f7e9c

PODFILE CHECKSUM: b06fce1e10c83d22148bcb93b3b75ca57d3bff2b
PODFILE CHECKSUM: b49ba8d6a4e50f7a2ff0d0e0311fe97c8511e6e9

COCOAPODS: 1.15.2

0 comments on commit e329aa4

Please sign in to comment.