Share on Twitter
Share on Facebook
Share on HackerNews

Sentry’s Android Gradle Plugin Updated with Room Support and More

Monitoring performance is a critical part of software development. We just released version 3.0.0 of our Sentry Android Gradle plugin, which brings a handful of auto-instrumentation capabilities to Android developers, featuring Room and SQLite queries performance, File I/O operations performance, and more.

Sentry’s Performance Monitoring

So far, the Android SDK has been providing automated instrumentation for Activities, Fragments rendering, and outgoing HTTP requests. These integrations automatically create transactions and spans, which give a bird’s eye view of your application’s performance, helping you spot potential latency issues:

gradle plugin 1

While this already is a lot of useful information, we were still missing some key insights, such as persistence (database) and caching (File I/O) performance, which appear in modern mobile applications.

With the latest upgrade to our Gradle plugin, Android developers can use Sentry to measure how long database queries and filesystem operations can take and determine if they need to be optimized to improve their user’s experience.

Room and SQLite auto-instrumentation

To get started with automated database queries performance measuring, make sure to use the Sentry Android Gradle plugin version 3.0.0 or above along the Sentry Android SDK:

// your app/build.gradle file
repositories {
    mavenCentral()
}

plugins {
    id "io.sentry.android.gradle" version "3.0.1"
}

dependencies {
    implementation 'io.sentry:sentry-android:5.6.0'
}

Once you install the SDK and configure the trace sample rate, it will start to automatically capture spans for database queries performed by Room by default.

Verify

Assuming you have the following (reduced) code snippet performing a database query on a Room DAO:

@Dao
abstract class TracksDao {
  @Insert(onConflict = OnConflictStrategy.REPLACE)
  abstract suspend fun insert(track: Track): Long
}

@Database(
  entities = [Track::class],
  version = 1,
  exportSchema = false
)
abstract class TracksDatabase : RoomDatabase() {
    abstract fun tracksDao(): TracksDao
}

class EditActivity : ComponentActivity() {
  private lateinit var database: TracksDatabase

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    database = TODO("initialize database...")

    findViewById<Button>(R.id.editTrack).setOnClickListener {
      val transaction = Sentry.startTransaction(
        name = "Track Interaction",
        operation = "ui.action.edit",
        bindToScope = true
      )

      val newTrack = Track(/* fill in track values */)

      withContext(Dispatchers.IO) {
        database.tracksDao().insert(newTrack)
        transaction.finish(SpanStatus.OK)
      }
    }
  }
}

Sentry will report:

gradle plugin 2

When we record DB spans, we capture the duration of the database query execution and the actual SQL query as description. This can help tremendously in identifying which database queries slow down the application.

Disable DB instrumentation

If you want to disable the database auto-instrumentation, the plugin exposes a configuration option through Gradle DSL:

sentry {
  tracingInstrumentation {
    enabled = true
    features = EnumSet.allOf(InstrumentationFeature) - InstrumentationFeature.DATABASE
  }
}

File I/O auto-instrumentation

Similarly to database auto-instrumentation, once the plugin is applied and the SDK is configured, it will start capturing spans for File I/O operations, because this integration is enabled by default as well.

Verify

Assuming you have the following (reduced) code snippet performing a file I/O operation:

class LyricsActivity : ComponentActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    findViewById<Button>(R.id.load_lyrics).setOnClickListener {
      val transaction = Sentry.startTransaction(
        name = "Track Interaction",
        operation = "ui.action.lyrics",
        bindToScope = true
      )

      val file = File(context.filesDir, "lyrics.txt")

      val lyricsTextView = findViewById<TextView>(R.id.lyrics)
      lyricsTextView.setText(file.readText())

      transaction.finish(SpanStatus.OK)
    }
  }
}

Sentry will show:

gradle plugtin 3

When we record File I/O spans, we capture some useful metadata; information like file absolute path, raw file size and the filename. This can help tremendously in identifying which File I/O operations slow down the application.

Disable File I/O instrumentation

If you wish to disable the File I/O auto-instrumentation, the plugin exposes a configuration option through Gradle DSL:

sentry {
  tracingInstrumentation {
    enabled = true
    features = EnumSet.allOf(InstrumentationFeature) - InstrumentationFeature.FILE_IO
  }
}

Other platforms

Most of our client SDKs already support automated performance instrumentation for database queries and file I/O operations. Check out our docs for iOS, Flutter, Java, and Xamarin for more details.

If you want to learn more about how the auto-instrumentation works under the hood, check out this article.

Your code is broken. Let's Fix it.
Get Started

More from the Sentry blog

ChangelogDashboardsDiscoverDogfooding ChroniclesEcosystemError MonitoringEventsGuest PostsMoonlightingOpen SourceRelease HealthSDK UpdatesSentry

Do you like corporate newsletters?

Neither do we. Sign up anyway.

© 2022 • Sentry is a registered Trademark
of Functional Software, Inc.