LoginSignup
4
2

FlutterにDriftでSQLiteを組み込んだらSentryで監視しよう

Last updated at Posted at 2023-06-26

今作っているFlutterアプリで Drift を使っており、 Sentry でパフォーマンスモニタリングを入れてみました。

Drift

Flutterでスマホ内のストレージにデータを保存する方法としては 公式 Cookbook で紹介 されている sqflite が代表的ですがAndroidのネイティブ開発の経験があれば、 Drift も有力な選択肢です。過去にMoor(AndroidのRoomを逆順)という名前だったものからリネームされており、近い使用感で利用することができます。 Stream を使ってデータの更新のたびに再レンダリングできるため、 onTap では変更後のデータの反映を気にせずに、データの更新のみに集中することができます。

詳しい使い方は DriftのGetting started with sql をご確認ください。

Sentry

エラートラッキングツールの Sentry をアプリに仕込むと、捕捉しきれなかった例外を最も外側で収集してレポートすることができます。報告されたエラーはインターネットを経由してサーバーに収集され、表示・アラートを行うことができます。サーバーはSaaSを利用する以外にも、 セルフホスト版 を自分で運用することもできます。他に近いサービスとしてはDatadog/New Relic/Firebase Crashlyticsがあります。

詳しい使い方は 公式のGetting Started をご確認ください。また、Sentry上でFlutterのプロジェクトを作成すると、導入手順に進んで使い始めることができます。

Sentryのパフォーマンス監視

元々はエラートラッキング専門ツールというイメージでしたが、パフォーマンス監視に関する機能も備えています。

startTransaction から transaction.finish までの区間を作ると、その間の処理が監視対象になります。

final transaction = Sentry.startTransaction(
  'example-transaction',
  'db',
  bindToScope: true,
);
try {
  // TODO: 処理

  transaction.status = const SpanStatus.ok();
} catch (exception) {
  transaction.throwable = exception;
  transaction.status = const SpanStatus.internalError();
  rethrow;
} finally {
  await transaction.finish();
}

区間内は transaction.startChild() で子の区間 (Span) を開始して、段階的な構造を表現することができます。

bindToScope: true を指定すると、 transaction はスコープ(特になにもしていなければグローバル)にも保存され、 Navigator やネットワークライブラリの diosqflite などとの連携ではそれを使って記録されます。例えば、 SentryNavigatorObserver を使うと、デフォルトではページ遷移から3秒間のトランザクションが開始され、さらにその間に 設定されたdio の通信が行われると、TransactionやSpanを自分で取り回さなくても自動で記録が行われます。

DriftとSentry

ところが残念ながらDriftと連携するためのライブラリは用意されていません。 sentry_sqflite を参考に作ってみました。

パッケージ名称を揃えれば sentry_drift なんですが、Sentry公式が作った時のためにとっておきました。

使い方

DriftのGetting Started に習いつつ、 _openConnection.addSentry() を呼び出すと QueryExecutor を加工します。

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    // Use .addSentry() to wrap QueryExecutor
    return NativeDatabase.createInBackground(file).addSentry();
  });
}

あとは bindToScope: true で囲った間でDriftを使うだけです。あるいは SentryNavigatorObserver を使うと Navigator で遷移した直後が記録されます。

取得したTransaction

drift_sentry のExampleをSaaSに送った様子のスクリーンショットです。起動して最初の実行で、データベースのOpenに時間がかかっていることがわかります。

image.png

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2