Skip to content

Commit 6637313

Browse files
committed
ADFA-4397: Migrate crash and log reporting from Sentry to GlitchTip
Point the Sentry Android SDK at GlitchTip instead of Sentry. The SDK, DSN format, and tooling stay the same; only the endpoint moves. The DSN comes from local.properties for local builds and from CI secrets for release builds, so nothing is hardcoded. - Forward the app's logback output to GlitchTip. WARN and above go to the Logs view; INFO and above ride along as breadcrumbs (breadcrumbs are free). - Tag each event with the device as the user so crashes can be filtered per user. - Drop Sentry features GlitchTip does not support: session replay and profiling (dependency plus manifest flags removed). - Keep event volume inside the 100k plan: error logs no longer become issues (real crashes are still captured), and performance transactions are disabled. Logs bill at 0.1 and share the same event pool.
1 parent d1c9c07 commit 6637313

4 files changed

Lines changed: 28 additions & 24 deletions

File tree

‎app/build.gradle.kts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ dependencies {
357357
// Sentry Android SDK (core + replay for quality configuration)
358358
implementation(libs.sentry.core)
359359
implementation(libs.sentry.android.core)
360-
implementation(libs.sentry.android.replay)
360+
implementation(libs.sentry.logback)
361361

362362
// Firebase Analytics
363363
implementation(platform(libs.firebase.bom))

‎app/src/main/AndroidManifest.xml‎

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -143,30 +143,14 @@
143143
<!-- enable the performance API by setting a sample-rate, adjust in production env -->
144144
<meta-data
145145
android:name="io.sentry.traces.sample-rate"
146-
android:value="1.0" />
147-
<!-- enable profiling when starting transactions, adjust in production env -->
148-
<meta-data
149-
android:name="io.sentry.traces.profiling.sample-rate"
150-
android:value="1.0" />
146+
android:value="0.0" />
151147
<meta-data
152148
android:name="io.sentry.send-default-pii"
153149
android:value="true" />
154-
<!-- Enable profiling on app start -->
155-
<meta-data
156-
android:name="io.sentry.traces.profiling.start-on-app-start"
157-
android:value="true" />
158150
<!-- Enable logs to be sent to Sentry -->
159151
<meta-data
160152
android:name="io.sentry.logs.enabled"
161153
android:value="true" />
162-
<!-- Record session replays for 100% of errors and 10% of sessions -->
163-
<meta-data
164-
android:name="io.sentry.session-replay.on-error-sample-rate"
165-
android:value="1.0" />
166-
<meta-data
167-
android:name="io.sentry.session-replay.session-sample-rate"
168-
android:value="0.1" />
169-
170154
<provider
171155
android:name=".provider.IDEDocumentsProvider"
172156
android:authorities="com.itsaky.androidide.documents"

‎app/src/main/java/com/itsaky/androidide/app/DeviceProtectedApplicationLoader.kt‎

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import com.itsaky.androidide.utils.FeatureFlags
2020
import com.termux.shared.reflection.ReflectionUtils
2121
import io.github.rosemoe.sora.widget.schemes.EditorColorScheme
2222
import io.sentry.Sentry
23-
import io.sentry.SentryReplayOptions.SentryReplayQuality
2423
import io.sentry.android.core.SentryAndroid
2524
import kotlinx.coroutines.Dispatchers
2625
import kotlinx.coroutines.launch
@@ -31,6 +30,13 @@ import org.koin.core.component.KoinComponent
3130
import org.koin.core.component.inject
3231
import org.slf4j.LoggerFactory
3332
import kotlin.system.exitProcess
33+
import ch.qos.logback.classic.Level
34+
import ch.qos.logback.classic.Logger
35+
import ch.qos.logback.classic.LoggerContext
36+
import io.sentry.logback.SentryAppender
37+
import io.sentry.protocol.User
38+
import android.os.Build
39+
import android.provider.Settings
3440

3541
/**
3642
* @author Akash Yadav
@@ -67,14 +73,28 @@ internal object DeviceProtectedApplicationLoader :
6773
)
6874

6975
SentryAndroid.init(app) { options ->
70-
// Reduce replay quality to LOW to prevent OOM
71-
// This reduces screenshot compression to 10 and bitrate to 50kbps
72-
// (defaults to MEDIUM quality)
73-
options.sessionReplay.quality = SentryReplayQuality.LOW
7476
options.environment =
7577
if (BuildConfig.DEBUG) IDEApplication.SENTRY_ENV_DEV else IDEApplication.SENTRY_ENV_PROD
7678
}
7779

80+
val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
81+
val sentryLogAppender =
82+
SentryAppender().apply {
83+
context = loggerContext
84+
setMinimumEventLevel(Level.OFF)
85+
setMinimumBreadcrumbLevel(Level.INFO)
86+
setMinimumLevel(Level.WARN)
87+
start()
88+
}
89+
loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).addAppender(sentryLogAppender)
90+
91+
Sentry.setUser(
92+
User().apply {
93+
id = Settings.Secure.getString(app.contentResolver, Settings.Secure.ANDROID_ID)
94+
username = "${Build.MANUFACTURER} ${Build.MODEL}"
95+
},
96+
)
97+
7898
ShizukuSettings.initialize()
7999

80100
EventBus

‎gradle/libs.versions.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ firebase-analytics = { module = "com.google.firebase:firebase-analytics-ktx" }
147147
# Sentry
148148
sentry-core = { module = "io.sentry:sentry", version.ref = "sentry" }
149149
sentry-android-core = { module = "io.sentry:sentry-android-core", version.ref = "sentry" }
150-
sentry-android-replay = { module = "io.sentry:sentry-android-replay", version.ref = "sentry" }
150+
sentry-logback = { module = "io.sentry:sentry-logback", version.ref = "sentry" }
151151

152152
# AndroidIDE
153153
androidide-ts = { module = "com.itsaky.androidide.treesitter:android-tree-sitter", version.ref = "tree-sitter" }

0 commit comments

Comments
 (0)