Isar Database Instrumentation for Flutter
Learn more about the Sentry Isar Database Instrumentation for the Flutter SDK.
References to "transactions" on this page apply to the default transaction mode. In stream mode, this integration creates service spans instead, and Sentry sends them as they finish. See Streamed Spans for more information.
This feature is currently in Beta. Beta features are still in progress and may have bugs. We recognize the irony.
(New in version 7.16.0)
Isar is a fast cross-platform database for Flutter. The sentry_isar package provides Isar support for database instrumentation and allows you to track the performance of your queries.
The created spans attach to the active span. In transaction mode, that's the transaction bound to the scope; in stream mode, it's the span started with Sentry.startSpan(). If no span is active, the Isar span won't be sent to Sentry.
Before starting, ensure:
Add the sentry_isar dependency to install the Isar database instrumentation.
pubspec.yamldependencies:
sentry_flutter: ^10.0.0
sentry_isar: ^10.0.0
path_provider: ^2.0.0
dependencies:
sentry_flutter: ^10.0.0
sentry_isar: ^10.0.0
path_provider: ^2.0.0
Use SentryIsar to initialize the instance:
import 'package:path_provider/path_provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:sentry_isar/sentry_isar.dart';
import 'user.dart'; // Import your Isar model instead
final dir = await getApplicationDocumentsDirectory();
final isar = await SentryIsar.open(
[UserSchema],
directory: dir.path,
);
import 'package:path_provider/path_provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:sentry_isar/sentry_isar.dart';
import 'user.dart'; // Import your Isar model instead
final dir = await getApplicationDocumentsDirectory();
final isar = await SentryIsar.open(
[UserSchema],
directory: dir.path,
);
To use the Transaction Mode tab, set options.traceLifecycle = SentryTraceLifecycle.static during SDK initialization.
import 'package:path_provider/path_provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:sentry_isar/sentry_isar.dart';
import 'user.dart'; // Import your Isar model instead
Future<void> runApp() async {
await Sentry.startSpan('isarTest', (span) async {
final dir = await getApplicationDocumentsDirectory();
final isar = await SentryIsar.open(
[UserSchema],
directory: dir.path,
);
final newUser = User()
..name = 'Joe Dirt'
..age = 36;
await isar.writeTxn(() async {
await isar.users.put(newUser); // insert & update
});
final existingUser = await isar.users.get(newUser.id); // get
await isar.writeTxn(() async {
await isar.users.delete(existingUser!.id); // delete
});
}, parentSpan: null);
}
import 'package:path_provider/path_provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:sentry_isar/sentry_isar.dart';
import 'user.dart'; // Import your Isar model instead
Future<void> runApp() async {
await Sentry.startSpan('isarTest', (span) async {
final dir = await getApplicationDocumentsDirectory();
final isar = await SentryIsar.open(
[UserSchema],
directory: dir.path,
);
final newUser = User()
..name = 'Joe Dirt'
..age = 36;
await isar.writeTxn(() async {
await isar.users.put(newUser); // insert & update
});
final existingUser = await isar.users.get(newUser.id); // get
await isar.writeTxn(() async {
await isar.users.delete(existingUser!.id); // delete
});
}, parentSpan: null);
}
import 'package:path_provider/path_provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:sentry_isar/sentry_isar.dart';
import 'user.dart'; // Import your Isar model instead
Future<void> runApp() async {
final tr = Sentry.startTransaction('isarTest', 'db', bindToScope: true);
final dir = await getApplicationDocumentsDirectory();
final isar = await SentryIsar.open(
[UserSchema],
directory: dir.path,
);
final newUser = User()
..name = 'Joe Dirt'
..age = 36;
await isar.writeTxn(() async {
await isar.users.put(newUser); // insert & update
});
final existingUser = await isar.users.get(newUser.id); // get
await isar.writeTxn(() async {
await isar.users.delete(existingUser!.id); // delete
});
await tr.finish(status: const SpanStatus.ok());
}
To view the recorded transaction, log into sentry.io. Use the left sidebar to navigate to the Performance page. Select your project and scroll down to the transactions table to see the just recorded transaction with the name isarTest. You can also use the search bar to find the transaction. Click on the transaction to open its Transaction Summary page for more performance details.
Database spans identify the database system with db.system.name (isar) and the database name with db.namespace, when available. Use these keys in queries and span-filtering callbacks.
Collection names use db.collection.name.
Database breadcrumbs also use db.system.name and db.namespace.
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").