From 2f9f62ce68a00bff1aebfb87de7ef68141ce963d Mon Sep 17 00:00:00 2001 From: Betty Da Date: Wed, 15 Dec 2021 20:41:47 -0500 Subject: [PATCH 1/4] feat(tracing): Introduce a helper that identifies events that are transactions --- src/sentry_core.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/sentry_core.c b/src/sentry_core.c index e242b2b930..11226a96b1 100644 --- a/src/sentry_core.c +++ b/src/sentry_core.c @@ -353,6 +353,16 @@ event_is_considered_error(sentry_value_t event) return false; } +bool +sentry__event_is_transaction(sentry_value_t event) +{ + sentry_value_t event_type = sentry_value_get_by_key(event, "type"); + if (sentry__string_eq("transaction", sentry_value_as_string(event_type))) { + return true; + } + return false; +} + sentry_uuid_t sentry_capture_event(sentry_value_t event) { @@ -414,13 +424,13 @@ sentry__should_skip_event(const sentry_options_t *options, sentry_value_t event) { sentry_value_t event_type = sentry_value_get_by_key(event, "type"); // Not a transaction - if (sentry_value_is_null(event_type)) { - return !sentry__roll_dice(options->sample_rate); - } else { + if (sentry__event_is_transaction(event)) { // The sampling decision should already be made for transactions // during their construction. No need to recalculate here. // See `sentry__should_skip_transaction`. return !sentry_value_is_true(sentry_value_get_by_key(event, "sampled")); + } else { + return !sentry__roll_dice(options->sample_rate); } } From 1bb238d7b6b1aaf4cc7d6041585f240ffa07817e Mon Sep 17 00:00:00 2001 From: Betty Da Date: Thu, 16 Dec 2021 01:28:43 -0500 Subject: [PATCH 2/4] forgot header --- src/sentry_core.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sentry_core.h b/src/sentry_core.h index 7aa5bec0d2..0bcaff858e 100644 --- a/src/sentry_core.h +++ b/src/sentry_core.h @@ -28,6 +28,12 @@ */ bool sentry__should_skip_upload(void); +/** + * Given a well-formed event, returns whether an event is a transaction or not. + * Defaults to false, which will also be returned if the event is malformed. + */ +bool sentry__event_is_transaction(sentry_value_t event); + /** * Convert the given event into an envelope. * From 662159c80b0ee75253658ffbb744e670f708b273 Mon Sep 17 00:00:00 2001 From: Betty Da Date: Thu, 16 Dec 2021 01:59:16 -0500 Subject: [PATCH 3/4] missed a spot --- src/sentry_core.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sentry_core.c b/src/sentry_core.c index 11226a96b1..e3b0cc6c9a 100644 --- a/src/sentry_core.c +++ b/src/sentry_core.c @@ -422,8 +422,6 @@ sentry__should_skip_transaction(sentry_value_t tx_cxt) bool sentry__should_skip_event(const sentry_options_t *options, sentry_value_t event) { - sentry_value_t event_type = sentry_value_get_by_key(event, "type"); - // Not a transaction if (sentry__event_is_transaction(event)) { // The sampling decision should already be made for transactions // during their construction. No need to recalculate here. From 0d90d9577e060bd5ea0c1d7972ba2b974d435c5a Mon Sep 17 00:00:00 2001 From: Betty Da Date: Thu, 16 Dec 2021 01:43:50 -0500 Subject: [PATCH 4/4] feat(tracing): Restrict `sentry_capture_event` so it only sends non-transaction events --- include/sentry.h | 3 ++- src/sentry_core.c | 16 +++++++++++++++- src/sentry_core.h | 5 +++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/sentry.h b/include/sentry.h index 274169a4fb..ee50032ed2 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -1103,7 +1103,8 @@ SENTRY_API void sentry_user_consent_reset(void); SENTRY_API sentry_user_consent_t sentry_user_consent_get(void); /** - * Sends a sentry event. + * Sends a sentry event. Returns a nil UUID if the event being passed in is a + * transaction; `sentry_transaction_finish` should be used to send transactions. */ SENTRY_API sentry_uuid_t sentry_capture_event(sentry_value_t event); diff --git a/src/sentry_core.c b/src/sentry_core.c index e3b0cc6c9a..65260c4a22 100644 --- a/src/sentry_core.c +++ b/src/sentry_core.c @@ -365,6 +365,16 @@ sentry__event_is_transaction(sentry_value_t event) sentry_uuid_t sentry_capture_event(sentry_value_t event) +{ + if (sentry__event_is_transaction(event)) { + return sentry_uuid_nil(); + } else { + return sentry__capture_event(event); + } +} + +sentry_uuid_t +sentry__capture_event(sentry_value_t event) { sentry_uuid_t event_id; sentry_envelope_t *envelope = NULL; @@ -372,7 +382,11 @@ sentry_capture_event(sentry_value_t event) bool was_captured = false; SENTRY_WITH_OPTIONS (options) { was_captured = true; - envelope = sentry__prepare_event(options, event, &event_id); + if (sentry__event_is_transaction(event)) { + return sentry_uuid_nil(); + } else { + envelope = sentry__prepare_event(options, event, &event_id); + } if (envelope) { if (options->session) { SENTRY_WITH_OPTIONS_MUT (mut_options) { diff --git a/src/sentry_core.h b/src/sentry_core.h index 0bcaff858e..bec05ef5a0 100644 --- a/src/sentry_core.h +++ b/src/sentry_core.h @@ -51,6 +51,11 @@ bool sentry__event_is_transaction(sentry_value_t event); sentry_envelope_t *sentry__prepare_event(const sentry_options_t *options, sentry_value_t event, sentry_uuid_t *event_id); +/** + * Sends a sentry event, regardless of its type. + */ +sentry_uuid_t sentry__capture_event(sentry_value_t event); + /** * This function will submit the `envelope` to the given `transport`, first * checking for consent.