From 688739aba2e188bb0fdc464131066445afd34f04 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 16:44:10 +0100 Subject: [PATCH 01/28] Add SentryBreadcrumb abstract class --- src/register_types.cpp | 4 ++- src/sentry/{ => disabled}/disabled_event.h | 0 src/sentry/{ => disabled}/disabled_sdk.h | 2 +- src/sentry_breadcrumb.cpp | 12 ++++++++ src/sentry_breadcrumb.h | 36 ++++++++++++++++++++++ 5 files changed, 52 insertions(+), 2 deletions(-) rename src/sentry/{ => disabled}/disabled_event.h (100%) rename src/sentry/{ => disabled}/disabled_sdk.h (97%) create mode 100644 src/sentry_breadcrumb.cpp create mode 100644 src/sentry_breadcrumb.h diff --git a/src/register_types.cpp b/src/register_types.cpp index 2a5ae885..ea418dec 100644 --- a/src/register_types.cpp +++ b/src/register_types.cpp @@ -1,6 +1,7 @@ #include "runtime_config.h" -#include "sentry/disabled_event.h" +#include "sentry/disabled/disabled_event.h" #include "sentry/util.h" +#include "sentry_breadcrumb.h" #include "sentry_configuration.h" #include "sentry_event.h" #include "sentry_logger.h" @@ -53,6 +54,7 @@ void initialize_module(ModuleInitializationLevel p_level) { GDREGISTER_CLASS(SentrySDK); GDREGISTER_ABSTRACT_CLASS(SentryEvent); GDREGISTER_INTERNAL_CLASS(DisabledEvent); + GDREGISTER_ABSTRACT_CLASS(SentryBreadcrumb); GDREGISTER_INTERNAL_CLASS(SentryLogger); #ifdef NATIVE_SDK GDREGISTER_INTERNAL_CLASS(NativeEvent); diff --git a/src/sentry/disabled_event.h b/src/sentry/disabled/disabled_event.h similarity index 100% rename from src/sentry/disabled_event.h rename to src/sentry/disabled/disabled_event.h diff --git a/src/sentry/disabled_sdk.h b/src/sentry/disabled/disabled_sdk.h similarity index 97% rename from src/sentry/disabled_sdk.h rename to src/sentry/disabled/disabled_sdk.h index ab00c7cf..8b86edf0 100644 --- a/src/sentry/disabled_sdk.h +++ b/src/sentry/disabled/disabled_sdk.h @@ -1,7 +1,7 @@ #ifndef DISABLED_SDK_H #define DISABLED_SDK_H -#include "sentry/disabled_event.h" +#include "disabled_event.h" #include "sentry/internal_sdk.h" namespace sentry { diff --git a/src/sentry_breadcrumb.cpp b/src/sentry_breadcrumb.cpp new file mode 100644 index 00000000..ae568085 --- /dev/null +++ b/src/sentry_breadcrumb.cpp @@ -0,0 +1,12 @@ +#include "sentry_breadcrumb.h" + +#include "sentry/simple_bind.h" +#include "sentry_sdk.h" // Needed for VariantCaster + +void SentryBreadcrumb::_bind_methods() { + BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, message); + BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, category); + BIND_PROPERTY(SentryBreadcrumb, sentry::make_level_enum_property("level"), set_level, get_level); + BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, type); + BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::DICTIONARY, data); +} diff --git a/src/sentry_breadcrumb.h b/src/sentry_breadcrumb.h new file mode 100644 index 00000000..f420aaff --- /dev/null +++ b/src/sentry_breadcrumb.h @@ -0,0 +1,36 @@ +#ifndef SENTRY_BREADCRUMB_H +#define SENTRY_BREADCRUMB_H + +#include "sentry/level.h" + +#include + +using namespace godot; + +// Represents breadcrumbs in the public API. +class SentryBreadcrumb : public RefCounted { + GDCLASS(SentryBreadcrumb, RefCounted); + +protected: + static void _bind_methods(); + +public: + virtual void set_message(const String &p_message) = 0; + virtual String get_message() const = 0; + + virtual void set_category(const String &p_category) = 0; + virtual String get_category() const = 0; + + virtual void set_level(sentry::Level p_level) = 0; + virtual sentry::Level get_level() const = 0; + + virtual void set_type(const String &p_type) = 0; + virtual String get_type() const = 0; + + virtual void set_data(const Dictionary &p_data) = 0; + virtual Dictionary get_data() const = 0; + + virtual ~SentryBreadcrumb() = default; +}; + +#endif // SENTRY_BREADCRUMB_H From d9ac3dfe5b2d52231569e8242d8673cba09eb69f Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:22:15 +0100 Subject: [PATCH 02/28] Add DisabledBreadcrumb --- src/sentry/disabled/disabled_breadcrumb.h | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/sentry/disabled/disabled_breadcrumb.h diff --git a/src/sentry/disabled/disabled_breadcrumb.h b/src/sentry/disabled/disabled_breadcrumb.h new file mode 100644 index 00000000..e482c37f --- /dev/null +++ b/src/sentry/disabled/disabled_breadcrumb.h @@ -0,0 +1,34 @@ +#ifndef DISABLED_BREADCRUMB_H +#define DISABLED_BREADCRUMB_H + +#include "sentry/level.h" +#include "sentry_breadcrumb.h" + +class DisabledBreadcrumb : public SentryBreadcrumb { + GDCLASS(DisabledBreadcrumb, SentryBreadcrumb); + +private: + String message; + String category; + sentry::Level level = sentry::Level::LEVEL_INFO; + String type; + Dictionary data; + +public: + virtual void set_message(const String &p_message) override { message = p_message; } + virtual String get_message() const override { return message; } + + virtual void set_category(const String &p_category) override { category = p_category; } + virtual String get_category() const override { return category; } + + virtual void set_level(sentry::Level p_level) override { level = p_level; } + virtual sentry::Level get_level() const override { return level; } + + virtual void set_type(const String &p_type) override { type = p_type; } + virtual String get_type() const override { return type; } + + virtual void set_data(const Dictionary &p_data) override { data = p_data; } + virtual Dictionary get_data() const override { return data; } +}; + +#endif // DISABLED_BREADCRUMB_H From 39c5a410529c4ee88dbfcacee5cc6bb67f069088 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:22:47 +0100 Subject: [PATCH 03/28] Implement NativeBreadcrumb --- src/sentry/native/native_breadcrumb.cpp | 77 +++++++++++++++++++++++++ src/sentry/native/native_breadcrumb.h | 35 +++++++++++ src/sentry/native/native_util.h | 10 ++++ 3 files changed, 122 insertions(+) create mode 100644 src/sentry/native/native_breadcrumb.cpp create mode 100644 src/sentry/native/native_breadcrumb.h diff --git a/src/sentry/native/native_breadcrumb.cpp b/src/sentry/native/native_breadcrumb.cpp new file mode 100644 index 00000000..597e50d6 --- /dev/null +++ b/src/sentry/native/native_breadcrumb.cpp @@ -0,0 +1,77 @@ +#include "native_breadcrumb.h" +#include "godot_cpp/core/error_macros.hpp" +#include "sentry/native/native_util.h" + +#include + +void NativeBreadcrumb::set_message(const String &p_message) { + sentry::native::sentry_value_set_or_remove_string_by_key(native_crumb, "message", p_message); +} + +String NativeBreadcrumb::get_message() const { + return sentry_value_as_string( + sentry_value_get_by_key(native_crumb, "message")); +} + +void NativeBreadcrumb::set_category(const String &p_category) { + sentry::native::sentry_value_set_or_remove_string_by_key(native_crumb, "category", p_category); +} + +String NativeBreadcrumb::get_category() const { + return sentry_value_as_string( + sentry_value_get_by_key(native_crumb, "category")); +} + +void NativeBreadcrumb::set_level(sentry::Level p_level) { + sentry_value_set_by_key(native_crumb, "level", + sentry_value_new_string(sentry::native::level_to_cstring(p_level))); +} + +sentry::Level NativeBreadcrumb::get_level() const { + sentry_value_t value = sentry_value_get_by_key(native_crumb, "level"); + if (sentry_value_is_null(value)) { + return sentry::Level::LEVEL_ERROR; + } + return sentry::native::cstring_to_level(sentry_value_as_string(value)); +} + +void NativeBreadcrumb::set_type(const String &p_type) { + sentry::native::sentry_value_set_or_remove_string_by_key(native_crumb, "type", p_type); +} + +String NativeBreadcrumb::get_type() const { + return sentry_value_as_string( + sentry_value_get_by_key(native_crumb, "type")); +} + +void NativeBreadcrumb::set_data(const Dictionary &p_data) { + sentry_value_t native_data = sentry::native::variant_to_sentry_value(p_data); + sentry_value_set_by_key(native_crumb, "data", native_data); +} + +Dictionary NativeBreadcrumb::get_data() const { + // TODO: implement sentry_value_to_variant() + // return sentry::native::sentry_value_to_variant(sentry_value_get_by_key(native_crumb, "data")); + WARN_PRINT("Not implemented."); + return Dictionary(); +} + +NativeBreadcrumb::NativeBreadcrumb(sentry_value_t p_native_crumb) { + if (sentry_value_refcount(p_native_crumb) > 0) { + sentry_value_incref(p_native_crumb); // acquire ownership + native_crumb = p_native_crumb; + } else { + // Shouldn't happen in healthy code. + native_crumb = sentry_value_new_object(); + ERR_PRINT("Sentry: Internal error: Breadcrumb refcount is zero."); + } + native_crumb = p_native_crumb; +} + +NativeBreadcrumb::NativeBreadcrumb() { + native_crumb = sentry_value_new_object(); +} + +NativeBreadcrumb::~NativeBreadcrumb() { + sentry_value_decref(native_crumb); // release ownership +} diff --git a/src/sentry/native/native_breadcrumb.h b/src/sentry/native/native_breadcrumb.h new file mode 100644 index 00000000..2d7f1d9f --- /dev/null +++ b/src/sentry/native/native_breadcrumb.h @@ -0,0 +1,35 @@ +#ifndef NATIVE_BREADCRUMB_H +#define NATIVE_BREADCRUMB_H + +#include "sentry_breadcrumb.h" + +#include + +class NativeBreadcrumb : public SentryBreadcrumb { + GDCLASS(NativeBreadcrumb, SentryBreadcrumb); + +private: + sentry_value_t native_crumb; + +public: + virtual void set_message(const String &p_message) override; + virtual String get_message() const override; + + virtual void set_category(const String &p_category) override; + virtual String get_category() const override; + + virtual void set_level(sentry::Level p_level) override; + virtual sentry::Level get_level() const override; + + virtual void set_type(const String &p_type) override; + virtual String get_type() const override; + + virtual void set_data(const Dictionary &p_data) override; + virtual Dictionary get_data() const override; + + NativeBreadcrumb(sentry_value_t p_native_crumb); + NativeBreadcrumb(); + virtual ~NativeBreadcrumb() override; +}; + +#endif // NATIVE_BREADCRUMB_H diff --git a/src/sentry/native/native_util.h b/src/sentry/native/native_util.h index 51fac3c2..f6bf7338 100644 --- a/src/sentry/native/native_util.h +++ b/src/sentry/native/native_util.h @@ -1,6 +1,7 @@ #ifndef NATIVE_UTIL_H #define NATIVE_UTIL_H +#include "godot_cpp/core/defs.hpp" #include "sentry/level.h" #include @@ -25,9 +26,18 @@ String make_uuid(); sentry_level_t level_to_native(Level p_level); Level native_to_level(sentry_level_t p_native_level); +// TODO: move this to level.h CharString level_to_cstring(Level p_level); Level cstring_to_level(const CharString &p_cstring); +_FORCE_INLINE_ void sentry_value_set_or_remove_string_by_key(sentry_value_t value, const char *k, const String &v) { + if (v.is_empty()) { + sentry_value_remove_by_key(value, k); + } else { + sentry_value_set_by_key(value, k, sentry_value_new_string(v.utf8())); + } +} + } //namespace sentry::native #endif // NATIVE_UTIL_H From 866ad3d742345ab61923d40560ade76a151a3799 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:23:02 +0100 Subject: [PATCH 04/28] Register those classes --- src/register_types.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/register_types.cpp b/src/register_types.cpp index ea418dec..2c5b28d6 100644 --- a/src/register_types.cpp +++ b/src/register_types.cpp @@ -1,5 +1,7 @@ #include "runtime_config.h" +#include "sentry/disabled/disabled_breadcrumb.h" #include "sentry/disabled/disabled_event.h" +#include "sentry/native/native_breadcrumb.h" #include "sentry/util.h" #include "sentry_breadcrumb.h" #include "sentry_configuration.h" @@ -55,9 +57,11 @@ void initialize_module(ModuleInitializationLevel p_level) { GDREGISTER_ABSTRACT_CLASS(SentryEvent); GDREGISTER_INTERNAL_CLASS(DisabledEvent); GDREGISTER_ABSTRACT_CLASS(SentryBreadcrumb); + GDREGISTER_INTERNAL_CLASS(DisabledBreadcrumb); GDREGISTER_INTERNAL_CLASS(SentryLogger); #ifdef NATIVE_SDK GDREGISTER_INTERNAL_CLASS(NativeEvent); + GDREGISTER_INTERNAL_CLASS(NativeBreadcrumb); #endif // NATIVE_SDK SentryOptions::create_singleton(); From 8aa047301daaf0dcb0e90b96fd4999ee92940086 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:29:42 +0100 Subject: [PATCH 05/28] Create breadcrumb internal method --- src/sentry/disabled/disabled_sdk.h | 2 ++ src/sentry/internal_sdk.h | 2 ++ src/sentry/native/native_sdk.cpp | 5 +++++ src/sentry/native/native_sdk.h | 1 + 4 files changed, 10 insertions(+) diff --git a/src/sentry/disabled/disabled_sdk.h b/src/sentry/disabled/disabled_sdk.h index 8b86edf0..2b57c909 100644 --- a/src/sentry/disabled/disabled_sdk.h +++ b/src/sentry/disabled/disabled_sdk.h @@ -1,6 +1,7 @@ #ifndef DISABLED_SDK_H #define DISABLED_SDK_H +#include "disabled_breadcrumb.h" #include "disabled_event.h" #include "sentry/internal_sdk.h" @@ -19,6 +20,7 @@ class DisabledSDK : public InternalSDK { virtual void add_breadcrumb(const String &p_message, const String &p_category, Level p_level, const String &p_type = "default", const Dictionary &p_data = Dictionary()) override {} + virtual Ref create_breadcrumb() override { return memnew(DisabledBreadcrumb); } virtual String capture_message(const String &p_message, Level p_level = sentry::LEVEL_INFO, const String &p_logger = "") override { return ""; } virtual String get_last_event_id() override { return ""; } diff --git a/src/sentry/internal_sdk.h b/src/sentry/internal_sdk.h index 2952a3fb..0c24440a 100644 --- a/src/sentry/internal_sdk.h +++ b/src/sentry/internal_sdk.h @@ -2,6 +2,7 @@ #define INTERNAL_SDK_H #include "sentry/level.h" +#include "sentry_breadcrumb.h" #include "sentry_event.h" #include "sentry_user.h" @@ -37,6 +38,7 @@ class InternalSDK { virtual void add_breadcrumb(const String &p_message, const String &p_category, Level p_level, const String &p_type = "default", const Dictionary &p_data = Dictionary()) = 0; + virtual Ref create_breadcrumb() = 0; // TODO: Consider adding the following function. // virtual void clear_breadcrumbs() = 0; diff --git a/src/sentry/native/native_sdk.cpp b/src/sentry/native/native_sdk.cpp index 3ae0ebdc..82092d1d 100644 --- a/src/sentry/native/native_sdk.cpp +++ b/src/sentry/native/native_sdk.cpp @@ -3,6 +3,7 @@ #include "sentry.h" #include "sentry/contexts.h" #include "sentry/level.h" +#include "sentry/native/native_breadcrumb.h" #include "sentry/native/native_event.h" #include "sentry/native/native_util.h" #include "sentry/util.h" @@ -154,6 +155,10 @@ void NativeSDK::add_breadcrumb(const String &p_message, const String &p_category sentry_add_breadcrumb(crumb); } +Ref NativeSDK::create_breadcrumb() { + return memnew(NativeBreadcrumb); +} + String NativeSDK::capture_message(const String &p_message, Level p_level, const String &p_logger) { sentry_value_t event = sentry_value_new_message_event( native::level_to_native(p_level), diff --git a/src/sentry/native/native_sdk.h b/src/sentry/native/native_sdk.h index 2afcd3ce..aa71bd67 100644 --- a/src/sentry/native/native_sdk.h +++ b/src/sentry/native/native_sdk.h @@ -25,6 +25,7 @@ class NativeSDK : public InternalSDK { virtual void add_breadcrumb(const String &p_message, const String &p_category, Level p_level, const String &p_type = "default", const Dictionary &p_data = Dictionary()) override; + virtual Ref create_breadcrumb() override; virtual String capture_message(const String &p_message, Level p_level = sentry::LEVEL_INFO, const String &p_logger = "") override; virtual String get_last_event_id() override; From 352230e3764b15845fadf0aca77c00c04dd7e712 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:29:57 +0100 Subject: [PATCH 06/28] Fix gdextension compilation --- src/sentry/disabled/disabled_breadcrumb.h | 3 +++ src/sentry/native/native_breadcrumb.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/sentry/disabled/disabled_breadcrumb.h b/src/sentry/disabled/disabled_breadcrumb.h index e482c37f..031c43a4 100644 --- a/src/sentry/disabled/disabled_breadcrumb.h +++ b/src/sentry/disabled/disabled_breadcrumb.h @@ -14,6 +14,9 @@ class DisabledBreadcrumb : public SentryBreadcrumb { String type; Dictionary data; +protected: + static void _bind_methods() {} + public: virtual void set_message(const String &p_message) override { message = p_message; } virtual String get_message() const override { return message; } diff --git a/src/sentry/native/native_breadcrumb.h b/src/sentry/native/native_breadcrumb.h index 2d7f1d9f..f1dcf23c 100644 --- a/src/sentry/native/native_breadcrumb.h +++ b/src/sentry/native/native_breadcrumb.h @@ -11,6 +11,9 @@ class NativeBreadcrumb : public SentryBreadcrumb { private: sentry_value_t native_crumb; +protected: + static void _bind_methods() {} + public: virtual void set_message(const String &p_message) override; virtual String get_message() const override; From 683a4030a15fa3b2c7c813cb10a0c89559d0dca7 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:32:20 +0100 Subject: [PATCH 07/28] New method SentrySDK.create_breadcrumb() --- src/sentry_sdk.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sentry_sdk.h b/src/sentry_sdk.h index 34845e9f..3302a607 100644 --- a/src/sentry_sdk.h +++ b/src/sentry_sdk.h @@ -4,6 +4,7 @@ #include "runtime_config.h" #include "sentry/internal_sdk.h" #include "sentry/level.h" +#include "sentry_breadcrumb.h" #include "sentry_event.h" #include "sentry_options.h" @@ -52,6 +53,8 @@ class SentrySDK : public Object { void add_breadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type = "default", const Dictionary &p_data = Dictionary()); + Ref create_breadcrumb() { return internal_sdk->create_breadcrumb(); } + void set_context(const String &p_key, const Dictionary &p_value); void set_tag(const String &p_key, const String &p_value); From 4c06dffa8d24d5044ce78088dc56084f75290fe3 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 18:35:01 +0100 Subject: [PATCH 08/28] Add `before_breadcrumb` option --- src/sentry/native/native_event.cpp | 1 - src/sentry_options.cpp | 1 + src/sentry_options.h | 4 ++++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sentry/native/native_event.cpp b/src/sentry/native/native_event.cpp index 66a3c68b..69c2ed68 100644 --- a/src/sentry/native/native_event.cpp +++ b/src/sentry/native/native_event.cpp @@ -1,6 +1,5 @@ #include "native_event.h" -#include "godot_cpp/core/error_macros.hpp" #include "sentry/level.h" #include "sentry/native/native_util.h" diff --git a/src/sentry_options.cpp b/src/sentry_options.cpp index 9f199839..3a7e17d8 100644 --- a/src/sentry_options.cpp +++ b/src/sentry_options.cpp @@ -156,6 +156,7 @@ void SentryOptions::_bind_methods() { BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::STRING, "before_send"), set_before_send, get_before_send); BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::STRING, "on_crash"), set_on_crash, get_on_crash); + BIND_PROPERTY(SentryOptions, PropertyInfo(Variant::STRING, "before_breadcrumb"), set_before_breadcrumb, get_before_breadcrumb); { using namespace sentry; diff --git a/src/sentry_options.h b/src/sentry_options.h index d93c2aef..4d6c173a 100644 --- a/src/sentry_options.h +++ b/src/sentry_options.h @@ -61,6 +61,7 @@ class SentryOptions : public RefCounted { String configuration_script; Callable before_send; Callable on_crash; + Callable before_breadcrumb; static void _define_project_settings(const Ref &p_options); static void _load_project_settings(const Ref &p_options); @@ -132,6 +133,9 @@ class SentryOptions : public RefCounted { _FORCE_INLINE_ Callable get_on_crash() const { return on_crash; } _FORCE_INLINE_ void set_on_crash(const Callable &p_on_crash) { on_crash = p_on_crash; } + _FORCE_INLINE_ Callable get_before_breadcrumb() const { return before_breadcrumb; } + _FORCE_INLINE_ void set_before_breadcrumb(const Callable &p_before_breadcrumb) { before_breadcrumb = p_before_breadcrumb; } + SentryOptions(); ~SentryOptions(); }; From ee4d23cd73106dc4075616da6cff519a9140ad2a Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 20:15:00 +0100 Subject: [PATCH 09/28] Process breadcrumbs in before_breadcrumb --- src/sentry/disabled/disabled_sdk.h | 5 +++-- src/sentry/internal_sdk.h | 5 +++-- src/sentry/native/native_breadcrumb.cpp | 27 +++++++++++++++++++++++++ src/sentry/native/native_breadcrumb.h | 1 + src/sentry/native/native_sdk.cpp | 14 +++++-------- src/sentry/native/native_sdk.h | 5 +++-- src/sentry_sdk.cpp | 19 +++++++++++++++-- 7 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/sentry/disabled/disabled_sdk.h b/src/sentry/disabled/disabled_sdk.h index 2b57c909..33cee1ef 100644 --- a/src/sentry/disabled/disabled_sdk.h +++ b/src/sentry/disabled/disabled_sdk.h @@ -18,9 +18,10 @@ class DisabledSDK : public InternalSDK { virtual void set_user(const Ref &p_user) override {} virtual void remove_user() override {} - virtual void add_breadcrumb(const String &p_message, const String &p_category, Level p_level, - const String &p_type = "default", const Dictionary &p_data = Dictionary()) override {} virtual Ref create_breadcrumb() override { return memnew(DisabledBreadcrumb); } + virtual Ref create_breadcrumb(const String &p_message, const String &p_category, Level p_level, + const String &p_type = "default", const Dictionary &p_data = Dictionary()) override { return memnew(DisabledBreadcrumb); } + virtual void capture_breadcrumb(const Ref &p_breadcrumb) override {} virtual String capture_message(const String &p_message, Level p_level = sentry::LEVEL_INFO, const String &p_logger = "") override { return ""; } virtual String get_last_event_id() override { return ""; } diff --git a/src/sentry/internal_sdk.h b/src/sentry/internal_sdk.h index 0c24440a..7cfdc4e6 100644 --- a/src/sentry/internal_sdk.h +++ b/src/sentry/internal_sdk.h @@ -36,9 +36,10 @@ class InternalSDK { virtual void set_user(const Ref &p_user) = 0; virtual void remove_user() = 0; - virtual void add_breadcrumb(const String &p_message, const String &p_category, Level p_level, - const String &p_type = "default", const Dictionary &p_data = Dictionary()) = 0; virtual Ref create_breadcrumb() = 0; + virtual Ref create_breadcrumb(const String &p_message, const String &p_category, Level p_level, + const String &p_type = "default", const Dictionary &p_data = Dictionary()) = 0; + virtual void capture_breadcrumb(const Ref &p_breadcrumb) = 0; // TODO: Consider adding the following function. // virtual void clear_breadcrumbs() = 0; diff --git a/src/sentry/native/native_breadcrumb.cpp b/src/sentry/native/native_breadcrumb.cpp index 597e50d6..5639769b 100644 --- a/src/sentry/native/native_breadcrumb.cpp +++ b/src/sentry/native/native_breadcrumb.cpp @@ -56,6 +56,33 @@ Dictionary NativeBreadcrumb::get_data() const { return Dictionary(); } +NativeBreadcrumb::NativeBreadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type, const Dictionary &p_data) { + native_crumb = sentry_value_new_object(); + + if (!p_message.is_empty()) { + sentry_value_set_by_key(native_crumb, "message", + sentry_value_new_string(p_message.utf8())); + } + + if (!p_category.is_empty()) { + sentry_value_set_by_key(native_crumb, "category", + sentry_value_new_string(p_category.utf8())); + } + + sentry_value_set_by_key(native_crumb, "level", + sentry_value_new_string(sentry::native::level_to_cstring(p_level))); + + if (!p_type.is_empty()) { + sentry_value_set_by_key(native_crumb, "type", + sentry_value_new_string(p_type.utf8())); + } + + if (!p_data.is_empty()) { + sentry_value_set_by_key(native_crumb, "data", + sentry::native::variant_to_sentry_value(p_data)); + } +} + NativeBreadcrumb::NativeBreadcrumb(sentry_value_t p_native_crumb) { if (sentry_value_refcount(p_native_crumb) > 0) { sentry_value_incref(p_native_crumb); // acquire ownership diff --git a/src/sentry/native/native_breadcrumb.h b/src/sentry/native/native_breadcrumb.h index f1dcf23c..4ed0fc8e 100644 --- a/src/sentry/native/native_breadcrumb.h +++ b/src/sentry/native/native_breadcrumb.h @@ -30,6 +30,7 @@ class NativeBreadcrumb : public SentryBreadcrumb { virtual void set_data(const Dictionary &p_data) override; virtual Dictionary get_data() const override; + NativeBreadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type, const Dictionary &p_data); NativeBreadcrumb(sentry_value_t p_native_crumb); NativeBreadcrumb(); virtual ~NativeBreadcrumb() override; diff --git a/src/sentry/native/native_sdk.cpp b/src/sentry/native/native_sdk.cpp index 82092d1d..a6c56ced 100644 --- a/src/sentry/native/native_sdk.cpp +++ b/src/sentry/native/native_sdk.cpp @@ -146,19 +146,15 @@ void NativeSDK::remove_user() { sentry_remove_user(); } -void NativeSDK::add_breadcrumb(const String &p_message, const String &p_category, Level p_level, - const String &p_type, const Dictionary &p_data) { - sentry_value_t crumb = sentry_value_new_breadcrumb(p_type.utf8().ptr(), p_message.utf8().ptr()); - sentry_value_set_by_key(crumb, "category", sentry_value_new_string(p_category.utf8().ptr())); - sentry_value_set_by_key(crumb, "level", sentry_value_new_string(sentry::level_as_cstring(p_level))); - sentry_value_set_by_key(crumb, "data", sentry::native::variant_to_sentry_value(p_data)); - sentry_add_breadcrumb(crumb); -} - Ref NativeSDK::create_breadcrumb() { return memnew(NativeBreadcrumb); } +Ref NativeSDK::create_breadcrumb(const String &p_message, const String &p_category, Level p_level, + const String &p_type, const Dictionary &p_data) { + return memnew(NativeBreadcrumb(p_message, p_category, p_level, p_type, p_data)); +} + String NativeSDK::capture_message(const String &p_message, Level p_level, const String &p_logger) { sentry_value_t event = sentry_value_new_message_event( native::level_to_native(p_level), diff --git a/src/sentry/native/native_sdk.h b/src/sentry/native/native_sdk.h index aa71bd67..4f711bce 100644 --- a/src/sentry/native/native_sdk.h +++ b/src/sentry/native/native_sdk.h @@ -23,9 +23,10 @@ class NativeSDK : public InternalSDK { virtual void set_user(const Ref &p_user) override; virtual void remove_user() override; - virtual void add_breadcrumb(const String &p_message, const String &p_category, Level p_level, - const String &p_type = "default", const Dictionary &p_data = Dictionary()) override; virtual Ref create_breadcrumb() override; + virtual Ref create_breadcrumb(const String &p_message, const String &p_category, Level p_level, + const String &p_type = "default", const Dictionary &p_data = Dictionary()) override; + virtual void capture_breadcrumb(const Ref &p_breadcrumb) override; virtual String capture_message(const String &p_message, Level p_level = sentry::LEVEL_INFO, const String &p_logger = "") override; virtual String get_last_event_id() override; diff --git a/src/sentry_sdk.cpp b/src/sentry_sdk.cpp index 25a3ae50..179f8ee6 100644 --- a/src/sentry_sdk.cpp +++ b/src/sentry_sdk.cpp @@ -2,9 +2,10 @@ #include "sdk_version.gen.h" #include "sentry/contexts.h" -#include "sentry/disabled_sdk.h" +#include "sentry/disabled/disabled_sdk.h" #include "sentry/util.h" #include "sentry/uuid.h" +#include "sentry_breadcrumb.h" #include "sentry_configuration.h" #include @@ -27,7 +28,21 @@ String SentrySDK::capture_message(const String &p_message, Level p_level, const void SentrySDK::add_breadcrumb(const String &p_message, const String &p_category, Level p_level, const String &p_type, const Dictionary &p_data) { - internal_sdk->add_breadcrumb(p_message, p_category, p_level, p_type, p_data); + Ref crumb = internal_sdk->create_breadcrumb(p_message, p_category, p_level, p_type, p_data); + + if (SentryOptions::get_singleton()->get_before_breadcrumb().is_valid()) { + Ref processed = SentryOptions::get_singleton()->get_before_breadcrumb().call(crumb); + ERR_FAIL_COND_MSG(processed.is_valid() && processed != crumb, "Sentry: before_breadcrumb callback must return the same breadcrumb object or null."); + if (processed.is_null()) { + // Discard breadcrumb. + sentry::util::print_debug("breadcrumb discarded by before_breadcrumb callback"); + return; + } + sentry::util::print_debug("breadcrumb processed by before_breadcrumb callback"); + crumb = processed; + } + + internal_sdk->capture_breadcrumb(crumb); } String SentrySDK::get_last_event_id() const { From 667bc0060ddb49128fea3f4405c3a988dec3e893 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 20:36:38 +0100 Subject: [PATCH 10/28] NativeSDK.capture_breadcrumb() implementation --- src/sentry/native/native_breadcrumb.h | 2 ++ src/sentry/native/native_sdk.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/sentry/native/native_breadcrumb.h b/src/sentry/native/native_breadcrumb.h index 4ed0fc8e..a1cc893c 100644 --- a/src/sentry/native/native_breadcrumb.h +++ b/src/sentry/native/native_breadcrumb.h @@ -15,6 +15,8 @@ class NativeBreadcrumb : public SentryBreadcrumb { static void _bind_methods() {} public: + _FORCE_INLINE_ sentry_value_t get_native_value() const { return native_crumb; } + virtual void set_message(const String &p_message) override; virtual String get_message() const override; diff --git a/src/sentry/native/native_sdk.cpp b/src/sentry/native/native_sdk.cpp index a6c56ced..b181763b 100644 --- a/src/sentry/native/native_sdk.cpp +++ b/src/sentry/native/native_sdk.cpp @@ -155,6 +155,14 @@ Ref NativeSDK::create_breadcrumb(const String &p_message, cons return memnew(NativeBreadcrumb(p_message, p_category, p_level, p_type, p_data)); } +void NativeSDK::capture_breadcrumb(const Ref &p_breadcrumb) { + ERR_FAIL_COND_MSG(p_breadcrumb.is_null(), "Sentry: Can't capture breadcrumb - breadcrumb object is null."); + NativeBreadcrumb *native_crumb = Object::cast_to(p_breadcrumb.ptr()); + ERR_FAIL_NULL(native_crumb); // shouldn't happen + sentry_value_incref(native_crumb->get_native_value()); // keep ownership + sentry_add_breadcrumb(native_crumb->get_native_value()); +} + String NativeSDK::capture_message(const String &p_message, Level p_level, const String &p_logger) { sentry_value_t event = sentry_value_new_message_event( native::level_to_native(p_level), From 6019de1db93ca739ec76b9611da8edd55a846a94 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 20:47:05 +0100 Subject: [PATCH 11/28] Add hidden set_before_breadcrumb methods --- src/sentry_sdk.cpp | 2 ++ src/sentry_sdk.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/sentry_sdk.cpp b/src/sentry_sdk.cpp index 179f8ee6..e5a1f89f 100644 --- a/src/sentry_sdk.cpp +++ b/src/sentry_sdk.cpp @@ -173,6 +173,8 @@ void SentrySDK::_bind_methods() { ClassDB::bind_method(D_METHOD("_unset_before_send"), &SentrySDK::unset_before_send); ClassDB::bind_method(D_METHOD("_set_on_crash", "callable"), &SentrySDK::set_on_crash); ClassDB::bind_method(D_METHOD("_unset_on_crash"), &SentrySDK::unset_on_crash); + ClassDB::bind_method(D_METHOD("_set_before_breadcrumb", "callable"), &SentrySDK::set_before_breadcrumb); + ClassDB::bind_method(D_METHOD("_unset_before_breadcrumb"), &SentrySDK::unset_before_breadcrumb); } SentrySDK::SentrySDK() { diff --git a/src/sentry_sdk.h b/src/sentry_sdk.h index 3302a607..dd8d7f99 100644 --- a/src/sentry_sdk.h +++ b/src/sentry_sdk.h @@ -78,6 +78,9 @@ class SentrySDK : public Object { void set_on_crash(const Callable &p_callable) { SentryOptions::get_singleton()->set_on_crash(p_callable); } void unset_on_crash() { SentryOptions::get_singleton()->set_on_crash(Callable()); } + void set_before_breadcrumb(const Callable &p_callable) { SentryOptions::get_singleton()->set_before_breadcrumb(p_callable); } + void unset_before_breadcrumb() { SentryOptions::get_singleton()->set_before_breadcrumb(Callable()); } + SentrySDK(); ~SentrySDK(); }; From a828d486f619b135004229b07d226bb0c75bd639 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 20:48:54 +0100 Subject: [PATCH 12/28] Fix native include not guarded --- src/register_types.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/register_types.cpp b/src/register_types.cpp index 2c5b28d6..8dd62f4b 100644 --- a/src/register_types.cpp +++ b/src/register_types.cpp @@ -1,7 +1,6 @@ #include "runtime_config.h" #include "sentry/disabled/disabled_breadcrumb.h" #include "sentry/disabled/disabled_event.h" -#include "sentry/native/native_breadcrumb.h" #include "sentry/util.h" #include "sentry_breadcrumb.h" #include "sentry_configuration.h" @@ -16,6 +15,7 @@ #include #ifdef NATIVE_SDK +#include "sentry/native/native_breadcrumb.h" #include "sentry/native/native_event.h" #endif // NATIVE_SDK From bfec7d5191aff148f58a3693973897b1c7c889f9 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 20:58:57 +0100 Subject: [PATCH 13/28] Public methods to create and capture breadcrumbs --- src/sentry_sdk.cpp | 7 +++++++ src/sentry_sdk.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/sentry_sdk.cpp b/src/sentry_sdk.cpp index e5a1f89f..c9f1920a 100644 --- a/src/sentry_sdk.cpp +++ b/src/sentry_sdk.cpp @@ -45,6 +45,11 @@ void SentrySDK::add_breadcrumb(const String &p_message, const String &p_category internal_sdk->capture_breadcrumb(crumb); } +void SentrySDK::capture_breadcrumb(const Ref &p_breadcrumb) { + ERR_FAIL_COND_MSG(p_breadcrumb.is_null(), "Sentry: Can't capture breadcrumb - breadcrumb object is null."); + internal_sdk->capture_breadcrumb(p_breadcrumb); +} + String SentrySDK::get_last_event_id() const { return internal_sdk->get_last_event_id(); } @@ -158,6 +163,8 @@ void SentrySDK::_bind_methods() { ClassDB::bind_method(D_METHOD("capture_message", "message", "level", "logger"), &SentrySDK::capture_message, DEFVAL(LEVEL_INFO), DEFVAL("")); ClassDB::bind_method(D_METHOD("add_breadcrumb", "message", "category", "level", "type", "data"), &SentrySDK::add_breadcrumb, DEFVAL(LEVEL_INFO), DEFVAL("default"), DEFVAL(Dictionary())); + ClassDB::bind_method(D_METHOD("create_breadcrumb"), &SentrySDK::create_breadcrumb); + ClassDB::bind_method(D_METHOD("capture_breadcrumb", "breadcrumb"), &SentrySDK::capture_breadcrumb); ClassDB::bind_method(D_METHOD("get_last_event_id"), &SentrySDK::get_last_event_id); ClassDB::bind_method(D_METHOD("set_context", "key", "value"), &SentrySDK::set_context); ClassDB::bind_method(D_METHOD("set_tag", "key", "value"), &SentrySDK::set_tag); diff --git a/src/sentry_sdk.h b/src/sentry_sdk.h index dd8d7f99..d3e6e737 100644 --- a/src/sentry_sdk.h +++ b/src/sentry_sdk.h @@ -54,6 +54,7 @@ class SentrySDK : public Object { void add_breadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type = "default", const Dictionary &p_data = Dictionary()); Ref create_breadcrumb() { return internal_sdk->create_breadcrumb(); } + void capture_breadcrumb(const Ref &p_breadcrumb); void set_context(const String &p_key, const Dictionary &p_value); From 95073a497bfce279f648f3a99154a8e9ee7dc512 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 21:09:32 +0100 Subject: [PATCH 14/28] Basic tests --- project/test/test_breadcrumb.gd | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 project/test/test_breadcrumb.gd diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd new file mode 100644 index 00000000..01f6511d --- /dev/null +++ b/project/test/test_breadcrumb.gd @@ -0,0 +1,41 @@ +extends GdUnitTestSuite +## Test SentryBreadcrumb class. + + +var crumb: SentryBreadcrumb + + +func before_test() -> void: + crumb = SentrySDK.create_breadcrumb() + + +func test_breadcrumb_message() -> void: + crumb.message = "test-message" + assert_str(crumb.message).is_equal("test-message") + + +func test_breadcrumb_category() -> void: + crumb.category = "test-category" + assert_str(crumb.category).is_equal("test-category") + + +func test_breadcrumb_level() -> void: + crumb.level = SentrySDK.LEVEL_DEBUG + assert_int(crumb.level).is_equal(SentrySDK.LEVEL_DEBUG) + + +func test_breadcrumb_type() -> void: + crumb.type = "test-type" + assert_str(crumb.type).is_equal("test-type") + + +# TODO: implement data! +# func test_breadcrumb_data() -> void: +# crumb.data = {"test": "data"} +# assert_dict(crumb.data).is_equal({"test": "data"}) + + +# TODO: implement timestamp! +# func test_breadcrumb_timestamp() -> void: +# crumb.timestamp = 123.456 +# assert_float(crumb.timestamp).is_equal(123.456) From 7b272fd26f388be60ca4175c1146a5557fff6318 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 21:17:45 +0100 Subject: [PATCH 15/28] Test before_breadcrumb callback --- project/test/test_breadcrumb.gd | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index 01f6511d..58b30fcb 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -2,6 +2,8 @@ extends GdUnitTestSuite ## Test SentryBreadcrumb class. +signal callback_processed + var crumb: SentryBreadcrumb @@ -29,6 +31,27 @@ func test_breadcrumb_type() -> void: assert_str(crumb.type).is_equal("test-type") +func test_breadcrumb_callback() -> void: + SentrySDK._set_before_breadcrumb( + func(b: SentryBreadcrumb): + assert_str(b.message).is_equal("test-message") + assert_str(b.category).is_equal("test-category") + assert_int(b.level).is_equal(SentrySDK.LEVEL_DEBUG) + assert_str(b.type).is_equal("test-type") + # assert_dict(b.data).is_equal({"test": "data"}) + callback_processed.emit() + return null) + + crumb.message = "test-message" + crumb.category = "test-category" + crumb.level = SentrySDK.LEVEL_DEBUG + crumb.type = "test-type" + # crumb.data = {"test": "data"} + SentrySDK.capture_breadcrumb(crumb) + + assert_signal(self).is_emitted("callback_processed") + + # TODO: implement data! # func test_breadcrumb_data() -> void: # crumb.data = {"test": "data"} From ee9d823f2d7e21e95cc7dc55e63aa1b307aecac5 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 21:46:55 +0100 Subject: [PATCH 16/28] spaces -> tabs --- project/test/test_breadcrumb.gd | 54 ++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index 58b30fcb..086baf84 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -8,48 +8,48 @@ var crumb: SentryBreadcrumb func before_test() -> void: - crumb = SentrySDK.create_breadcrumb() + crumb = SentrySDK.create_breadcrumb() func test_breadcrumb_message() -> void: - crumb.message = "test-message" - assert_str(crumb.message).is_equal("test-message") + crumb.message = "test-message" + assert_str(crumb.message).is_equal("test-message") func test_breadcrumb_category() -> void: - crumb.category = "test-category" - assert_str(crumb.category).is_equal("test-category") + crumb.category = "test-category" + assert_str(crumb.category).is_equal("test-category") func test_breadcrumb_level() -> void: - crumb.level = SentrySDK.LEVEL_DEBUG - assert_int(crumb.level).is_equal(SentrySDK.LEVEL_DEBUG) + crumb.level = SentrySDK.LEVEL_DEBUG + assert_int(crumb.level).is_equal(SentrySDK.LEVEL_DEBUG) func test_breadcrumb_type() -> void: - crumb.type = "test-type" - assert_str(crumb.type).is_equal("test-type") + crumb.type = "test-type" + assert_str(crumb.type).is_equal("test-type") func test_breadcrumb_callback() -> void: - SentrySDK._set_before_breadcrumb( - func(b: SentryBreadcrumb): - assert_str(b.message).is_equal("test-message") - assert_str(b.category).is_equal("test-category") - assert_int(b.level).is_equal(SentrySDK.LEVEL_DEBUG) - assert_str(b.type).is_equal("test-type") - # assert_dict(b.data).is_equal({"test": "data"}) - callback_processed.emit() - return null) - - crumb.message = "test-message" - crumb.category = "test-category" - crumb.level = SentrySDK.LEVEL_DEBUG - crumb.type = "test-type" - # crumb.data = {"test": "data"} - SentrySDK.capture_breadcrumb(crumb) - - assert_signal(self).is_emitted("callback_processed") + SentrySDK._set_before_breadcrumb( + func(b: SentryBreadcrumb): + assert_str(b.message).is_equal("test-message") + assert_str(b.category).is_equal("test-category") + assert_int(b.level).is_equal(SentrySDK.LEVEL_DEBUG) + assert_str(b.type).is_equal("test-type") + # assert_dict(b.data).is_equal({"test": "data"}) + callback_processed.emit() + return null) + + crumb.message = "test-message" + crumb.category = "test-category" + crumb.level = SentrySDK.LEVEL_DEBUG + crumb.type = "test-type" + # crumb.data = {"test": "data"} + SentrySDK.capture_breadcrumb(crumb) + + assert_signal(self).is_emitted("callback_processed") # TODO: implement data! From c98f138a24681dd846d78296029e09bc7a53e29a Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 22:28:53 +0100 Subject: [PATCH 17/28] Fix before_breadcrumb not called with capture_breadcrumb() --- src/sentry_sdk.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/sentry_sdk.cpp b/src/sentry_sdk.cpp index c9f1920a..0af712f9 100644 --- a/src/sentry_sdk.cpp +++ b/src/sentry_sdk.cpp @@ -29,7 +29,12 @@ String SentrySDK::capture_message(const String &p_message, Level p_level, const void SentrySDK::add_breadcrumb(const String &p_message, const String &p_category, Level p_level, const String &p_type, const Dictionary &p_data) { Ref crumb = internal_sdk->create_breadcrumb(p_message, p_category, p_level, p_type, p_data); + capture_breadcrumb(crumb); +} +void SentrySDK::capture_breadcrumb(const Ref &p_breadcrumb) { + ERR_FAIL_COND_MSG(p_breadcrumb.is_null(), "Sentry: Can't capture breadcrumb - breadcrumb object is null."); + Ref crumb = p_breadcrumb; if (SentryOptions::get_singleton()->get_before_breadcrumb().is_valid()) { Ref processed = SentryOptions::get_singleton()->get_before_breadcrumb().call(crumb); ERR_FAIL_COND_MSG(processed.is_valid() && processed != crumb, "Sentry: before_breadcrumb callback must return the same breadcrumb object or null."); @@ -41,15 +46,9 @@ void SentrySDK::add_breadcrumb(const String &p_message, const String &p_category sentry::util::print_debug("breadcrumb processed by before_breadcrumb callback"); crumb = processed; } - internal_sdk->capture_breadcrumb(crumb); } -void SentrySDK::capture_breadcrumb(const Ref &p_breadcrumb) { - ERR_FAIL_COND_MSG(p_breadcrumb.is_null(), "Sentry: Can't capture breadcrumb - breadcrumb object is null."); - internal_sdk->capture_breadcrumb(p_breadcrumb); -} - String SentrySDK::get_last_event_id() const { return internal_sdk->get_last_event_id(); } From 2dfbbf3103e6196a16ac0b1f31e918ee2e1c4f5c Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 31 Jan 2025 22:29:09 +0100 Subject: [PATCH 18/28] Fix test failing while monitoring signal --- project/test/test_breadcrumb.gd | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index 086baf84..5b42d532 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -31,7 +31,7 @@ func test_breadcrumb_type() -> void: assert_str(crumb.type).is_equal("test-type") -func test_breadcrumb_callback() -> void: +func test_with_before_breadcrumb() -> void: SentrySDK._set_before_breadcrumb( func(b: SentryBreadcrumb): assert_str(b.message).is_equal("test-message") @@ -40,7 +40,10 @@ func test_breadcrumb_callback() -> void: assert_str(b.type).is_equal("test-type") # assert_dict(b.data).is_equal({"test": "data"}) callback_processed.emit() - return null) + return null # discard breadcrumb + ) + + var monitor := monitor_signals(self, false) crumb.message = "test-message" crumb.category = "test-category" @@ -49,7 +52,9 @@ func test_breadcrumb_callback() -> void: # crumb.data = {"test": "data"} SentrySDK.capture_breadcrumb(crumb) - assert_signal(self).is_emitted("callback_processed") + await assert_signal(monitor).is_emitted("callback_processed") + + SentrySDK._unset_before_breadcrumb() # TODO: implement data! From 9f481d7632017bb8c506caa658d22065b38dfb26 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 18:58:03 +0100 Subject: [PATCH 19/28] Implement `SentryBreadcrumb.data` --- modules/sentry-native | 2 +- project/test/test_breadcrumb.gd | 15 +++++---- src/sentry/native/native_breadcrumb.cpp | 5 +-- src/sentry/native/native_util.cpp | 42 +++++++++++++++++++++++++ src/sentry/native/native_util.h | 3 ++ 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/modules/sentry-native b/modules/sentry-native index 62b966c4..9281ecf8 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit 62b966c487f08773dc23cfb17b991bdd3f170ae4 +Subproject commit 9281ecf862c8f2ba03b3a3d5c28b4c46763955d4 diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index 5b42d532..5566f52b 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -38,7 +38,7 @@ func test_with_before_breadcrumb() -> void: assert_str(b.category).is_equal("test-category") assert_int(b.level).is_equal(SentrySDK.LEVEL_DEBUG) assert_str(b.type).is_equal("test-type") - # assert_dict(b.data).is_equal({"test": "data"}) + assert_dict(b.data).is_equal({"test": "data"}) callback_processed.emit() return null # discard breadcrumb ) @@ -49,7 +49,7 @@ func test_with_before_breadcrumb() -> void: crumb.category = "test-category" crumb.level = SentrySDK.LEVEL_DEBUG crumb.type = "test-type" - # crumb.data = {"test": "data"} + crumb.data = {"test": "data"} SentrySDK.capture_breadcrumb(crumb) await assert_signal(monitor).is_emitted("callback_processed") @@ -57,13 +57,12 @@ func test_with_before_breadcrumb() -> void: SentrySDK._unset_before_breadcrumb() -# TODO: implement data! -# func test_breadcrumb_data() -> void: -# crumb.data = {"test": "data"} -# assert_dict(crumb.data).is_equal({"test": "data"}) +func test_breadcrumb_data() -> void: + crumb.data = {"str": "text", "int": 42 } + assert_dict(crumb.data).is_equal({"str": "text", "int": 42 }) # TODO: implement timestamp! # func test_breadcrumb_timestamp() -> void: -# crumb.timestamp = 123.456 -# assert_float(crumb.timestamp).is_equal(123.456) +# crumb.timestamp = 123.456 +# assert_float(crumb.timestamp).is_equal(123.456) diff --git a/src/sentry/native/native_breadcrumb.cpp b/src/sentry/native/native_breadcrumb.cpp index 5639769b..38d79a0d 100644 --- a/src/sentry/native/native_breadcrumb.cpp +++ b/src/sentry/native/native_breadcrumb.cpp @@ -50,10 +50,7 @@ void NativeBreadcrumb::set_data(const Dictionary &p_data) { } Dictionary NativeBreadcrumb::get_data() const { - // TODO: implement sentry_value_to_variant() - // return sentry::native::sentry_value_to_variant(sentry_value_get_by_key(native_crumb, "data")); - WARN_PRINT("Not implemented."); - return Dictionary(); + return sentry::native::sentry_value_to_variant(sentry_value_get_by_key(native_crumb, "data")); } NativeBreadcrumb::NativeBreadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type, const Dictionary &p_data) { diff --git a/src/sentry/native/native_util.cpp b/src/sentry/native/native_util.cpp index 481eb3ff..799bd197 100644 --- a/src/sentry/native/native_util.cpp +++ b/src/sentry/native/native_util.cpp @@ -1,4 +1,5 @@ #include "native_util.h" +#include "sentry.h" namespace sentry::native { @@ -58,6 +59,47 @@ sentry_value_t variant_to_sentry_value(const Variant &p_variant) { } } +Variant sentry_value_to_variant(sentry_value_t p_value) { + switch (sentry_value_get_type(p_value)) { + case SENTRY_VALUE_TYPE_BOOL: { + return bool(sentry_value_as_int32(p_value)); + } break; + case SENTRY_VALUE_TYPE_INT32: { + return sentry_value_as_int32(p_value); + } break; + case SENTRY_VALUE_TYPE_DOUBLE: { + return sentry_value_as_double(p_value); + } break; + case SENTRY_VALUE_TYPE_STRING: { + return sentry_value_as_string(p_value); + } break; + case SENTRY_VALUE_TYPE_LIST: { + Array array; + for (int i = 0; i < sentry_value_get_length(p_value); i++) { + array.append( + sentry_value_to_variant( + sentry_value_get_by_index(p_value, i))); + } + return array; + } break; + case SENTRY_VALUE_TYPE_OBJECT: { + Dictionary dictionary; + for (int i = 0; i < sentry_value_get_length(p_value); i++) { + const char *ckey = sentry_value_get_key(p_value, i); + const String key{ ckey }; + Variant value{ sentry_value_to_variant( + sentry_value_get_by_key(p_value, ckey)) }; + dictionary[key] = value; + } + return dictionary; + } break; + case SENTRY_VALUE_TYPE_NULL: + default: { + return Variant(); + } break; + } +} + sentry_value_t strings_to_sentry_list(const PackedStringArray &p_strings) { sentry_value_t sentry_list = sentry_value_new_list(); for (int i = 0; i < p_strings.size(); i++) { diff --git a/src/sentry/native/native_util.h b/src/sentry/native/native_util.h index f6bf7338..b1ca5119 100644 --- a/src/sentry/native/native_util.h +++ b/src/sentry/native/native_util.h @@ -16,6 +16,9 @@ namespace sentry::native { // Convert Godot Variant to sentry_value_t. sentry_value_t variant_to_sentry_value(const Variant &p_variant); +// Convert sentry_value_t to Godot Variant. +Variant sentry_value_to_variant(sentry_value_t p_value); + // Convert PackedStringArray to sentry_value_t (as a list). sentry_value_t strings_to_sentry_list(const PackedStringArray &p_strings); From 9e01f274cd6cbb850cc274a102ce1871fc8f2f83 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 19:42:02 +0100 Subject: [PATCH 20/28] Expose data as methods instead of a property --- modules/sentry-native | 2 +- project/test/test_breadcrumb.gd | 8 ++++---- src/sentry_breadcrumb.cpp | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/sentry-native b/modules/sentry-native index 9281ecf8..8783211f 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit 9281ecf862c8f2ba03b3a3d5c28b4c46763955d4 +Subproject commit 8783211f991410f49df0deed1132ae6cc7b481a6 diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index 5566f52b..9af30280 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -38,7 +38,7 @@ func test_with_before_breadcrumb() -> void: assert_str(b.category).is_equal("test-category") assert_int(b.level).is_equal(SentrySDK.LEVEL_DEBUG) assert_str(b.type).is_equal("test-type") - assert_dict(b.data).is_equal({"test": "data"}) + assert_dict(b.get_data()).is_equal({"test": "data"}) callback_processed.emit() return null # discard breadcrumb ) @@ -49,7 +49,7 @@ func test_with_before_breadcrumb() -> void: crumb.category = "test-category" crumb.level = SentrySDK.LEVEL_DEBUG crumb.type = "test-type" - crumb.data = {"test": "data"} + crumb.set_data({"test": "data"}) SentrySDK.capture_breadcrumb(crumb) await assert_signal(monitor).is_emitted("callback_processed") @@ -58,8 +58,8 @@ func test_with_before_breadcrumb() -> void: func test_breadcrumb_data() -> void: - crumb.data = {"str": "text", "int": 42 } - assert_dict(crumb.data).is_equal({"str": "text", "int": 42 }) + crumb.set_data({"str": "text", "int": 42}) + assert_dict(crumb.get_data()).is_equal({"str": "text", "int": 42}) # TODO: implement timestamp! diff --git a/src/sentry_breadcrumb.cpp b/src/sentry_breadcrumb.cpp index ae568085..89d91b9f 100644 --- a/src/sentry_breadcrumb.cpp +++ b/src/sentry_breadcrumb.cpp @@ -8,5 +8,7 @@ void SentryBreadcrumb::_bind_methods() { BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, category); BIND_PROPERTY(SentryBreadcrumb, sentry::make_level_enum_property("level"), set_level, get_level); BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, type); - BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::DICTIONARY, data); + + ClassDB::bind_method(D_METHOD("get_data"), &SentryBreadcrumb::get_data); + ClassDB::bind_method(D_METHOD("set_data", "data"), &SentryBreadcrumb::set_data); } From 46c923c40184232d57d7ed42ce6c28b562dcba02 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 19:57:54 +0100 Subject: [PATCH 21/28] Bump `sentry-native` branch --- modules/sentry-native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sentry-native b/modules/sentry-native index 8783211f..759af337 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit 8783211f991410f49df0deed1132ae6cc7b481a6 +Subproject commit 759af3373d7825ce317903ddf5fef950fc041673 From 97ccead1ca07bab6f4bc4041c885c3bda25374c8 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 21:19:55 +0100 Subject: [PATCH 22/28] Bump `sentry-native` branch --- modules/sentry-native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sentry-native b/modules/sentry-native index 759af337..d105f15d 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit 759af3373d7825ce317903ddf5fef950fc041673 +Subproject commit d105f15d47538b2f02be2b6d0f2ea1172a0bf1bd From 3afc98e662b699bf64b432e366fb1cbc64768109 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 21:38:21 +0100 Subject: [PATCH 23/28] Remove unnecessary include --- src/sentry/native/native_util.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sentry/native/native_util.h b/src/sentry/native/native_util.h index b1ca5119..21a2db04 100644 --- a/src/sentry/native/native_util.h +++ b/src/sentry/native/native_util.h @@ -1,7 +1,6 @@ #ifndef NATIVE_UTIL_H #define NATIVE_UTIL_H -#include "godot_cpp/core/defs.hpp" #include "sentry/level.h" #include From d2d2931bb01796d9ad1a46e133e22d9d56b7efcf Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 22:20:13 +0100 Subject: [PATCH 24/28] Add `timestamp` property --- project/test/test_breadcrumb.gd | 9 +++++---- src/sentry/disabled/disabled_breadcrumb.h | 4 ++++ src/sentry/native/native_breadcrumb.cpp | 12 +++++++++++- src/sentry/native/native_breadcrumb.h | 3 +++ src/sentry_breadcrumb.cpp | 1 + src/sentry_breadcrumb.h | 3 +++ 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index 9af30280..ebc11bd4 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -39,6 +39,7 @@ func test_with_before_breadcrumb() -> void: assert_int(b.level).is_equal(SentrySDK.LEVEL_DEBUG) assert_str(b.type).is_equal("test-type") assert_dict(b.get_data()).is_equal({"test": "data"}) + assert_str(b.timestamp).is_equal("2025-01-01T20:00:00+00:00") callback_processed.emit() return null # discard breadcrumb ) @@ -50,6 +51,7 @@ func test_with_before_breadcrumb() -> void: crumb.level = SentrySDK.LEVEL_DEBUG crumb.type = "test-type" crumb.set_data({"test": "data"}) + crumb.timestamp = "2025-01-01T20:00:00+00:00" SentrySDK.capture_breadcrumb(crumb) await assert_signal(monitor).is_emitted("callback_processed") @@ -62,7 +64,6 @@ func test_breadcrumb_data() -> void: assert_dict(crumb.get_data()).is_equal({"str": "text", "int": 42}) -# TODO: implement timestamp! -# func test_breadcrumb_timestamp() -> void: -# crumb.timestamp = 123.456 -# assert_float(crumb.timestamp).is_equal(123.456) +func test_breadcrumb_timestamp() -> void: + crumb.timestamp = "2025-01-01T20:00:00+00:00" + assert_str(crumb.timestamp).is_equal("2025-01-01T20:00:00+00:00") diff --git a/src/sentry/disabled/disabled_breadcrumb.h b/src/sentry/disabled/disabled_breadcrumb.h index 031c43a4..e9e04a9a 100644 --- a/src/sentry/disabled/disabled_breadcrumb.h +++ b/src/sentry/disabled/disabled_breadcrumb.h @@ -13,6 +13,7 @@ class DisabledBreadcrumb : public SentryBreadcrumb { sentry::Level level = sentry::Level::LEVEL_INFO; String type; Dictionary data; + String timestamp; protected: static void _bind_methods() {} @@ -32,6 +33,9 @@ class DisabledBreadcrumb : public SentryBreadcrumb { virtual void set_data(const Dictionary &p_data) override { data = p_data; } virtual Dictionary get_data() const override { return data; } + + virtual void set_timestamp(const String &p_timestamp) override { timestamp = p_timestamp; } + virtual String get_timestamp() const override { return timestamp; } }; #endif // DISABLED_BREADCRUMB_H diff --git a/src/sentry/native/native_breadcrumb.cpp b/src/sentry/native/native_breadcrumb.cpp index 38d79a0d..1a32a88f 100644 --- a/src/sentry/native/native_breadcrumb.cpp +++ b/src/sentry/native/native_breadcrumb.cpp @@ -50,7 +50,17 @@ void NativeBreadcrumb::set_data(const Dictionary &p_data) { } Dictionary NativeBreadcrumb::get_data() const { - return sentry::native::sentry_value_to_variant(sentry_value_get_by_key(native_crumb, "data")); + sentry_value_t data = sentry_value_get_by_key(native_crumb, "data"); + return sentry::native::sentry_value_to_variant(data); +} + +void NativeBreadcrumb::set_timestamp(const String &p_timestamp) { + sentry::native::sentry_value_set_or_remove_string_by_key(native_crumb, "timestamp", p_timestamp); +} + +String NativeBreadcrumb::get_timestamp() const { + sentry_value_t timestamp = sentry_value_get_by_key(native_crumb, "timestamp"); + return sentry_value_as_string(timestamp); } NativeBreadcrumb::NativeBreadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type, const Dictionary &p_data) { diff --git a/src/sentry/native/native_breadcrumb.h b/src/sentry/native/native_breadcrumb.h index a1cc893c..8a91c29b 100644 --- a/src/sentry/native/native_breadcrumb.h +++ b/src/sentry/native/native_breadcrumb.h @@ -32,6 +32,9 @@ class NativeBreadcrumb : public SentryBreadcrumb { virtual void set_data(const Dictionary &p_data) override; virtual Dictionary get_data() const override; + virtual void set_timestamp(const String &p_timestamp) override; + virtual String get_timestamp() const override; + NativeBreadcrumb(const String &p_message, const String &p_category, sentry::Level p_level, const String &p_type, const Dictionary &p_data); NativeBreadcrumb(sentry_value_t p_native_crumb); NativeBreadcrumb(); diff --git a/src/sentry_breadcrumb.cpp b/src/sentry_breadcrumb.cpp index 89d91b9f..9c4801bc 100644 --- a/src/sentry_breadcrumb.cpp +++ b/src/sentry_breadcrumb.cpp @@ -8,6 +8,7 @@ void SentryBreadcrumb::_bind_methods() { BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, category); BIND_PROPERTY(SentryBreadcrumb, sentry::make_level_enum_property("level"), set_level, get_level); BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, type); + BIND_PROPERTY_SIMPLE(SentryBreadcrumb, Variant::STRING, timestamp); ClassDB::bind_method(D_METHOD("get_data"), &SentryBreadcrumb::get_data); ClassDB::bind_method(D_METHOD("set_data", "data"), &SentryBreadcrumb::set_data); diff --git a/src/sentry_breadcrumb.h b/src/sentry_breadcrumb.h index f420aaff..861bdd4e 100644 --- a/src/sentry_breadcrumb.h +++ b/src/sentry_breadcrumb.h @@ -30,6 +30,9 @@ class SentryBreadcrumb : public RefCounted { virtual void set_data(const Dictionary &p_data) = 0; virtual Dictionary get_data() const = 0; + virtual void set_timestamp(const String &p_timestamp) = 0; + virtual String get_timestamp() const = 0; + virtual ~SentryBreadcrumb() = default; }; From 383ad8ff43d516fa6b9567798ebaea773cdeb780 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 22:23:27 +0100 Subject: [PATCH 25/28] Adjust test --- project/test/test_breadcrumb.gd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project/test/test_breadcrumb.gd b/project/test/test_breadcrumb.gd index ebc11bd4..36097181 100644 --- a/project/test/test_breadcrumb.gd +++ b/project/test/test_breadcrumb.gd @@ -65,5 +65,6 @@ func test_breadcrumb_data() -> void: func test_breadcrumb_timestamp() -> void: - crumb.timestamp = "2025-01-01T20:00:00+00:00" - assert_str(crumb.timestamp).is_equal("2025-01-01T20:00:00+00:00") + var ts = Time.get_datetime_string_from_system() + crumb.timestamp = ts + assert_str(crumb.timestamp).is_equal(ts) From 89a73dd362816ced50d00b6d54396fbad8d2ee01 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 22:51:40 +0100 Subject: [PATCH 26/28] Refactor NativeEvent to use new common function --- src/sentry/native/native_event.cpp | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/sentry/native/native_event.cpp b/src/sentry/native/native_event.cpp index 69c2ed68..2a73f848 100644 --- a/src/sentry/native/native_event.cpp +++ b/src/sentry/native/native_event.cpp @@ -5,18 +5,6 @@ #include -namespace { - -inline void _sentry_value_set_or_remove_string_by_key(sentry_value_t value, const char *k, const String &v) { - if (v.is_empty()) { - sentry_value_remove_by_key(value, k); - } else { - sentry_value_set_by_key(value, k, sentry_value_new_string(v.utf8())); - } -} - -} // unnamed namespace - String NativeEvent::get_id() const { sentry_value_t id = sentry_value_get_by_key(native_event, "event_id"); return sentry_value_as_string(id); @@ -45,7 +33,8 @@ String NativeEvent::get_message() const { } void NativeEvent::set_timestamp(const String &p_timestamp) { - _sentry_value_set_or_remove_string_by_key(native_event, "timestamp", p_timestamp); + sentry::native::sentry_value_set_or_remove_string_by_key( + native_event, "timestamp", p_timestamp); } String NativeEvent::get_timestamp() const { @@ -75,7 +64,8 @@ sentry::Level NativeEvent::get_level() const { } void NativeEvent::set_logger(const String &p_logger) { - _sentry_value_set_or_remove_string_by_key(native_event, "logger", p_logger); + sentry::native::sentry_value_set_or_remove_string_by_key( + native_event, "logger", p_logger); } String NativeEvent::get_logger() const { @@ -84,7 +74,8 @@ String NativeEvent::get_logger() const { } void NativeEvent::set_release(const String &p_release) { - _sentry_value_set_or_remove_string_by_key(native_event, "release", p_release); + sentry::native::sentry_value_set_or_remove_string_by_key( + native_event, "release", p_release); } String NativeEvent::get_release() const { @@ -93,7 +84,8 @@ String NativeEvent::get_release() const { } void NativeEvent::set_dist(const String &p_dist) { - _sentry_value_set_or_remove_string_by_key(native_event, "dist", p_dist); + sentry::native::sentry_value_set_or_remove_string_by_key( + native_event, "dist", p_dist); } String NativeEvent::get_dist() const { @@ -102,7 +94,8 @@ String NativeEvent::get_dist() const { } void NativeEvent::set_environment(const String &p_environment) { - _sentry_value_set_or_remove_string_by_key(native_event, "environment", p_environment); + sentry::native::sentry_value_set_or_remove_string_by_key( + native_event, "environment", p_environment); } String NativeEvent::get_environment() const { From b55d8bcc2320115b16b7114362282108b219452c Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Thu, 6 Feb 2025 14:28:00 +0100 Subject: [PATCH 27/28] Use sentry value iterators --- modules/sentry-native | 2 +- src/sentry/native/native_sdk.cpp | 14 ++++++++++++++ src/sentry/native/native_util.cpp | 13 +++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/modules/sentry-native b/modules/sentry-native index d105f15d..bf04599e 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit d105f15d47538b2f02be2b6d0f2ea1172a0bf1bd +Subproject commit bf04599ef56864cf2743083fb435a5070c05af31 diff --git a/src/sentry/native/native_sdk.cpp b/src/sentry/native/native_sdk.cpp index b181763b..049bd3b0 100644 --- a/src/sentry/native/native_sdk.cpp +++ b/src/sentry/native/native_sdk.cpp @@ -9,6 +9,7 @@ #include "sentry/util.h" #include "sentry_options.h" +#include #include #include #include @@ -53,9 +54,22 @@ inline void inject_contexts(sentry_value_t p_event) { } } +void test_performance(sentry_value_t ev) { + sentry_value_t contexts = sentry_value_get_by_key(ev, "contexts"); + auto start = std::chrono::high_resolution_clock::now(); + const Dictionary context_dic = sentry::native::sentry_value_to_variant(contexts); + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration duration = end - start; + std::cout << "!!!!!!!!!!!!!!!!!!!!! [MEASUREMENTS] Time took: " + << std::chrono::duration_cast(end - start).count() + << " ns" << std::endl; + sentry::util::print_debug(context_dic); +} + sentry_value_t handle_before_send(sentry_value_t event, void *hint, void *closure) { sentry::util::print_debug("handling before_send"); inject_contexts(event); + test_performance(event); if (const Callable &before_send = SentryOptions::get_singleton()->get_before_send(); before_send.is_valid()) { Ref event_obj = memnew(NativeEvent(event)); Ref processed = before_send.call(event_obj); diff --git a/src/sentry/native/native_util.cpp b/src/sentry/native/native_util.cpp index 799bd197..0180c9ec 100644 --- a/src/sentry/native/native_util.cpp +++ b/src/sentry/native/native_util.cpp @@ -84,13 +84,14 @@ Variant sentry_value_to_variant(sentry_value_t p_value) { } break; case SENTRY_VALUE_TYPE_OBJECT: { Dictionary dictionary; - for (int i = 0; i < sentry_value_get_length(p_value); i++) { - const char *ckey = sentry_value_get_key(p_value, i); - const String key{ ckey }; - Variant value{ sentry_value_to_variant( - sentry_value_get_by_key(p_value, ckey)) }; - dictionary[key] = value; + sentry_item_iter_t *it = sentry_value_new_item_iter(p_value); + while (sentry_value_item_iter_valid(it)) { + const char *key = sentry_value_item_iter_get_key(it); + sentry_value_t item_value = sentry_value_item_iter_get_value(it); + dictionary[String{ key }] = sentry_value_to_variant(item_value); + sentry_value_item_iter_next(it); } + sentry_free(it); return dictionary; } break; case SENTRY_VALUE_TYPE_NULL: From ba3ca57273ff52b6b80de3461dd3976bc0191609 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 15:44:28 +0100 Subject: [PATCH 28/28] Bump sentry-native branch --- modules/sentry-native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sentry-native b/modules/sentry-native index bf04599e..dcc5f208 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit bf04599ef56864cf2743083fb435a5070c05af31 +Subproject commit dcc5f2089896cffcf9a65ba3cfcf72a856165080