From ce2d562ac1af7bc70830796148076456e158c5fe Mon Sep 17 00:00:00 2001 From: Gogo-Eng <“progressgogochinda@gmail.com”> Date: Mon, 29 Jun 2026 23:31:48 +0100 Subject: [PATCH] feat(monitoring): add Sentry + Crashlytics + tracing #200 --- ignition-mobile/lib/main.dart | 8 ++ ignition-mobile/pubspec.yaml | 3 + .../src/monitoring/monitoring_service.dart | 73 +++++++++++++++++++ packages/core-dart/pubspec.yaml | 1 + 4 files changed, 85 insertions(+) create mode 100644 packages/core-dart/lib/src/monitoring/monitoring_service.dart diff --git a/ignition-mobile/lib/main.dart b/ignition-mobile/lib/main.dart index c7e763d3..0cd822bd 100644 --- a/ignition-mobile/lib/main.dart +++ b/ignition-mobile/lib/main.dart @@ -6,6 +6,14 @@ import 'app.dart'; import 'core/push_notification_service.dart'; void main() async { + Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + + await MonitoringService.init(); // ← Add this line + + runApp(const MyApp()); +} + WidgetsFlutterBinding.ensureInitialized(); // Load environment variables diff --git a/ignition-mobile/pubspec.yaml b/ignition-mobile/pubspec.yaml index 2e4d8c9c..2a81eb58 100644 --- a/ignition-mobile/pubspec.yaml +++ b/ignition-mobile/pubspec.yaml @@ -26,6 +26,9 @@ dependencies: path: ../packages/core-dart meta: ^1.18.0 crypto: ^3.0.7 + sentry_flutter: ^8.0.0 + firebase_crashlytics: ^4.0.0 + logging: ^1.2.0 dev_dependencies: # On-device end-to-end suite. Single entry point: integration_test/app_test.dart. diff --git a/packages/core-dart/lib/src/monitoring/monitoring_service.dart b/packages/core-dart/lib/src/monitoring/monitoring_service.dart new file mode 100644 index 00000000..a6aa24b8 --- /dev/null +++ b/packages/core-dart/lib/src/monitoring/monitoring_service.dart @@ -0,0 +1,73 @@ +import 'package:flutter/foundation.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:logging/logging.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + +class MonitoringService { + static final Logger _logger = Logger('IgnitionPay'); + + static Future init() async { + // Setup structured logging + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((record) { + if (kDebugMode) { + debugPrint('${record.level.name}: ${record.message}'); + } + if (record.error != null) { + Sentry.captureException(record.error, stackTrace: record.stackTrace); + } + }); + + // Sentry - Error tracking + Performance Monitoring + await SentryFlutter.init((options) { + options.dsn = const String.fromEnvironment('SENTRY_DSN', defaultValue: ''); + options.tracesSampleRate = 0.35; + options.profilesSampleRate = 0.15; + options.environment = kReleaseMode ? 'production' : 'development'; + options.debug = kDebugMode; + + options.addEventProcessor((event, hint) { + event.tags ??= {}; + event.tags!['platform'] = defaultTargetPlatform.toString(); + event.tags!['version'] = '1.0.0'; + return event; + }); + }); + + // Firebase Crashlytics + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(!kDebugMode); + + FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; + } + + // === Convenience Methods === + + static void info(String message, [Map? data]) { + _logger.info(message); + Sentry.addBreadcrumb(Breadcrumb(message: message, level: SentryLevel.info, data: data)); + } + + static void warning(String message, [dynamic error]) { + _logger.warning(message, error); + Sentry.captureMessage(message, level: SentryLevel.warning); + } + + static void error(String message, dynamic error, [StackTrace? stack]) { + _logger.severe(message, error, stack); + Sentry.captureException(error, stackTrace: stack); + FirebaseCrashlytics.instance.recordError(error, stack ?? StackTrace.current); + } + + // Performance tracing wrapper + static Future trace(String name, Future Function() action) async { + final tx = Sentry.startTransaction(name, 'ui'); + try { + return await action(); + } catch (e, st) { + tx.throwable = e; + rethrow; + } finally { + await tx.finish(); + } + } +} \ No newline at end of file diff --git a/packages/core-dart/pubspec.yaml b/packages/core-dart/pubspec.yaml index f6cebc1f..6938c448 100644 --- a/packages/core-dart/pubspec.yaml +++ b/packages/core-dart/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: meta: ^1.11.0 crypto: ^3.0.3 convert: ^3.1.1 + dev_dependencies: lints: ^3.0.0