File I/O
Supported in Sentry's Android SDK version 5.5.0
and above.
Supported in Sentry Android Gradle Plugin version 3.0.0
and above.
The Sentry Android Gradle Plugin provides file I/O support through bytecode manipulation. The source can be found on GitHub.
On this page, we get you up and running with Sentry's file I/O integration, so that it will automatically start a span from an active transaction that's bound to the scope of each file input/output stream operation.
To use the file I/O integration, add the Sentry Android Gradle plugin in build.gradle
:
plugins {
id "io.sentry.android.gradle" version "4.4.1"
}
Make sure, that performance monitoring is enabled.
In general, no further configuration is required as the auto-instrumentation is enabled by default. If you would like to disable the file I/O instrumentation feature, we expose a configuration option for that:
import io.sentry.android.gradle.extensions.InstrumentationFeature
sentry {
tracingInstrumentation {
enabled = true
features = EnumSet.allOf(InstrumentationFeature) - InstrumentationFeature.FILE_IO
}
}
Assuming you have the following (reduced) code snippet performing a file I/O operation:
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.activity.ComponentActivity
import io.sentry.Sentry
import io.sentry.SpanStatus
import java.io.File
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)
}
}
}
To view the recorded transaction, log into sentry.io and open your project. Clicking Performance will open a page with transactions, where you can select the just recorded transaction with the name Track Interaction
. The event will look similar to this:
At the moment, we only support java.io.FileInputStream
, java.io.FileOutputStream
, java.io.FileReader
and java.io.FileWriter
classes for auto-instrumentation.
Alternatively, if you are not using our Gradle Plugin, the Android SDK provides the capability to manually instrument file I/O operations through the custom Sentry-specific implementations.
To instrument FileInputStream
/FileOutputStream
the SDK provides drop-in replacements such as SentryFileInputStream
/SentryFileOutputStream
.
Old:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
File file1 = new File("file1.txt");
File file2 = new File("file2.txt");
try (FileInputStream fis = new FileInputStream(file1)) {
byte[] buffer = new byte[1024];
try (FileOutputStream fos = new FileOutputStream(file2)) {
int read;
while (true) {
read = fis.read(buffer);
if (read == -1) {
break;
}
fos.write(buffer, 0, read);
}
}
}
New:
import io.sentry.instrumentation.file.SentryFileInputStream;
import io.sentry.instrumentation.file.SentryFileOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
File file1 = new File("file1.txt");
File file2 = new File("file2.txt");
try (FileInputStream fis = new SentryFileInputStream(file1)) {
byte[] buffer = new byte[1024];
try (FileOutputStream fos = new SentryFileOutputStream(file2)) {
int read;
while (true) {
read = fis.read(buffer);
if (read == -1) {
break;
}
fos.write(buffer, 0, read);
}
}
}
Similarly, FileReader
/FileWriter
can be instrumented through SentryFileReader
/SentryFileWriter
:
Old:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
File file1 = new File("file1.txt");
File file2 = new File("file2.txt");
try (FileReader reader = new FileReader(file1)) {
char[] buffer = new char[1024];
try (FileWriter writer = new FileWriter(file2, true)) {
int read;
while (true) {
read = reader.read(buffer, 0, buffer.length);
if (read == -1) {
break;
}
writer.write(buffer, 0, buffer.length);
}
writer.flush();
}
}
New:
import io.sentry.instrumentation.file.SentryFileReader;
import io.sentry.instrumentation.file.SentryFileWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
File file1 = new File("file1.txt");
File file2 = new File("file2.txt");
try (FileReader reader = new SentryFileReader(file1)) {
char[] buffer = new char[1024];
try (FileWriter writer = new SentryFileWriter(file2, true)) {
int read;
while (true) {
read = reader.read(buffer, 0, buffer.length);
if (read == -1) {
break;
}
writer.write(buffer, 0, buffer.length);
}
writer.flush();
}
}
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").
- Package:
- maven:io.sentry:sentry-android
- Version:
- 7.8.0
- Repository:
- https://github.com/getsentry/sentry-java
- API Documentation:
- https://javadoc.io/doc/io.sentry