diff --git a/.github/workflows/benchmark_suite.yml b/.github/workflows/benchmark_suite.yml index c7828fa9e99..c4b503729af 100644 --- a/.github/workflows/benchmark_suite.yml +++ b/.github/workflows/benchmark_suite.yml @@ -41,6 +41,6 @@ jobs: script: | adb root ./gradlew --no-configuration-cache -PmanifestEndpoint=https://api-sandbox.simple.org/api/ installQaDebug installQaDebugAndroidTest lockClocks - adb shell am instrument -w -e filter org.simple.clinic.benchmark.SelectBenchmarkTests -e benchmark_app_performance true -e dd_client_token ${{ secrets.DD_PERF_CLIENT_TOKEN }} -e dd_application_id ${{ secrets.DD_PERF_APPLICATION_ID }} org.simple.clinic.qa.debug.test/org.simple.clinic.AndroidTestJUnitRunner + adb shell am instrument -w -e filter org.simple.clinic.benchmark.SelectBenchmarkTests -e benchmark_app_performance true -e sentry_dsn ${{ secrets.SENTRY_DSN }} org.simple.clinic.qa.debug.test/org.simple.clinic.AndroidTestJUnitRunner adb uninstall org.simple.clinic.qa.debug adb uninstall org.simple.clinic.qa.debug.test diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ea61015c61..d20be76807e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ - Bump AGP to v8.8.2 - Calculate lab-based CVD risk score - Update copy of statin nudge to support lab-based nudge +- Report SQL performance metrics to Sentry ### Fixes diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d602037db47..aecedac2199 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,17 +1,18 @@ @file:Suppress("UnstableApiUsage") import com.android.build.gradle.internal.tasks.databinding.DataBindingGenBaseClassesTask +import io.sentry.android.gradle.extensions.InstrumentationFeature import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool import org.simple.rmg.RoomMetadataGenerator +import java.util.EnumSet plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.sentry) - alias(libs.plugins.datadog) alias(libs.plugins.ksp) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.google.services) @@ -33,7 +34,8 @@ sentry { // We are using our own instrumentation tooling for Room queries // Look at [ADR 013: SQL Performance Profiling (v2)] tracingInstrumentation { - enabled.set(false) + enabled = true + features.set(EnumSet.allOf(InstrumentationFeature::class.java) - InstrumentationFeature.DATABASE) } } @@ -87,22 +89,12 @@ android { val manifestEndpoint: String by project val disableScreenshot: String by project val allowRootedDevice: String by project - val datadogServiceName: String by project - val datadogApplicationId: String by project - val datadogClientToken: String by project - val datadogEnvironment: String by project - - addManifestPlaceholders(mapOf( - "sentryDsn" to sentryDsn, - "sentryEnvironment" to sentryEnvironment - )) + + buildConfigField("String", "SENTRY_DSN", "\"$sentryDsn\"") + buildConfigField("String", "SENTRY_ENVIRONMENT", "\"$sentryEnvironment\"") buildConfigField("String", "MANIFEST_ENDPOINT", "\"$manifestEndpoint\"") buildConfigField("boolean", "DISABLE_SCREENSHOT", disableScreenshot) buildConfigField("boolean", "ALLOW_ROOTED_DEVICE", allowRootedDevice) - buildConfigField("String", "DATADOG_SERVICE_NAME", "\"$datadogServiceName\"") - buildConfigField("String", "DATADOG_APPLICATION_ID", "\"$datadogApplicationId\"") - buildConfigField("String", "DATADOG_CLIENT_TOKEN", "\"$datadogClientToken\"") - buildConfigField("String", "DATADOG_ENVIRONMENT", "\"$datadogEnvironment\"") ksp { arg("room.schemaLocation", "$projectDir/schemas") @@ -482,8 +474,6 @@ dependencies { runtimeOnly(libs.jackson.core) - implementation(libs.datadog.sdk) - androidTestImplementation(libs.apache.commons.math) } diff --git a/app/src/androidTest/AndroidManifest.xml b/app/src/androidTest/AndroidManifest.xml index a96b7099289..253a4e418a6 100644 --- a/app/src/androidTest/AndroidManifest.xml +++ b/app/src/androidTest/AndroidManifest.xml @@ -6,7 +6,7 @@ + android:value="org.simple.clinic.benchmark.WaitForSentryToUpload" /> diff --git a/app/src/androidTest/java/org/simple/clinic/TestClinicApp.kt b/app/src/androidTest/java/org/simple/clinic/TestClinicApp.kt index 30677ac954d..2972abb65c1 100644 --- a/app/src/androidTest/java/org/simple/clinic/TestClinicApp.kt +++ b/app/src/androidTest/java/org/simple/clinic/TestClinicApp.kt @@ -1,19 +1,11 @@ package org.simple.clinic import android.app.Application -import android.content.Context import androidx.test.platform.app.InstrumentationRegistry -import com.datadog.android.Datadog -import com.datadog.android.core.configuration.Configuration -import com.datadog.android.core.configuration.Credentials -import com.datadog.android.core.configuration.UploadFrequency -import com.datadog.android.privacy.TrackingConsent -import com.datadog.android.rum.GlobalRum -import com.datadog.android.rum.RumMonitor -import com.datadog.android.rum.tracking.ViewTrackingStrategy -import com.datadog.android.tracing.AndroidTracer import com.tspoon.traceur.Traceur -import io.opentracing.util.GlobalTracer +import io.sentry.SentryLevel +import io.sentry.SentryOptions +import io.sentry.android.core.SentryAndroid import org.simple.clinic.TestClinicApp.Companion.appComponent import org.simple.clinic.benchmark.BackupBenchmarkDatabase import org.simple.clinic.di.DaggerTestAppComponent @@ -100,9 +92,8 @@ class TestClinicApp : Application() { dataSync.syncTheWorld() backupBenchmarkDatabase.backup() - setupDatadog( - clientToken = instrumentationArgs.getString("dd_client_token")!!, - applicationId = instrumentationArgs.getString("dd_application_id")!! + setupSentry( + dsn = instrumentationArgs.getString("sentry_dsn")!!, ) } } @@ -155,39 +146,20 @@ class TestClinicApp : Application() { .build() } - private fun setupDatadog( - clientToken: String, - applicationId: String - ) { - val datadogConfig = Configuration - .Builder( - logsEnabled = true, - tracesEnabled = true, - crashReportsEnabled = false, - rumEnabled = false - ) - .useViewTrackingStrategy(NoopViewTrackingStrategy()) - .setUploadFrequency(UploadFrequency.FREQUENT) - .build() - val credentials = Credentials( - clientToken = clientToken, - envName = "test", - variant = BuildConfig.FLAVOR, - rumApplicationId = applicationId, - serviceName = "simple-android-perf-regression" - ) - Datadog.initialize(this, credentials, datadogConfig, TrackingConsent.GRANTED) - GlobalRum.registerIfAbsent(RumMonitor.Builder().build()) - GlobalTracer.registerIfAbsent(AndroidTracer.Builder().setPartialFlushThreshold(5).build()) - } - - private class NoopViewTrackingStrategy : ViewTrackingStrategy { - override fun register(context: Context) { - // No need to track views in tests - } - - override fun unregister(context: Context?) { - // No need to track views in tests + private fun setupSentry(dsn: String) { + SentryAndroid.init(this) { options -> + options.dsn = dsn + options.environment = "test" + options.sampleRate = 0.0 + options.tracesSampleRate = 1.0 + + options.beforeSend = SentryOptions.BeforeSendCallback { event, _ -> + if (event.level != SentryLevel.DEBUG) { + event + } else { + null + } + } } } } diff --git a/app/src/androidTest/java/org/simple/clinic/benchmark/BenchmarkTestRule.kt b/app/src/androidTest/java/org/simple/clinic/benchmark/BenchmarkTestRule.kt index 78e402f3228..f0a29c9bb43 100644 --- a/app/src/androidTest/java/org/simple/clinic/benchmark/BenchmarkTestRule.kt +++ b/app/src/androidTest/java/org/simple/clinic/benchmark/BenchmarkTestRule.kt @@ -1,13 +1,16 @@ package org.simple.clinic.benchmark import android.util.Log -import io.opentracing.util.GlobalTracer +import io.sentry.Sentry +import io.sentry.SentryLongDate +import io.sentry.SpanStatus +import io.sentry.TransactionOptions import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement import org.simple.clinic.TestClinicApp -import java.util.concurrent.TimeUnit.MICROSECONDS +import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject @@ -65,19 +68,22 @@ class BenchmarkTestRule( Log.i("PerfRegression", "Median benchmark for $testClass#$testMethod: ${medianTimeTaken}ms") - val tracer = GlobalTracer.get() - val adjustedStartTime = millisToMicros(System.currentTimeMillis() - medianTimeTaken) - val span = tracer - .buildSpan("test.method") - .withTag("class", testClass) - .withTag("method", testMethod) - .withStartTimestamp(adjustedStartTime) - .start() + val adjustedStartTime = millisToNanos(System.currentTimeMillis() - medianTimeTaken) - span.finish(adjustedStartTime + millisToMicros(medianTimeTaken)) + val span = Sentry.startTransaction( + /* name = */ "test.method", + /* operation = */ "$testClass/$testMethod", + /* transactionOptions = */ TransactionOptions().apply { + startTimestamp = SentryLongDate(adjustedStartTime) + } + ) + + span.finish( + SpanStatus.OK, + SentryLongDate(adjustedStartTime + millisToNanos(medianTimeTaken))) } - private fun millisToMicros(millis: Long) = MICROSECONDS.convert(millis, MILLISECONDS) + private fun millisToNanos(millis: Long) = TimeUnit.NANOSECONDS.convert(millis, MILLISECONDS) } } } diff --git a/app/src/androidTest/java/org/simple/clinic/benchmark/WaitForDatadogToUpload.kt b/app/src/androidTest/java/org/simple/clinic/benchmark/WaitForSentryToUpload.kt similarity index 59% rename from app/src/androidTest/java/org/simple/clinic/benchmark/WaitForDatadogToUpload.kt rename to app/src/androidTest/java/org/simple/clinic/benchmark/WaitForSentryToUpload.kt index 4873676d1ca..63f77a0a234 100644 --- a/app/src/androidTest/java/org/simple/clinic/benchmark/WaitForDatadogToUpload.kt +++ b/app/src/androidTest/java/org/simple/clinic/benchmark/WaitForSentryToUpload.kt @@ -3,21 +3,19 @@ package org.simple.clinic.benchmark import android.os.Bundle import android.util.Log import androidx.test.internal.runner.listener.InstrumentationRunListener -import io.opentracing.util.GlobalTracer import org.junit.runner.Result import org.simple.clinic.TestClinicApp import java.io.PrintStream import java.time.Duration -class WaitForDatadogToUpload : InstrumentationRunListener() { +class WaitForSentryToUpload : InstrumentationRunListener() { override fun instrumentationRunFinished(streamResult: PrintStream?, resultBundle: Bundle?, junitResults: Result?) { - // We don't have a way to force Datadog to upload all its traces, so we'll wait for a few seconds - // for DD to upload, and then we'll finish it. + // We don't have a way to force Sentry to upload all its traces, so we'll wait for a few seconds + // for Sentry to upload, and then we'll finish it. if (TestClinicApp.isInBenchmarkMode) { - Log.i("PerfRegression", "Wait for Datadog upload") + Log.i("PerfRegression", "Wait for Sentry upload") Thread.sleep(Duration.ofMinutes(1).toMillis()) - GlobalTracer.get().close() } } } diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml index c78f17c58dd..46d68f828ec 100644 --- a/app/src/debug/AndroidManifest.xml +++ b/app/src/debug/AndroidManifest.xml @@ -8,10 +8,6 @@ tools:ignore="GoogleAppIndexingWarning" tools:replace="android:name,android:icon"> - - - - - - + android:name="io.sentry.auto-init" + android:value="false" /> if (!error.canBeIgnoredSafely()) { @@ -107,42 +100,39 @@ abstract class ClinicApp : Application(), CameraXConfig.Provider { analyticsReporters.forEach { reporter -> Analytics.addReporter(reporter) } - SqlPerformanceReporter.addSink(DatadogSqlPerformanceReportingSink()) + SqlPerformanceReporter.addSink(SentrySqlPerformanceReportingSink()) registerActivityLifecycleCallbacks(closeActivitiesWhenUserIsUnauthorized) } - private fun setupApplicationPerformanceMonitoring() { - val samplingRate = remoteConfig - .double("datadog_sample_rate", 0.0) - .toFloat() - .clamp(0F, 100F) - - val datadogConfig = Configuration - .Builder( - logsEnabled = false, - tracesEnabled = true, - crashReportsEnabled = false, - rumEnabled = true - ) - .trackBackgroundRumEvents(true) - .trackLongTasks(5000) - .useViewTrackingStrategy(FragmentViewTrackingStrategy( - trackArguments = false, - supportFragmentComponentPredicate = ResolveScreenNamesForDatadog() - )) - .sampleRumSessions(samplingRate = samplingRate) - .build() - val credentials = Credentials( - clientToken = BuildConfig.DATADOG_CLIENT_TOKEN, - envName = BuildConfig.DATADOG_ENVIRONMENT, - variant = BuildConfig.FLAVOR, - rumApplicationId = BuildConfig.DATADOG_APPLICATION_ID, - serviceName = BuildConfig.DATADOG_SERVICE_NAME - ) - Datadog.initialize(this, credentials, datadogConfig, TrackingConsent.GRANTED) - GlobalRum.registerIfAbsent(RumMonitor.Builder().build()) - GlobalTracer.registerIfAbsent(AndroidTracer.Builder().build()) + private fun setupSentry() { + SentryAndroid.init(this) { options -> + options.dsn = BuildConfig.SENTRY_DSN + options.environment = BuildConfig.SENTRY_ENVIRONMENT + + options.sampleRate = remoteConfig + .double("sentry_errors_sample_rate", 0.0) + .coerceIn(0.0, 1.0) + options.tracesSampleRate = remoteConfig + .double("sentry_traces_sample_rate", 0.0) + .coerceIn(0.0, 1.0) + + options.beforeSend = BeforeSendCallback { event, hint -> + if (event.level != SentryLevel.DEBUG) { + event + } else { + null + } + } + + options.addIntegration( + FragmentLifecycleIntegration( + application = this, + enableFragmentLifecycleBreadcrumbs = true, + enableAutoFragmentLifecycleTracing = true, + ) + ) + } } override fun getCameraXConfig(): CameraXConfig { diff --git a/app/src/main/java/org/simple/clinic/analytics/ResolveScreenNamesForDatadog.kt b/app/src/main/java/org/simple/clinic/analytics/ResolveScreenNamesForDatadog.kt deleted file mode 100644 index c2acaa24000..00000000000 --- a/app/src/main/java/org/simple/clinic/analytics/ResolveScreenNamesForDatadog.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.simple.clinic.analytics - -import androidx.fragment.app.Fragment -import com.datadog.android.rum.tracking.AcceptAllSupportFragments -import org.simple.clinic.navigation.v2.compat.ScreenFragmentCompat -import org.simple.clinic.navigation.v2.fragments.BaseBottomSheet -import org.simple.clinic.navigation.v2.fragments.BaseDialog -import org.simple.clinic.navigation.v2.fragments.BaseScreen - -class ResolveScreenNamesForDatadog: AcceptAllSupportFragments() { - - override fun getViewName(component: Fragment): String? { - return when(component) { - is ScreenFragmentCompat -> component.screenName - is BaseScreen<*, *, *, *, *, *> -> component.screenName - is BaseBottomSheet<*, *, *, *, *, *> -> component.screenName - is BaseDialog<*, *, *, *, *, *> -> component.screenName - else -> super.getViewName(component) - } - } -} diff --git a/app/src/main/java/org/simple/clinic/plumbing/infrastructure/DatadogInfrastructure.kt b/app/src/main/java/org/simple/clinic/plumbing/infrastructure/DatadogInfrastructure.kt deleted file mode 100644 index 200e8846177..00000000000 --- a/app/src/main/java/org/simple/clinic/plumbing/infrastructure/DatadogInfrastructure.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.simple.clinic.plumbing.infrastructure - -import com.datadog.android.Datadog -import org.simple.clinic.appconfig.Country -import org.simple.clinic.appconfig.Deployment -import org.simple.clinic.user.User -import javax.inject.Inject - -class DatadogInfrastructure @Inject constructor() : Infrastructure { - - override fun addDetails(user: User, country: Country, deployment: Deployment) { - Datadog.setUserInfo( - id = user.uuid.toString(), - extraInfo = mapOf( - "facilityId" to user.currentFacilityUuid.toString(), - "countryCode" to country.isoCountryCode, - "deployment" to deployment.endPoint.toString() - ) - ) - } - - override fun clear() { - Datadog.setUserInfo(id = null, extraInfo = emptyMap()) - } -} diff --git a/app/src/main/java/org/simple/clinic/plumbing/infrastructure/InfrastructureModule.kt b/app/src/main/java/org/simple/clinic/plumbing/infrastructure/InfrastructureModule.kt index 3ac3be667d3..10b706c73ea 100644 --- a/app/src/main/java/org/simple/clinic/plumbing/infrastructure/InfrastructureModule.kt +++ b/app/src/main/java/org/simple/clinic/plumbing/infrastructure/InfrastructureModule.kt @@ -9,7 +9,6 @@ class InfrastructureModule { @Provides fun provideInfrastructure( sentryInfrastructure: SentryInfrastructure, - datadogInfrastructure: DatadogInfrastructure, firebaseAnalyticsInfrastructure: FirebaseAnalyticsInfrastructure - ) = listOf(sentryInfrastructure, datadogInfrastructure, firebaseAnalyticsInfrastructure) + ) = listOf(sentryInfrastructure, firebaseAnalyticsInfrastructure) } diff --git a/app/src/main/java/org/simple/clinic/storage/monitoring/DatadogSqlPerformanceReportingSink.kt b/app/src/main/java/org/simple/clinic/storage/monitoring/SentrySqlPerformanceReportingSink.kt similarity index 76% rename from app/src/main/java/org/simple/clinic/storage/monitoring/DatadogSqlPerformanceReportingSink.kt rename to app/src/main/java/org/simple/clinic/storage/monitoring/SentrySqlPerformanceReportingSink.kt index c1c91c97c48..af66012df04 100644 --- a/app/src/main/java/org/simple/clinic/storage/monitoring/DatadogSqlPerformanceReportingSink.kt +++ b/app/src/main/java/org/simple/clinic/storage/monitoring/SentrySqlPerformanceReportingSink.kt @@ -1,11 +1,12 @@ package org.simple.clinic.storage.monitoring -import io.opentracing.Span -import io.opentracing.util.GlobalTracer +import io.sentry.ISpan +import io.sentry.Sentry +import io.sentry.TransactionOptions import org.simple.clinic.storage.monitoring.SqlPerformanceReporter.ReportSink import org.simple.clinic.storage.monitoring.SqlPerformanceReporter.SqlOperation -class DatadogSqlPerformanceReportingSink : ReportSink { +class SentrySqlPerformanceReportingSink : ReportSink { /** * Maintains the list of running spans for every DB call. @@ -16,15 +17,14 @@ class DatadogSqlPerformanceReportingSink : ReportSink { * * Something to investigate at a later date. **/ - private var runningSpans = emptyMap() + private var runningSpans = emptyMap() override fun begin(operation: SqlOperation) { - val tracer = GlobalTracer.get() - val span = tracer - .buildSpan("room.query") - .withTag("dao", operation.daoName) - .withTag("method", operation.methodName) - .start() + val span = Sentry.startTransaction( + /* name = */ "room.query", + /* operation = */ "${operation.daoName}/${operation.methodName}" + ) + span.setTag("op_thread", operation.threadName) runningSpans = runningSpans + (operation to span) } diff --git a/app/src/main/java/org/simple/clinic/storage/monitoring/SqlPerformanceReporter.kt b/app/src/main/java/org/simple/clinic/storage/monitoring/SqlPerformanceReporter.kt index 9b9aa4532b7..20547844e77 100644 --- a/app/src/main/java/org/simple/clinic/storage/monitoring/SqlPerformanceReporter.kt +++ b/app/src/main/java/org/simple/clinic/storage/monitoring/SqlPerformanceReporter.kt @@ -18,9 +18,10 @@ class SqlPerformanceReporter { fun begin( daoName: String, startTimeMillis: Long, - methodName: String + methodName: String, + threadName: String, ) { - val operation = SqlOperation(daoName, startTimeMillis, methodName) + val operation = SqlOperation(daoName, startTimeMillis, methodName, threadName) INSTANCE.onEachSink { it.begin(operation) } } @@ -29,9 +30,10 @@ class SqlPerformanceReporter { fun end( daoName: String, startTimeMillis: Long, - methodName: String + methodName: String, + threadName: String, ) { - val operation = SqlOperation(daoName, startTimeMillis, methodName) + val operation = SqlOperation(daoName, startTimeMillis, methodName, threadName) INSTANCE.onEachSink { it.end(operation) } } @@ -60,6 +62,7 @@ class SqlPerformanceReporter { data class SqlOperation( val daoName: String, val startTimeMillis: Long, - val methodName: String + val methodName: String, + val threadName: String, ) } diff --git a/app/src/release/java/org/simple/clinic/di/network/HttpInterceptorsModule.kt b/app/src/release/java/org/simple/clinic/di/network/HttpInterceptorsModule.kt index 37efb6286d7..1d4fa2408cc 100644 --- a/app/src/release/java/org/simple/clinic/di/network/HttpInterceptorsModule.kt +++ b/app/src/release/java/org/simple/clinic/di/network/HttpInterceptorsModule.kt @@ -1,8 +1,8 @@ package org.simple.clinic.di.network -import com.datadog.android.DatadogInterceptor import dagger.Module import dagger.Provides +import io.sentry.okhttp.SentryOkHttpInterceptor import okhttp3.Interceptor import org.simple.clinic.analytics.NetworkAnalyticsInterceptor import org.simple.clinic.user.LoggedInUserHttpInterceptor @@ -18,7 +18,7 @@ class HttpInterceptorsModule { compressRequestInterceptor: CompressRequestInterceptor ): List { return listOf( - DatadogInterceptor(), + SentryOkHttpInterceptor(), loggedInInterceptor, appInfoHttpInterceptor, compressRequestInterceptor, diff --git a/build.gradle.kts b/build.gradle.kts index e5aee9ca6bd..b13ef7c9ad4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,6 @@ plugins { alias(libs.plugins.ksp) apply false alias(libs.plugins.google.services) apply false alias(libs.plugins.sentry) apply false - alias(libs.plugins.datadog) apply false } buildscript { diff --git a/buildTooling/room-metadata-generator-2.0.1.jar b/buildTooling/room-metadata-generator-2.1.0.jar similarity index 95% rename from buildTooling/room-metadata-generator-2.0.1.jar rename to buildTooling/room-metadata-generator-2.1.0.jar index 6bfcdb9f704..9c3e33ff8f3 100644 Binary files a/buildTooling/room-metadata-generator-2.0.1.jar and b/buildTooling/room-metadata-generator-2.1.0.jar differ diff --git a/gradle.properties b/gradle.properties index 4e5188547e6..7e234bdf671 100644 --- a/gradle.properties +++ b/gradle.properties @@ -45,10 +45,5 @@ sentryUploadProguard=true # App behaviour disableScreenshot=false allowRootedDevice=true -# Datadog config -datadogApplicationId=do_not_change_here -datadogClientToken=do_not_change_here -datadogEnvironment=qa -datadogServiceName=simple-android maestroTests=false org.gradle.unsafe.configuration-cache=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 01fe5e5fda2..060ec8bf452 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,7 @@ okhttp = "4.12.0" retrofit = "2.11.0" -room-metadataGenerator = "2.0.1" +room-metadataGenerator = "2.1.0" rx-binding = "3.1.0" @@ -201,8 +201,6 @@ uuid-generator = "com.fasterxml.uuid:java-uuid-generator:5.1.0" #noinspection GradleDependency viewpump = "io.github.inflationx:viewpump:2.0.3" -datadog-sdk = "com.datadoghq:dd-sdk-android:1.19.3" - #noinspection GradleDependency zxing = "com.google.zxing:core:3.3.3" @@ -236,7 +234,6 @@ kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version. ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } google-services = { id = "com.google.gms.google-services", version = "4.4.2" } sentry = { id = "io.sentry.android.gradle", version = "5.1.0" } -datadog = { id = "com.datadoghq.dd-sdk-android-gradle-plugin", version = "1.15.0" } [bundles] androidx-camera = ["androidx-camera-core", "androidx-camera-camera2", "androidx-camera-view", "androidx-camera-lifecycle"]