From d912550822f95555084ad482438a735b8df51b38 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 15:10:17 +0100 Subject: [PATCH 1/7] Add session tracking options and platform wiring --- .../io/sentry/godotplugin/SentryAndroidGodotPlugin.kt | 4 ++++ src/sentry/android/android_sdk.cpp | 2 ++ src/sentry/cocoa/cocoa_sdk.mm | 2 ++ src/sentry/javascript/bridge/src/sentry-bridge.ts | 3 ++- src/sentry/javascript/javascript_sdk.cpp | 1 + src/sentry/native/native_sdk.cpp | 1 + src/sentry/sentry_options.cpp | 6 ++++++ src/sentry/sentry_options.h | 8 ++++++++ 8 files changed, 26 insertions(+), 1 deletion(-) diff --git a/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt b/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt index eb6a5181d..3a3bf9e55 100644 --- a/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt +++ b/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt @@ -307,6 +307,8 @@ class SentryAndroidGodotPlugin(godot: Godot) : GodotPlugin(godot) { val propagateTraceparent = optionsData["propagate_traceparent"] as Boolean val orgId = optionsData["org_id"] as String val maxBreadcrumbs = optionsData["max_breadcrumbs"].toIntOrThrow() + val autoSessionTracking = optionsData["auto_session_tracking"] as Boolean + val sessionTrackingIntervalMs = optionsData["session_tracking_interval_ms"].toLongOrThrow() val enableAnrDetection = optionsData["enable_anr_detection"] as Boolean val anrTimeoutIntervalMs = optionsData["anr_timeout_interval_ms"].toLongOrThrow() val attachAnrThreadDump = optionsData["attach_anr_thread_dump"] as Boolean @@ -324,6 +326,8 @@ class SentryAndroidGodotPlugin(godot: Godot) : GodotPlugin(godot) { options.isPropagateTraceparent = propagateTraceparent options.orgId = orgId.ifEmpty { null } options.maxBreadcrumbs = maxBreadcrumbs + options.isEnableAutoSessionTracking = autoSessionTracking + options.sessionTrackingIntervalMillis = sessionTrackingIntervalMs options.sdkVersion?.name = "sentry.java.android.godot" options.nativeSdkName = "sentry.native.android.godot" options.isAnrEnabled = enableAnrDetection diff --git a/src/sentry/android/android_sdk.cpp b/src/sentry/android/android_sdk.cpp index 9b46df397..f310a4c4b 100644 --- a/src/sentry/android/android_sdk.cpp +++ b/src/sentry/android/android_sdk.cpp @@ -442,6 +442,8 @@ void AndroidSDK::init() { optionsData["propagate_traceparent"] = SENTRY_OPTIONS()->is_propagate_traceparent_enabled(); optionsData["org_id"] = SENTRY_OPTIONS()->get_org_id(); optionsData["max_breadcrumbs"] = SENTRY_OPTIONS()->get_max_breadcrumbs(); + optionsData["auto_session_tracking"] = SENTRY_OPTIONS()->is_auto_session_tracking_enabled(); + optionsData["session_tracking_interval_ms"] = SENTRY_OPTIONS()->get_session_tracking_interval_ms(); optionsData["enable_anr_detection"] = SENTRY_OPTIONS()->get_android()->get_enable_anr_detection(); optionsData["anr_timeout_interval_ms"] = SENTRY_OPTIONS()->get_android()->get_anr_timeout_interval_ms(); optionsData["attach_anr_thread_dump"] = SENTRY_OPTIONS()->get_android()->get_attach_anr_thread_dump(); diff --git a/src/sentry/cocoa/cocoa_sdk.mm b/src/sentry/cocoa/cocoa_sdk.mm index c7ca7f7a8..d8c76e9ed 100644 --- a/src/sentry/cocoa/cocoa_sdk.mm +++ b/src/sentry/cocoa/cocoa_sdk.mm @@ -335,6 +335,8 @@ void _add_default_attachments(SentryObjCScope *p_scope) { options.sampleRate = double_to_objc(SENTRY_OPTIONS()->get_sample_rate()); options.tracesSampleRate = double_to_objc(SENTRY_OPTIONS()->get_traces_sample_rate()); options.maxBreadcrumbs = (NSUInteger)SENTRY_OPTIONS()->get_max_breadcrumbs(); + options.enableAutoSessionTracking = SENTRY_OPTIONS()->is_auto_session_tracking_enabled(); + options.sessionTrackingIntervalMillis = SENTRY_OPTIONS()->get_session_tracking_interval_ms(); options.sendDefaultPii = SENTRY_OPTIONS()->is_send_default_pii_enabled(); options.diagnosticLevel = sentry_level_to_objc(SENTRY_OPTIONS()->get_diagnostic_level()); options.orgId = string_to_objc_or_nil_if_empty(SENTRY_OPTIONS()->get_org_id()); diff --git a/src/sentry/javascript/bridge/src/sentry-bridge.ts b/src/sentry/javascript/bridge/src/sentry-bridge.ts index 1e018dde7..4ae94d1f0 100644 --- a/src/sentry/javascript/bridge/src/sentry-bridge.ts +++ b/src/sentry/javascript/bridge/src/sentry-bridge.ts @@ -217,6 +217,7 @@ class SentryBridge { propagateTraceparent: boolean, orgId: "" | `${number}`, maxBreadcrumbs: number, + autoSessionTracking: boolean, sendDefaultPii: boolean, sdkVersion: string, enableTunnel: boolean, @@ -256,7 +257,7 @@ class SentryBridge { "Console", // very noisy in the Godot SDK ]; const filtered = integrations.filter(function (integration: { name: string }) { - return !excludedIntegrations.includes(integration.name); + return !excludedIntegrations.includes(integration.name) && (autoSessionTracking || integration.name !== "BrowserSession"); }); filtered.push(wasmIntegration()); if (traceLifecycle === TraceLifecycle.Stream) { diff --git a/src/sentry/javascript/javascript_sdk.cpp b/src/sentry/javascript/javascript_sdk.cpp index f0d7eae7a..1725cee87 100644 --- a/src/sentry/javascript/javascript_sdk.cpp +++ b/src/sentry/javascript/javascript_sdk.cpp @@ -420,6 +420,7 @@ void JavaScriptSDK::init() { SENTRY_OPTIONS()->is_propagate_traceparent_enabled(), SENTRY_OPTIONS()->get_org_id().utf8().get_data(), SENTRY_OPTIONS()->get_max_breadcrumbs(), + SENTRY_OPTIONS()->is_auto_session_tracking_enabled(), SENTRY_OPTIONS()->is_send_default_pii_enabled(), SENTRY_GODOT_SDK_VERSION, SENTRY_OPTIONS()->get_web()->get_enable_tunnel(), diff --git a/src/sentry/native/native_sdk.cpp b/src/sentry/native/native_sdk.cpp index f41b6d10e..0c2c3015a 100644 --- a/src/sentry/native/native_sdk.cpp +++ b/src/sentry/native/native_sdk.cpp @@ -444,6 +444,7 @@ void NativeSDK::init() { } sentry_options_set_max_breadcrumbs(options, SENTRY_OPTIONS()->get_max_breadcrumbs()); sentry_options_set_shutdown_timeout(options, SENTRY_OPTIONS()->get_shutdown_timeout_ms()); + sentry_options_set_auto_session_tracking(options, SENTRY_OPTIONS()->is_auto_session_tracking_enabled()); sentry_options_set_sdk_name(options, "sentry.native.godot"); sentry_options_set_logger_enabled_when_crashed(options, false); diff --git a/src/sentry/sentry_options.cpp b/src/sentry/sentry_options.cpp index f5c3088aa..17eb16a34 100644 --- a/src/sentry/sentry_options.cpp +++ b/src/sentry/sentry_options.cpp @@ -179,6 +179,8 @@ void SentryOptions::_define_project_settings(const Ref &p_options _define_setting(PropertyInfo(Variant::INT, "sentry/options/max_breadcrumbs", PROPERTY_HINT_RANGE, "0, 500"), p_options->max_breadcrumbs, false); _define_setting(PropertyInfo(Variant::INT, "sentry/options/shutdown_timeout_ms", PROPERTY_HINT_RANGE, "0,30000"), p_options->shutdown_timeout_ms, false); _define_setting("sentry/options/send_default_pii", p_options->send_default_pii); + _define_setting("sentry/options/auto_session_tracking", p_options->auto_session_tracking, false); + _define_setting(PropertyInfo(Variant::INT, "sentry/options/session_tracking_interval_ms", PROPERTY_HINT_RANGE, "0,120000,1,or_greater"), p_options->session_tracking_interval_ms, false); _define_setting("sentry/options/attach_log", p_options->attach_log, false); _define_setting("sentry/options/attach_scene_tree", p_options->attach_scene_tree); @@ -296,6 +298,8 @@ void SentryOptions::_load_project_settings(const Ref &p_options) p_options->max_breadcrumbs = ProjectSettings::get_singleton()->get_setting("sentry/options/max_breadcrumbs", p_options->max_breadcrumbs); p_options->shutdown_timeout_ms = ProjectSettings::get_singleton()->get_setting("sentry/options/shutdown_timeout_ms", p_options->shutdown_timeout_ms); p_options->send_default_pii = ProjectSettings::get_singleton()->get_setting("sentry/options/send_default_pii", p_options->send_default_pii); + p_options->auto_session_tracking = ProjectSettings::get_singleton()->get_setting("sentry/options/auto_session_tracking", p_options->auto_session_tracking); + p_options->session_tracking_interval_ms = ProjectSettings::get_singleton()->get_setting("sentry/options/session_tracking_interval_ms", p_options->session_tracking_interval_ms); p_options->attach_log = ProjectSettings::get_singleton()->get_setting("sentry/options/attach_log", p_options->attach_log); p_options->attach_scene_tree = ProjectSettings::get_singleton()->get_setting("sentry/options/attach_scene_tree", p_options->attach_scene_tree); @@ -520,6 +524,8 @@ void SentryOptions::_bind_methods() { BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::STRING, "org_id"), set_org_id, get_org_id); BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::INT, "max_breadcrumbs"), set_max_breadcrumbs, get_max_breadcrumbs); BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::INT, "shutdown_timeout_ms", PROPERTY_HINT_RANGE, "0,30000"), set_shutdown_timeout_ms, get_shutdown_timeout_ms); + BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::BOOL, "auto_session_tracking"), set_auto_session_tracking, is_auto_session_tracking_enabled); + BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::INT, "session_tracking_interval_ms", PROPERTY_HINT_RANGE, "0,120000,1,or_greater"), set_session_tracking_interval_ms, get_session_tracking_interval_ms); BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::BOOL, "send_default_pii"), set_send_default_pii, is_send_default_pii_enabled); BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::BOOL, "attach_log"), set_attach_log, is_attach_log_enabled); diff --git a/src/sentry/sentry_options.h b/src/sentry/sentry_options.h index 4a5413ce0..3d285b6e8 100644 --- a/src/sentry/sentry_options.h +++ b/src/sentry/sentry_options.h @@ -161,6 +161,8 @@ class SentryOptions : public RefCounted { String org_id = ""; int max_breadcrumbs = 100; int shutdown_timeout_ms = 2000; + bool auto_session_tracking = true; + int session_tracking_interval_ms = 30000; bool send_default_pii = false; bool attach_log = true; @@ -252,6 +254,12 @@ class SentryOptions : public RefCounted { _FORCE_INLINE_ int get_shutdown_timeout_ms() const { return shutdown_timeout_ms; } _FORCE_INLINE_ void set_shutdown_timeout_ms(int p_shutdown_timeout_ms) { shutdown_timeout_ms = p_shutdown_timeout_ms; } + _FORCE_INLINE_ bool is_auto_session_tracking_enabled() const { return auto_session_tracking; } + _FORCE_INLINE_ void set_auto_session_tracking(bool p_enabled) { auto_session_tracking = p_enabled; } + + _FORCE_INLINE_ int get_session_tracking_interval_ms() const { return session_tracking_interval_ms; } + _FORCE_INLINE_ void set_session_tracking_interval_ms(int p_interval_ms) { session_tracking_interval_ms = p_interval_ms; } + _FORCE_INLINE_ bool is_send_default_pii_enabled() const { return send_default_pii; } _FORCE_INLINE_ void set_send_default_pii(bool p_enabled) { send_default_pii = p_enabled; } From 96d384c831142cd15aa9ea6588ba2fa13e1846f1 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 15:16:17 +0100 Subject: [PATCH 2/7] Document session tracking options --- doc_classes/SentryOptions.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc_classes/SentryOptions.xml b/doc_classes/SentryOptions.xml index 5d7c6724f..de5c0a760 100644 --- a/doc_classes/SentryOptions.xml +++ b/doc_classes/SentryOptions.xml @@ -38,6 +38,9 @@ Configures automatic performance metric collection. See [SentryAutoMetricsOptions]. + + If [code]true[/code], the SDK automatically tracks sessions for [url=https://docs.sentry.io/product/releases/health/]Release Health[/url]. + If assigned, this callback runs before a screenshot is captured. It takes [SentryEvent] as a parameter and returns [code]false[/code] to skip capturing the screenshot, or [code]true[/code] to capture the screenshot. [codeblock] @@ -201,6 +204,10 @@ If [code]true[/code], the SDK will include PII (Personally Identifiable Information) with the events. + + How long the application can remain in the background before its session ends, in milliseconds. Defaults to [code]30000[/code] (30 seconds). Only applies when [member auto_session_tracking] is enabled. + [b]Platform support:[/b] Android, iOS, and macOS. Has no effect on Windows, Linux, or Web. + The maximum time in milliseconds the SDK will wait for pending events to be sent when [method SentrySDK.close] is called. If the timeout expires, the SDK will perform a forced shutdown and any unsent events may be lost. From 18da904a5f7fcc9719dc7e177163d59971fd8558 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 15:18:56 +0100 Subject: [PATCH 3/7] Test session tracking options and consolidate integer option tests --- project/test/suites/test_options.gd | 31 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/project/test/suites/test_options.gd b/project/test/suites/test_options.gd index d8b44b088..2eb072b8b 100644 --- a/project/test/suites/test_options.gd +++ b/project/test/suites/test_options.gd @@ -18,6 +18,7 @@ func test_bool_properties(property: String, test_parameters := [ ["attach_screenshot"], ["attach_scene_tree"], ["send_default_pii"], + ["auto_session_tracking"], ]) -> void: options.set(property, true) assert_bool(options.get(property)).is_true() @@ -65,6 +66,13 @@ func test_web_options_retain_assigned_values(property: String, value: Variant, t assert_that(options.web.get(property)).is_equal(value) +func test_session_tracking_defaults() -> void: + assert_bool(options.auto_session_tracking).is_true() + assert_int(options.session_tracking_interval_ms).is_equal(30000) + assert_bool(ProjectSettings.get_setting("sentry/options/auto_session_tracking")).is_true() + assert_int(ProjectSettings.get_setting("sentry/options/session_tracking_interval_ms")).is_equal(30000) + + func test_auto_metrics_defaults() -> void: assert_bool(options.auto_metrics.enable_frame_metrics).is_false() assert_float(options.auto_metrics.frame_metrics_interval_sec).is_equal(1.0) @@ -114,6 +122,17 @@ func test_string_properties(property: String, test_parameters := [ assert_str(options.get(property)).is_equal("test-value") +## Test simple int properties. +@warning_ignore("unused_parameter") +func test_int_properties(property: String, value: int, test_parameters := [ + ["max_breadcrumbs", 42], + ["shutdown_timeout_ms", 5000], + ["session_tracking_interval_ms", 45000], +]) -> void: + options.set(property, value) + assert_int(options.get(property)).is_equal(value) + + ## SentryOptions.sample_rate should be set to the specified value. func test_sample_rate() -> void: options.sample_rate = 0.5 @@ -143,18 +162,6 @@ func test_empty_trace_propagation_targets_are_filtered_out() -> void: assert_array(options.trace_propagation_targets).contains_exactly(["valid.example.com"]) -## SentryOptions.max_breadcrumbs should be set to the specified value. -func test_max_breadcrumbs() -> void: - options.max_breadcrumbs = 42 - assert_int(options.max_breadcrumbs).is_equal(42) - - -## SentryOptions.shutdown_timeout_ms should be set to the specified value. -func test_shutdown_timeout_ms() -> void: - options.shutdown_timeout_ms = 5000 - assert_int(options.shutdown_timeout_ms).is_equal(5000) - - ## Test mask properties on godot_logger options. @warning_ignore("unused_parameter") func test_godot_logger_mask_properties(property: String, test_parameters := [ From d6076c3c0a75ea1966fe14b833c6ece27df25342 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 15:46:20 +0100 Subject: [PATCH 4/7] Wire C# session tracking options to platform SDKs --- src/sentry/dotnet/csharp_interop.cpp | 8 ++++++++ .../managed/Sentry.Godot/Interop/NativeBridge.cs | 8 ++++++++ .../managed/Sentry.Godot/SentryGodotOptions.cs | 4 +--- .../dotnet/managed/Sentry.Godot/SentrySdk.cs | 14 +++++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/sentry/dotnet/csharp_interop.cpp b/src/sentry/dotnet/csharp_interop.cpp index f92646156..de022002e 100644 --- a/src/sentry/dotnet/csharp_interop.cpp +++ b/src/sentry/dotnet/csharp_interop.cpp @@ -231,6 +231,8 @@ struct NativeOptions { double traces_sample_rate; int32_t max_breadcrumbs; double shutdown_timeout_ms; + uint8_t auto_session_tracking; + int32_t session_tracking_interval_ms; uint8_t send_default_pii; // Godot-specific @@ -282,6 +284,8 @@ struct ManagedOptions { double traces_sample_rate; int32_t max_breadcrumbs; double shutdown_timeout_ms; + uint8_t auto_session_tracking; + int32_t session_tracking_interval_ms; uint8_t send_default_pii; uint8_t attach_log; @@ -344,6 +348,8 @@ static void _apply_managed_options(const ManagedOptions &data, Refset_traces_sample_rate(data.traces_sample_rate); options->set_max_breadcrumbs(data.max_breadcrumbs); options->set_shutdown_timeout_ms(data.shutdown_timeout_ms); + options->set_auto_session_tracking(data.auto_session_tracking != 0); + options->set_session_tracking_interval_ms(data.session_tracking_interval_ms); options->set_send_default_pii(data.send_default_pii); options->set_attach_log(data.attach_log); options->set_attach_scene_tree(data.attach_scene_tree); @@ -394,6 +400,8 @@ void _populate_options_data(NativeOptions &r_data, const Ref &opt r_data.traces_sample_rate = options->get_traces_sample_rate(); r_data.max_breadcrumbs = options->get_max_breadcrumbs(); r_data.shutdown_timeout_ms = options->get_shutdown_timeout_ms(); + r_data.auto_session_tracking = options->is_auto_session_tracking_enabled() ? 1 : 0; + r_data.session_tracking_interval_ms = options->get_session_tracking_interval_ms(); r_data.send_default_pii = options->is_send_default_pii_enabled(); r_data.attach_log = options->is_attach_log_enabled(); r_data.attach_scene_tree = options->is_attach_scene_tree_enabled(); diff --git a/src/sentry/dotnet/managed/Sentry.Godot/Interop/NativeBridge.cs b/src/sentry/dotnet/managed/Sentry.Godot/Interop/NativeBridge.cs index 5772e24c4..4eebd9568 100644 --- a/src/sentry/dotnet/managed/Sentry.Godot/Interop/NativeBridge.cs +++ b/src/sentry/dotnet/managed/Sentry.Godot/Interop/NativeBridge.cs @@ -193,6 +193,8 @@ private struct NativeOptions public double traces_sample_rate; public int max_breadcrumbs; public double shutdown_timeout_ms; + public byte auto_session_tracking; + public int session_tracking_interval_ms; public byte send_default_pii; public byte attach_log; public byte attach_scene_tree; @@ -234,6 +236,8 @@ private unsafe struct ManagedOptions public double traces_sample_rate; public int max_breadcrumbs; public double shutdown_timeout_ms; + public byte auto_session_tracking; + public int session_tracking_interval_ms; public byte send_default_pii; public byte attach_log; public byte attach_scene_tree; @@ -690,6 +694,8 @@ private static void ApplyNativeOptions(NativeOptions data, SentryGodotOptions op opts.TracesSampleRate = data.traces_sample_rate; opts.MaxBreadcrumbs = data.max_breadcrumbs; opts.ShutdownTimeout = TimeSpan.FromMilliseconds(data.shutdown_timeout_ms); + opts.AutoSessionTracking = data.auto_session_tracking != 0; + opts.AutoSessionTrackingInterval = TimeSpan.FromMilliseconds(data.session_tracking_interval_ms); opts.SendDefaultPii = data.send_default_pii != 0; opts.AttachLog = data.attach_log != 0; opts.AttachSceneTree = data.attach_scene_tree != 0; @@ -1013,6 +1019,8 @@ public static unsafe void InitNativeSdk(SentryGodotOptions opts) traces_sample_rate = opts.TracesSampleRate ?? 0.0, max_breadcrumbs = opts.MaxBreadcrumbs, shutdown_timeout_ms = opts.ShutdownTimeout.TotalMilliseconds, + auto_session_tracking = (byte)(opts.AutoSessionTracking ? 1 : 0), + session_tracking_interval_ms = (int)opts.AutoSessionTrackingInterval.TotalMilliseconds, send_default_pii = (byte)(opts.SendDefaultPii ? 1 : 0), attach_log = (byte)(opts.AttachLog ? 1 : 0), attach_scene_tree = (byte)(opts.AttachSceneTree ? 1 : 0), diff --git a/src/sentry/dotnet/managed/Sentry.Godot/SentryGodotOptions.cs b/src/sentry/dotnet/managed/Sentry.Godot/SentryGodotOptions.cs index b901ba926..cb12222bb 100644 --- a/src/sentry/dotnet/managed/Sentry.Godot/SentryGodotOptions.cs +++ b/src/sentry/dotnet/managed/Sentry.Godot/SentryGodotOptions.cs @@ -9,6 +9,7 @@ namespace Sentry.Godot; /// Configures the Sentry SDK for Godot. /// /// +/// applies to Android, iOS, and macOS only. /// Regular expressions in sync to the native layer using only /// their pattern. Constructor-supplied are not preserved. /// For case-insensitive matching in both layers, include (?i) in the pattern instead of using @@ -22,9 +23,6 @@ public SentryGodotOptions() EnableScopeSync = true; ScopeObserver = new GodotScopeObserver(); - // Native layer owns sessions; .NET-side tracking would double-count. - AutoSessionTracking = false; - AddInAppExclude("Godot"); AddIntegration(new GodotSdkIntegration()); diff --git a/src/sentry/dotnet/managed/Sentry.Godot/SentrySdk.cs b/src/sentry/dotnet/managed/Sentry.Godot/SentrySdk.cs index 026ccb6c5..11f5a161f 100644 --- a/src/sentry/dotnet/managed/Sentry.Godot/SentrySdk.cs +++ b/src/sentry/dotnet/managed/Sentry.Godot/SentrySdk.cs @@ -118,7 +118,19 @@ private static void InitDotnet(SentryGodotOptions godotOptions) ConfigureAssemblyReader(godotOptions); ConfigureCocoaDebugImagesOnIOS(godotOptions); - Sentry.SentrySdk.Init(godotOptions); + + // Native layer owns sessions; .NET-side tracking would double-count. + var autoSessionTracking = godotOptions.AutoSessionTracking; + godotOptions.AutoSessionTracking = false; + try + { + Sentry.SentrySdk.Init(godotOptions); + } + finally + { + godotOptions.AutoSessionTracking = autoSessionTracking; + } + InitFirstChanceExceptionHandler(); } From f373a986e4decd5a9b8c8e2f1e3de5e9bd993ce4 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 15:47:18 +0100 Subject: [PATCH 5/7] Test automatic session tracking in the JavaScript bridge --- src/sentry/javascript/bridge/test.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/sentry/javascript/bridge/test.js b/src/sentry/javascript/bridge/test.js index 26050625c..4aa6d5a65 100644 --- a/src/sentry/javascript/bridge/test.js +++ b/src/sentry/javascript/bridge/test.js @@ -141,10 +141,10 @@ try { transaction.tags = { processed : "true" }; transaction.shouldDiscard = discardNextTransaction; }; - const initBridge = (traceLifecycle, propagateTraceparent = false, orgId = "", tracePropagationTargets = [ { pattern : ".*", is_regex : false } ]) => { + const initBridge = (traceLifecycle, propagateTraceparent = false, orgId = "", tracePropagationTargets = [ { pattern : ".*", is_regex : false } ], autoSessionTracking = true) => { bridge.init(() => {}, beforeSendTransaction, beforeSendFeedback, null, null, readAttachment, "https://test@sentry.io/123", false, "1.0.0", "1", "production", 1.0, 1.0, traceLifecycle, JSON.stringify(tracePropagationTargets), - propagateTraceparent, orgId, 100, false, + propagateTraceparent, orgId, 100, autoSessionTracking, false, "0.1.0", false, "", "", false); }; @@ -166,6 +166,18 @@ try { assertEqual(targets[1].source, "api\\.example\\.com", "regular expression patterns should be preserved"); }); + runTest("init() disables automatic session tracking", () => { + initBridge(bridge.TraceLifecycle.Stream, false, "", [], false); + const client = bridge.createScope().getClient(); + assert(!client.getIntegrationByName("BrowserSession"), "BrowserSession should be excluded when disabled"); + }); + + runTest("init() enables automatic session tracking", () => { + initBridge(bridge.TraceLifecycle.Stream); + const client = bridge.createScope().getClient(); + assert(client.getIntegrationByName("BrowserSession"), "BrowserSession should be included by default"); + }); + runTest("console output does not produce breadcrumbs", () => { getIsolationScope().clearBreadcrumbs(); let event; From 01bcc3f2cbf1ca42c9dc8de98e8527871a5a0c93 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 15:48:43 +0100 Subject: [PATCH 6/7] Test session tracking options across the .NET interop boundary --- project/test/dotnet/DotnetTestHarness.cs | 4 ++++ tests/cpp/tests/test_dotnet_options.cpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/project/test/dotnet/DotnetTestHarness.cs b/project/test/dotnet/DotnetTestHarness.cs index f1bea10a4..b80aa7546 100644 --- a/project/test/dotnet/DotnetTestHarness.cs +++ b/project/test/dotnet/DotnetTestHarness.cs @@ -125,6 +125,8 @@ public void InitWithInteropOptions() _receivedOptions["trace_propagation_targets"] = tracePropagationTargets; _receivedOptions["propagate_traceparent"] = options.PropagateTraceparent; _receivedOptions["org_id"] = options.OrgId; + _receivedOptions["auto_session_tracking"] = options.AutoSessionTracking; + _receivedOptions["session_tracking_interval_ms"] = (int)options.AutoSessionTrackingInterval.TotalMilliseconds; _receivedOptions["max_breadcrumbs"] = options.MaxBreadcrumbs; _receivedOptions["shutdown_timeout_ms"] = (int)options.ShutdownTimeout.TotalMilliseconds; _receivedOptions["send_default_pii"] = options.SendDefaultPii; @@ -171,6 +173,8 @@ public void InitWithInteropOptions() options.TracePropagationTargets.Add("ddd"); options.PropagateTraceparent = false; options.OrgId = "222"; + options.AutoSessionTracking = true; + options.AutoSessionTrackingInterval = TimeSpan.FromMilliseconds(45000); options.MaxBreadcrumbs = 22; options.ShutdownTimeout = TimeSpan.FromMilliseconds(2200); options.SendDefaultPii = false; diff --git a/tests/cpp/tests/test_dotnet_options.cpp b/tests/cpp/tests/test_dotnet_options.cpp index 58675d4fe..33f075abd 100644 --- a/tests/cpp/tests/test_dotnet_options.cpp +++ b/tests/cpp/tests/test_dotnet_options.cpp @@ -74,6 +74,8 @@ TEST_SUITE("[.NET] Options interop") { { "sentry/options/tracing/trace_propagation_targets", "trace_propagation_targets", Strings({ "aaa", "bbb" }), Array({ "ccc", "ddd" }) }, { "sentry/options/tracing/propagate_traceparent", "propagate_traceparent", true, false }, { "sentry/options/tracing/org_id", "org_id", "111", "222" }, + { "sentry/options/auto_session_tracking", "auto_session_tracking", false, true }, + { "sentry/options/session_tracking_interval_ms", "session_tracking_interval_ms", 15000, 45000 }, { "sentry/options/max_breadcrumbs", "max_breadcrumbs", 11, 22 }, { "sentry/options/shutdown_timeout_ms", "shutdown_timeout_ms", 1100, 2200 }, { "sentry/options/send_default_pii", "send_default_pii", true, false }, From 61d4b17c287f4aeaf93f02537e9625f7e8c535cc Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 6 Nov 2026 16:01:50 +0100 Subject: [PATCH 7/7] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20e196d04..f347d84b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Add opt-in automatic network metrics for peer counts, ping, packet loss, and traffic rates, configurable through `SentryOptions.auto_metrics` and Project Settings ([#1033](https://github.com/getsentry/sentry-godot/pull/1033)) - Web: Add tunneling through your own server to help avoid ad blockers ([#1057](https://github.com/getsentry/sentry-godot/pull/1057)) +- Add `auto_session_tracking` to control automatic session tracking and `session_tracking_interval_ms` to configure its background timeout ([#1069](https://github.com/getsentry/sentry-godot/pull/1069)) ### Fixes