From 35b1ad8519e933d433a6cc411d84fabc3ae89db7 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 24 Jan 2025 18:22:57 +0100 Subject: [PATCH 1/3] first attempts --- src/Sentry.Unity.iOS/SentryCocoaBridgeProxy.cs | 6 ++++++ src/Sentry.Unity.iOS/SentryNativeCocoa.cs | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/Sentry.Unity.iOS/SentryCocoaBridgeProxy.cs b/src/Sentry.Unity.iOS/SentryCocoaBridgeProxy.cs index 7c8442c98..9dbf03cae 100644 --- a/src/Sentry.Unity.iOS/SentryCocoaBridgeProxy.cs +++ b/src/Sentry.Unity.iOS/SentryCocoaBridgeProxy.cs @@ -60,6 +60,9 @@ public static bool Init(SentryUnityOptions options) options.DiagnosticLogger?.LogDebug("Setting MaxCacheItems: {0}", options.MaxCacheItems); OptionsSetInt(cOptions, "maxCacheItems", options.MaxCacheItems); + options.DiagnosticLogger?.LogDebug("Setting TracesSampleRate: 0"); + OptionsSetInt(cOptions, "tracesSampleRate", 0); + var result = StartWithOptions(cOptions); return result is 1; } @@ -108,4 +111,7 @@ public static bool Init(SentryUnityOptions options) [DllImport("__Internal", EntryPoint = "SentryNativeBridgeGetInstallationId")] public static extern string GetInstallationId(); + + [DllImport("__Internal", EntryPoint = "SentryNativeBridgeSetTraceId")] + public static extern void SetTraceId(string? traceId); } diff --git a/src/Sentry.Unity.iOS/SentryNativeCocoa.cs b/src/Sentry.Unity.iOS/SentryNativeCocoa.cs index 3a6e83601..e4e0b2336 100644 --- a/src/Sentry.Unity.iOS/SentryNativeCocoa.cs +++ b/src/Sentry.Unity.iOS/SentryNativeCocoa.cs @@ -90,6 +90,23 @@ internal static void Configure(SentryUnityOptions options, ISentryUnityInfo sent options.DiagnosticLogger?.LogInfo("Successfully configured the native SDK"); } + public static void SetTraceId(SentryUnityOptions options) + { + options.DiagnosticLogger?.LogInfo("Setting Trace ID"); + + var traceId = SentrySdk.GetTraceHeader()?.TraceId; + if (traceId is null) + { + options.DiagnosticLogger?.LogInfo("fucking trace id is null"); + } + else + { + options.DiagnosticLogger?.LogInfo("Setting the trace ID on the native layer {0}", traceId); + + SentryCocoaBridgeProxy.SetTraceId(traceId.ToString()); + } + } + /// /// Closes the native Cocoa support. /// From acaf471b546e4e8bb22f4cc45af00787d8db5d2c Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 24 Jan 2025 18:25:01 +0100 Subject: [PATCH 2/3] native bridge --- package-dev/Plugins/iOS/SentryNativeBridge.m | 12 +++++ .../Plugins/macOS/SentryNativeBridge.m | 52 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/package-dev/Plugins/iOS/SentryNativeBridge.m b/package-dev/Plugins/iOS/SentryNativeBridge.m index 98982997d..fdd23f7b8 100644 --- a/package-dev/Plugins/iOS/SentryNativeBridge.m +++ b/package-dev/Plugins/iOS/SentryNativeBridge.m @@ -169,6 +169,18 @@ void SentryNativeBridgeUnsetUser() return cString; } +void SentryNativeBridgeSetTraceId(const char *traceId) +{ + if (traceId == NULL) { + return; + } + + [SentrySDK configureScope:^(SentryScope *scope) { + SentryId *sentryTraceId = [[SentryId alloc] initWithUUIDString:[NSString stringWithUTF8String:traceId]]; + scope.propagationContext.traceId = sentryTraceId; + }]; +} + static inline NSString *_NSStringOrNil(const char *value) { return value ? [NSString stringWithUTF8String:value] : nil; diff --git a/package-dev/Plugins/macOS/SentryNativeBridge.m b/package-dev/Plugins/macOS/SentryNativeBridge.m index 0f696675d..126419743 100644 --- a/package-dev/Plugins/macOS/SentryNativeBridge.m +++ b/package-dev/Plugins/macOS/SentryNativeBridge.m @@ -9,6 +9,7 @@ static Class SentryUser; static Class SentryOptions; static Class PrivateSentrySDKOnly; +static Class SentryId; #define LOAD_CLASS_OR_BREAK(name) \ name = (__bridge Class)dlsym(dylib, "OBJC_CLASS_$_" #name); \ @@ -41,6 +42,16 @@ int SentryNativeBridgeLoadLibrary() LOAD_CLASS_OR_BREAK(SentryUser) LOAD_CLASS_OR_BREAK(SentryOptions) LOAD_CLASS_OR_BREAK(PrivateSentrySDKOnly) + + // Try to load SentryId from Swift module + SentryId = (__bridge Class)dlsym(dylib, "OBJC_CLASS_$__TtC6Sentry8SentryId"); + if (!SentryId) { + // Fallback to try the Objective-C name + SentryId = (__bridge Class)dlsym(dylib, "OBJC_CLASS_$_SentryId"); + if (!SentryId) { + NSLog(@"Sentry (bridge): SentryId class not available - some features will be disabled"); + } + } // everything above passed - mark as successfully loaded loadStatus = 1; @@ -72,14 +83,23 @@ void SentryNativeBridgeOptionsSetInt(const void *options, const char *name, int3 dictOptions[[NSString stringWithUTF8String:name]] = [NSNumber numberWithInt:value]; } -void SentryNativeBridgeStartWithOptions(const void *options) +int SentryNativeBridgeStartWithOptions(const void *options) { NSMutableDictionary *dictOptions = (__bridge_transfer NSMutableDictionary *)options; + NSError *error = nil; + id sentryOptions = [[SentryOptions alloc] performSelector:@selector(initWithDict:didFailWithError:) - withObject:dictOptions withObject:nil]; + withObject:dictOptions + withObject:&error]; + + if (error != nil) + { + return 0; + } [SentrySDK performSelector:@selector(startWithOptions:) withObject:sentryOptions]; + return 1; } void SentryConfigureScope(void (^callback)(id)) @@ -255,6 +275,34 @@ void SentryNativeBridgeUnsetUser() return cString; } +void SentryNativeBridgeSetTraceId(const char *traceId) +{ + if (traceId == NULL) { + return; + } + + SentryConfigureScope(^(id scope) { + @try { + id sentryTraceId = [[SentryId alloc] performSelector:@selector(initWithUUIDString:) + withObject:[NSString stringWithUTF8String:traceId]]; + [scope setValue:sentryTraceId forKeyPath:@"propagationContext.traceId"]; + } @catch (NSException *exception) { + NSLog(@"Sentry (bridge): Failed to set trace ID: %@", exception.reason); + } + }); + + @try { + [SentrySDK performSelector:@selector(currentHub) withObject:nil]; + id currentScope = [[SentrySDK performSelector:@selector(currentHub)] performSelector:@selector(scope)]; + id propagationContext = [currentScope valueForKeyPath:@"propagationContext"]; + id setTraceId = [propagationContext valueForKey:@"traceId"]; + NSString *setTraceIdString = [setTraceId performSelector:@selector(sentryIdString)]; + NSLog(@"Sentry (bridge): Verified trace ID is set to: %@", setTraceIdString); + } @catch (NSException *exception) { + NSLog(@"Sentry (bridge): Failed to verify trace ID: %@", exception.reason); + } +} + static inline NSString *_NSStringOrNil(const char *value) { return value ? [NSString stringWithUTF8String:value] : nil; From b5af05402bbede36e2fa76d9a7eb2ca8b27e25df Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Mon, 27 Jan 2025 11:08:40 +0100 Subject: [PATCH 3/3] sync trace id after init --- package-dev/Runtime/SentryInitialization.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package-dev/Runtime/SentryInitialization.cs b/package-dev/Runtime/SentryInitialization.cs index 97591140e..f87ef1ae0 100644 --- a/package-dev/Runtime/SentryInitialization.cs +++ b/package-dev/Runtime/SentryInitialization.cs @@ -86,6 +86,10 @@ public static void Init() SentryUnity.Init(options); +#if SENTRY_NATIVE_COCOA + SentryNativeCocoa.SetTraceId(options); +#endif + #if !SENTRY_WEBGL if (options.TracesSampleRate > 0.0f && options.AutoStartupTraces) {