Skip to content

Commit

Permalink
Implement tracing batch and transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
buenaflor committed Nov 3, 2023
1 parent 64652a4 commit dcabe06
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 71 deletions.
2 changes: 1 addition & 1 deletion dart/lib/src/sentry_trace_origins.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ class SentryTraceOrigins {
'auto.db.sqflite.database_executor';
static const autoDbSqfliteDatabaseFactory =
'auto.db.sqflite.database_factory';
static const autoDbDriftDatabaseExecutor = 'auto.db.drift.database.executor';
static const autoDbDriftQueryExecutor = 'auto.db.drift.database.executor';
static const autoDbDriftTransactionExecutor = 'auto.db.drift.transaction.executor';
}
1 change: 1 addition & 0 deletions dart/lib/src/sentry_tracer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ class SentryTracer extends ISentrySpan {
// remove from scope
await _hub.configureScope((scope) {
if (scope.span == this) {
print('removing span from scope');
scope.span = null;
}
});
Expand Down
2 changes: 1 addition & 1 deletion drift/lib/sentry_drift.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
library sentry_drift;

export 'src/sentry_drift_database.dart';
export 'src/sentry_query_executor.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ import 'sentry_transaction_executor.dart';
/// Signature of a function that opens a database connection when instructed to.
typedef DatabaseOpener = FutureOr<QueryExecutor> Function();

/// The Sentry Drift Database Executor.
/// The Sentry Query Executor.
///
/// If queryExecutor is not null, it will be used instead of the default one.
/// The default is [LazyDatabase].
class SentryDriftDatabase extends QueryExecutor {
class SentryQueryExecutor extends QueryExecutor {
final Hub _hub;

final _spanHelper = SentrySpanHelper(
// ignore: invalid_use_of_internal_member
SentryTraceOrigins.autoDbDriftDatabaseExecutor,
SentryTraceOrigins.autoDbDriftQueryExecutor,
);

final QueryExecutor _queryExecutor;
Expand All @@ -42,10 +42,10 @@ class SentryDriftDatabase extends QueryExecutor {
// ignore: public_member_api_docs
static const dbSystem = 'sqlite';

/// Declares a [SentryDriftDatabase] that will run [opener] when the database is
/// Declares a [SentryQueryExecutor] that will run [opener] when the database is
/// first requested to be opened. You must specify the same [dialect] as the
/// underlying database has
SentryDriftDatabase(DatabaseOpener opener,
SentryQueryExecutor(DatabaseOpener opener,
{@internal Hub? hub,
@internal QueryExecutor? queryExecutor,
@internal String? dbName})
Expand Down
61 changes: 36 additions & 25 deletions drift/lib/src/sentry_span_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:meta/meta.dart';

import 'package:sentry/sentry.dart';

import 'sentry_drift_database.dart';
import 'sentry_query_executor.dart';

/// @nodoc
@internal
Expand All @@ -21,6 +21,8 @@ class SentrySpanHelper {
_hub = hub;
}

ISentrySpan? spanTest;

/// @nodoc
@internal
Future<T> asyncWrapInSpan<T>(
Expand All @@ -30,13 +32,13 @@ class SentrySpanHelper {
}) async {
final currentSpan = _hub.getSpan();
final span = currentSpan?.startChild(
SentryDriftDatabase.dbOp,
SentryQueryExecutor.dbOp,
description: description,
);

final breadcrumb = Breadcrumb(
message: description,
category: SentryDriftDatabase.dbOp,
category: SentryQueryExecutor.dbOp,
data: {},
type: 'query',
);
Expand All @@ -45,10 +47,10 @@ class SentrySpanHelper {
span?.origin = _origin;

span?.setData(
SentryDriftDatabase.dbSystemKey, SentryDriftDatabase.dbSystem);
SentryQueryExecutor.dbSystemKey, SentryQueryExecutor.dbSystem);

if (dbName != null) {
span?.setData(SentryDriftDatabase.dbNameKey, dbName);
span?.setData(SentryQueryExecutor.dbNameKey, dbName);
}

try {
Expand All @@ -74,18 +76,18 @@ class SentrySpanHelper {
}) {
final currentSpan = _hub.getSpan();
final span = currentSpan?.startChild(
SentryDriftDatabase.dbOp,
SentryQueryExecutor.dbOp,
description: description,
);

// ignore: invalid_use_of_internal_member
span?.origin = _origin;

span?.setData(
SentryDriftDatabase.dbSystemKey, SentryDriftDatabase.dbSystem);
SentryQueryExecutor.dbSystemKey, SentryQueryExecutor.dbSystem);

if (dbName != null) {
span?.setData(SentryDriftDatabase.dbNameKey, dbName);
span?.setData(SentryQueryExecutor.dbNameKey, dbName);
}

try {
Expand All @@ -98,39 +100,48 @@ class SentrySpanHelper {
span?.status = SpanStatus.internalError();

rethrow;
} finally {
spanTest = span;
}
}

@internal
T finishTransaction<T>(
T Function() execute, {
Future<T> finishTransaction<T>(
Future<T> Function() execute, {
String? dbName,
}) {
// TODO: is this always the right way to get the current span?
final span = _hub.getSpan();

// ignore: invalid_use_of_internal_member
span?.origin = _origin;
}) async {
try {
final result = await execute();
spanTest?.status = SpanStatus.ok();

span?.setData(
SentryDriftDatabase.dbSystemKey, SentryDriftDatabase.dbSystem);
return result;
} catch (exception) {
spanTest?.throwable = exception;
spanTest?.status = SpanStatus.internalError();

if (dbName != null) {
span?.setData(SentryDriftDatabase.dbNameKey, dbName);
rethrow;
} finally {
await spanTest?.finish();
}
}

@internal
Future<T> abortTransaction<T>(
Future<T> Function() execute, {
String? dbName,
}) async {
try {
final result = execute();
span?.status = SpanStatus.ok();
final result = await execute();
spanTest?.status = SpanStatus.aborted();

return result;
} catch (exception) {
span?.throwable = exception;
span?.status = SpanStatus.internalError();
spanTest?.throwable = exception;
spanTest?.status = SpanStatus.internalError();

rethrow;
} finally {
span?.finish();
await spanTest?.finish();
}
}
}
14 changes: 8 additions & 6 deletions drift/lib/src/sentry_transaction_executor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,27 @@ class SentryTransactionExecutor extends TransactionExecutor {
: _hub = hub,
_dbName = dbName {
_spanHelper.setHub(_hub);
beginTransaction();
}

@override
TransactionExecutor beginTransaction() {
return _spanHelper.beginTransaction('transaction', () {
return _executor.beginTransaction();
});
}, dbName: _dbName);
}

@override
Future<void> rollback() {
return _executor.rollback();
return _spanHelper.abortTransaction(() async {
return await _executor.rollback();
});
}

@override
Future<void> send() async {
return _spanHelper.finishTransaction(() {
return _executor.send();
Future<void> send() {
return _spanHelper.finishTransaction(() async {
return await _executor.send();
});
}

Expand All @@ -50,7 +53,6 @@ class SentryTransactionExecutor extends TransactionExecutor {

@override
Future<void> runBatched(BatchedStatements statements) {
print('haha');
return _executor.runBatched(statements);
}

Expand Down
Loading

0 comments on commit dcabe06

Please sign in to comment.