Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
### Enhancements

- Remove `SentryTimingsCallback` and use Flutter's `TimingsCallback` instead ([#3054](https://github.com/getsentry/sentry-dart/pull/3054))
- Remove unused native frames integration ([#3053](https://github.com/getsentry/sentry-dart/pull/3053))

## 9.4.0

Expand Down
1 change: 0 additions & 1 deletion dart/lib/src/native/c/sentry_native.dart

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import io.sentry.Breadcrumb
import io.sentry.DateUtils
import io.sentry.HubAdapter
import io.sentry.Sentry
import io.sentry.android.core.ActivityFramesTracker
import io.sentry.android.core.InternalSentrySdk
import io.sentry.android.core.LoadClass
import io.sentry.android.core.SentryAndroid
Expand Down Expand Up @@ -63,7 +62,6 @@ class SentryFlutterPlugin :
)

private var activity: WeakReference<Activity>? = null
private var framesTracker: ActivityFramesTracker? = null
private var pluginRegistrationTime: Long? = null

override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
Expand All @@ -87,8 +85,6 @@ class SentryFlutterPlugin :
"loadImageList" -> loadImageList(call, result)
"closeNativeSdk" -> closeNativeSdk(result)
"fetchNativeAppStart" -> fetchNativeAppStart(result)
"beginNativeFrames" -> beginNativeFrames(result)
"endNativeFrames" -> endNativeFrames(call.argument("id"), result)
"setContexts" -> setContexts(call.argument("key"), call.argument("value"), result)
"removeContexts" -> removeContexts(call.argument("key"), result)
"setUser" -> setUser(call.argument("user"), result)
Expand Down Expand Up @@ -121,7 +117,6 @@ class SentryFlutterPlugin :

override fun onDetachedFromActivity() {
activity = null
framesTracker = null
}

override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
Expand Down Expand Up @@ -150,10 +145,6 @@ class SentryFlutterPlugin :
SentryAndroid.init(context) { options ->
sentryFlutter.updateOptions(options, args)

if (sentryFlutter.autoPerformanceTracingEnabled) {
framesTracker = ActivityFramesTracker(LoadClass(), options)
}

setupReplay(options)
}
result.success("")
Expand Down Expand Up @@ -291,52 +282,6 @@ class SentryFlutterPlugin :
)
}
}

private fun beginNativeFrames(result: Result) {
if (!sentryFlutter.autoPerformanceTracingEnabled) {
result.success(null)
return
}

activity?.get()?.let {
framesTracker?.addActivity(it)
}
result.success(null)
}

private fun endNativeFrames(
id: String?,
result: Result,
) {
val activity = activity?.get()
if (!sentryFlutter.autoPerformanceTracingEnabled || activity == null || id == null) {
if (id == null) {
Log.w("Sentry", "Parameter id cannot be null when calling endNativeFrames.")
}
result.success(null)
return
}

val sentryId = SentryId(id)
framesTracker?.setMetrics(activity, sentryId)
val metrics = framesTracker?.takeMetrics(sentryId)
val total = metrics?.get("frames_total")?.value?.toInt() ?: 0
val slow = metrics?.get("frames_slow")?.value?.toInt() ?: 0
val frozen = metrics?.get("frames_frozen")?.value?.toInt() ?: 0

if (total == 0 && slow == 0 && frozen == 0) {
result.success(null)
} else {
val frames =
mapOf<String, Any?>(
"totalFrames" to total,
"slowFrames" to slow,
"frozenFrames" to frozen,
)
result.success(frames)
}
}

private fun setContexts(
key: String?,
value: Any?,
Expand Down Expand Up @@ -518,8 +463,6 @@ class SentryFlutterPlugin :

private fun closeNativeSdk(result: Result) {
HubAdapter.getInstance().close()
framesTracker?.stop()
framesTracker = null

result.success("")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,6 @@ public class SentryFlutterPlugin: NSObject, FlutterPlugin {
case "fetchNativeAppStart":
fetchNativeAppStart(result: result)

case "beginNativeFrames":
beginNativeFrames(result: result)

case "endNativeFrames":
endNativeFrames(result: result)

case "setContexts":
let arguments = call.arguments as? [String: Any?]
let key = arguments?["key"] as? String
Expand Down Expand Up @@ -513,59 +507,6 @@ public class SentryFlutterPlugin: NSObject, FlutterPlugin {
#endif
}

private var totalFrames: UInt = 0
private var frozenFrames: UInt = 0
private var slowFrames: UInt = 0

private func beginNativeFrames(result: @escaping FlutterResult) {
#if os(iOS) || targetEnvironment(macCatalyst)
guard PrivateSentrySDKOnly.isFramesTrackingRunning else {
print("Native frames tracking not running.")
result(nil)
return
}

let currentFrames = PrivateSentrySDKOnly.currentScreenFrames
totalFrames = currentFrames.total
frozenFrames = currentFrames.frozen
slowFrames = currentFrames.slow

result(nil)
#else
result(nil)
#endif
}

private func endNativeFrames(result: @escaping FlutterResult) {
#if os(iOS) || targetEnvironment(macCatalyst)
guard PrivateSentrySDKOnly.isFramesTrackingRunning else {
print("Native frames tracking not running.")
result(nil)
return
}

let currentFrames = PrivateSentrySDKOnly.currentScreenFrames
let total = max(Int(currentFrames.total) - Int(totalFrames), 0)
let frozen = max(Int(currentFrames.frozen) - Int(frozenFrames), 0)
let slow = max(Int(currentFrames.slow) - Int(slowFrames), 0)

if total <= 0 && frozen <= 0 && slow <= 0 {
result(nil)
return
}

let item: [String: Any] = [
"totalFrames": total,
"frozenFrames": frozen,
"slowFrames": slow
]

result(item)
#else
result(nil)
#endif
}

private func setContexts(key: String?, value: Any?, result: @escaping FlutterResult) {
guard let key = key else {
result("")
Expand Down
7 changes: 0 additions & 7 deletions flutter/lib/src/native/c/sentry_native.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import 'package:meta/meta.dart';
import '../../../sentry_flutter.dart';
import '../../replay/replay_config.dart';
import '../native_app_start.dart';
import '../native_frames.dart';
import '../sentry_native_binding.dart';
import '../sentry_native_invoker.dart';
import 'binding.dart' as binding;
Expand Down Expand Up @@ -111,12 +110,6 @@ class SentryNative with SentryNativeSafeInvoker implements SentryNativeBinding {
throw UnsupportedError("Not supported on this platform");
}

@override
FutureOr<void> beginNativeFrames() {}

@override
FutureOr<NativeFrames?> endNativeFrames(SentryId id) => null;

@override
FutureOr<void> setUser(SentryUser? user) {
if (user == null) {
Expand Down
18 changes: 0 additions & 18 deletions flutter/lib/src/native/native_frames.dart

This file was deleted.

5 changes: 0 additions & 5 deletions flutter/lib/src/native/sentry_native_binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'package:meta/meta.dart';
import '../../sentry_flutter.dart';
import '../replay/replay_config.dart';
import 'native_app_start.dart';
import 'native_frames.dart';

/// Provide typed methods to access native layer.
@internal
Expand All @@ -24,10 +23,6 @@ abstract class SentryNativeBinding {

FutureOr<void> captureStructuredEnvelope(SentryEnvelope envelope);

FutureOr<void> beginNativeFrames();

FutureOr<NativeFrames?> endNativeFrames(SentryId id);

FutureOr<void> setUser(SentryUser? user);

FutureOr<void> addBreadcrumb(Breadcrumb breadcrumb);
Expand Down
11 changes: 0 additions & 11 deletions flutter/lib/src/native/sentry_native_channel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import '../../sentry_flutter.dart';
import '../replay/replay_config.dart';
import 'method_channel_helper.dart';
import 'native_app_start.dart';
import 'native_frames.dart';
import 'sentry_native_binding.dart';
import 'sentry_native_invoker.dart';
import 'sentry_safe_method_channel.dart';
Expand Down Expand Up @@ -120,16 +119,6 @@ class SentryNativeChannel
Future<Map<String, dynamic>?> loadContexts() =>
channel.invokeMapMethod<String, dynamic>('loadContexts');

@override
Future<void> beginNativeFrames() => channel.invokeMethod('beginNativeFrames');

@override
Future<NativeFrames?> endNativeFrames(SentryId id) async {
final json = await channel.invokeMapMethod<String, dynamic>(
'endNativeFrames', {'id': id.toString()});
return (json != null) ? NativeFrames.fromJson(json) : null;
}

@override
Future<void> setUser(SentryUser? user) async {
if (user == null) {
Expand Down
42 changes: 6 additions & 36 deletions flutter/lib/src/navigation/sentry_navigator_observer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ import 'package:sentry/src/sentry_tracer.dart';
import '../../sentry_flutter.dart';
import '../event_processor/flutter_enricher_event_processor.dart';
import '../integrations/web_session_integration.dart';
import '../native/native_frames.dart';
import '../native/sentry_native_binding.dart';
import '../web/web_session_handler.dart';
import 'time_to_display_tracker.dart';

Expand Down Expand Up @@ -87,8 +85,7 @@ class SentryNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
_setRouteNameAsTransaction = setRouteNameAsTransaction,
_routeNameExtractor = routeNameExtractor,
_additionalInfoProvider = additionalInfoProvider,
_ignoreRoutes = ignoreRoutes ?? [],
_native = SentryFlutter.native {
_ignoreRoutes = ignoreRoutes ?? [] {
_isCreated = true;
if (enableAutoTransactions) {
_hub.options.sdk.addIntegration('UINavigationTracing');
Expand Down Expand Up @@ -117,25 +114,26 @@ class SentryNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
final bool _setRouteNameAsTransaction;
final RouteNameExtractor? _routeNameExtractor;
final AdditionalInfoExtractor? _additionalInfoProvider;
final SentryNativeBinding? _native;
final List<String> _ignoreRoutes;
TimeToDisplayTracker? _timeToDisplayTracker;

WebSessionHandler? _webSessionHandler;

@visibleForTesting
WebSessionHandler? get webSessionHandler => _webSessionHandler;

ISentrySpan? _transaction;

static String? _currentRouteName;

@internal
static String? get currentRouteName => _currentRouteName;

static bool _isCreated = false;

@internal
static bool get isCreated => _isCreated;

@internal
static String? get currentRouteName => _currentRouteName;

@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
super.didPush(route, previousRoute);
Expand Down Expand Up @@ -295,19 +293,6 @@ class SentryNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
trimEnd: true,
onFinish: (transaction) async {
_transaction = null;
final nativeFrames =
await _native?.endNativeFrames(transaction.context.traceId);
if (nativeFrames != null) {
final measurements = nativeFrames.toMeasurements();
for (final item in measurements.entries) {
final measurement = item.value;
transaction.setMeasurement(
item.key,
measurement.value,
unit: measurement.unit,
);
}
}
},
);
// if _enableAutoTransactions is enabled but there's no traces sample rate
Expand All @@ -326,8 +311,6 @@ class SentryNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
scope.span ??= _transaction;
});

await _native?.beginNativeFrames();

await _timeToDisplayTracker?.track(transaction);
}

Expand Down Expand Up @@ -434,16 +417,3 @@ class RouteObserverBreadcrumb extends Breadcrumb {
return args.toString();
}
}

extension NativeFramesMeasurement on NativeFrames {
Map<String, SentryMeasurement> toMeasurements() {
final total = SentryMeasurement.totalFrames(totalFrames);
final slow = SentryMeasurement.slowFrames(slowFrames);
final frozen = SentryMeasurement.frozenFrames(frozenFrames);
return {
total.name: total,
slow.name: slow,
frozen.name: frozen,
};
}
}
Loading
Loading