From f679440ecd6fb64e38a7244630fd430db4caeae8 Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki <44422760+DominikB2014@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:03:19 -0400 Subject: [PATCH] feat(spans): extract user.geo.geoscheme metrics (#3914) Work towards https://github.com/getsentry/sentry/issues/75230 This tags appropriate metrics with subregion as defined by the UN m49 standard. (There are many sources for this, for example see the tree under https://localizely.com/un-m49-list/). This allows us to filter down data by region within insight modules so that we can understand performance by region. Originally we were hoping to use country codes, but due to cardinality concerns, we opted for larger regions. There are a total of 22 geographical subregions vs 200+ countries. Note: I'm going to go through and double check all the mapping, but any early reviews of the implementation would be greatly appreciated. --------- Co-authored-by: David Herberth --- CHANGELOG.md | 1 + relay-dynamic-config/src/defaults.rs | 23 ++ .../src/normalize/span/country_subregion.rs | 287 ++++++++++++++++++ .../src/normalize/span/mod.rs | 1 + .../src/normalize/span/tag_extraction.rs | 8 + relay-server/src/metrics_extraction/event.rs | 2 +- ...nt__tests__both_feature_flags_enabled.snap | 28 ++ ...extraction__event__tests__only_common.snap | 28 ++ .../metrics_extraction/transactions/mod.rs | 22 +- .../metrics_extraction/transactions/types.rs | 2 + 10 files changed, 400 insertions(+), 2 deletions(-) create mode 100644 relay-event-normalization/src/normalize/span/country_subregion.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index b0292d3c5b..6a5d2c0693 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Extract `user.geo.country_code` into span indexed. ([#3911](https://github.com/getsentry/relay/pull/3911)) - Add `span.system` tag to span metrics ([#3913](https://github.com/getsentry/relay/pull/3913)) - Extract client sdk from transaction into profiles. ([#3915](https://github.com/getsentry/relay/pull/3915)) +- Extract `user.geo.subregion` into span metrics/indexed. ([#3914](https://github.com/getsentry/relay/pull/3914)) ## 24.7.1 diff --git a/relay-dynamic-config/src/defaults.rs b/relay-dynamic-config/src/defaults.rs index 3567c6bad2..43e7d0ad31 100644 --- a/relay-dynamic-config/src/defaults.rs +++ b/relay-dynamic-config/src/defaults.rs @@ -185,6 +185,8 @@ pub fn hardcoded_span_metrics() -> Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec Vec<(GroupKey, Vec, Vec. +#[allow(missing_docs)] // We don't need to document each variant, as it can all be explained by the description +pub enum Subregion { + NorthernAmerica = 21, + CentralAmerica = 13, + Caribbean = 29, + SouthAmerica = 5, + NorthernEurope = 154, + WesternEurope = 155, + SouthernEurope = 39, + EasternEurope = 151, + EasternAsia = 30, + SouthernAsia = 34, + SouthEasternAsia = 35, + WesternAsia = 145, + CentralAsia = 143, + NorthernAfrica = 15, + WesternAfrica = 11, + MiddleAfrica = 17, + EasternAfrica = 14, + SouthernAfrica = 18, + Melanesia = 54, + Micronesia = 57, + Polynesia = 61, + AustraliaAndNewZealand = 53, +} + +impl Subregion { + /// Maps 2 ISO letter country codes to geoscheme regions based on the UN M.49 standard. + pub fn from_iso2(iso2_letter: &str) -> Option { + Some(match iso2_letter { + "AF" => Subregion::SouthernAsia, + "AL" => Subregion::SouthernEurope, + "DZ" => Subregion::NorthernAfrica, + "AS" => Subregion::Polynesia, + "AD" => Subregion::SouthernEurope, + "AO" => Subregion::MiddleAfrica, + "AI" => Subregion::Caribbean, + // "AQ" => Subregion::Antarctica, + "AG" => Subregion::Caribbean, + "AR" => Subregion::SouthAmerica, + "AM" => Subregion::WesternAsia, + "AW" => Subregion::Caribbean, + "AU" => Subregion::AustraliaAndNewZealand, + "AT" => Subregion::WesternEurope, + "AZ" => Subregion::WesternAsia, + "BS" => Subregion::Caribbean, + "BH" => Subregion::WesternAsia, + "BD" => Subregion::SouthernAsia, + "BB" => Subregion::Caribbean, + "BY" => Subregion::EasternEurope, + "BE" => Subregion::WesternEurope, + "BZ" => Subregion::CentralAmerica, + "BJ" => Subregion::WesternAfrica, + "BM" => Subregion::NorthernAmerica, + "BT" => Subregion::SouthernAsia, + "BO" => Subregion::SouthAmerica, + "BA" => Subregion::SouthernEurope, + "BW" => Subregion::SouthernAfrica, + // "BV" => Subregion::Antarctica, + "BR" => Subregion::SouthAmerica, + "IO" => Subregion::EasternAfrica, + "BN" => Subregion::SouthEasternAsia, + "BG" => Subregion::EasternEurope, + "BF" => Subregion::WesternAfrica, + "BI" => Subregion::EasternAfrica, + "CV" => Subregion::WesternAfrica, + "KH" => Subregion::SouthEasternAsia, + "CM" => Subregion::MiddleAfrica, + "CA" => Subregion::NorthernAmerica, + "KY" => Subregion::Caribbean, + "CF" => Subregion::MiddleAfrica, + "TD" => Subregion::MiddleAfrica, + "CL" => Subregion::SouthAmerica, + "CN" => Subregion::EasternAsia, + "CX" => Subregion::AustraliaAndNewZealand, + "CC" => Subregion::AustraliaAndNewZealand, + "CO" => Subregion::SouthAmerica, + "KM" => Subregion::EasternAfrica, + "CG" => Subregion::MiddleAfrica, + "CD" => Subregion::MiddleAfrica, + "CK" => Subregion::Polynesia, + "CR" => Subregion::CentralAmerica, + "CI" => Subregion::WesternAfrica, + "HR" => Subregion::SouthernEurope, + "CU" => Subregion::Caribbean, + "CY" => Subregion::WesternAsia, + "CZ" => Subregion::EasternEurope, + "DK" => Subregion::NorthernEurope, + "DJ" => Subregion::EasternAfrica, + "DM" => Subregion::Caribbean, + "DO" => Subregion::Caribbean, + "EC" => Subregion::SouthAmerica, + "EG" => Subregion::NorthernAfrica, + "SV" => Subregion::CentralAmerica, + "GQ" => Subregion::MiddleAfrica, + "ER" => Subregion::EasternAfrica, + "EE" => Subregion::NorthernEurope, + "SZ" => Subregion::SouthernAfrica, + "ET" => Subregion::EasternAfrica, + "FK" => Subregion::SouthAmerica, + "FO" => Subregion::NorthernEurope, + "FJ" => Subregion::Melanesia, + "FI" => Subregion::NorthernEurope, + "FR" => Subregion::WesternEurope, + "GF" => Subregion::SouthAmerica, + "PF" => Subregion::Polynesia, + // "TF" => Subregion::Antarctica, + "GA" => Subregion::MiddleAfrica, + "GM" => Subregion::WesternAfrica, + "GE" => Subregion::WesternAsia, + "DE" => Subregion::WesternEurope, + "GH" => Subregion::WesternAfrica, + "GI" => Subregion::SouthernEurope, + "GR" => Subregion::SouthernEurope, + "GL" => Subregion::NorthernAmerica, + "GD" => Subregion::Caribbean, + "GP" => Subregion::Caribbean, + "GU" => Subregion::Micronesia, + "GT" => Subregion::CentralAmerica, + "GG" => Subregion::NorthernEurope, + "GN" => Subregion::WesternAfrica, + "GW" => Subregion::WesternAfrica, + "GY" => Subregion::SouthAmerica, + "HT" => Subregion::Caribbean, + // "HM" => Subregion::Antarctica, + "VA" => Subregion::SouthernEurope, + "HN" => Subregion::CentralAmerica, + "HK" => Subregion::EasternAsia, + "HU" => Subregion::EasternEurope, + "IS" => Subregion::NorthernEurope, + "IN" => Subregion::SouthernAsia, + "ID" => Subregion::SouthEasternAsia, + "IR" => Subregion::SouthernAsia, + "IQ" => Subregion::WesternAsia, + "IE" => Subregion::NorthernEurope, + "IL" => Subregion::WesternAsia, + "IT" => Subregion::SouthernEurope, + "JM" => Subregion::Caribbean, + "JP" => Subregion::EasternAsia, + "JE" => Subregion::NorthernEurope, + "JO" => Subregion::WesternAsia, + "KZ" => Subregion::CentralAsia, + "KE" => Subregion::EasternAfrica, + "KI" => Subregion::Micronesia, + "KP" => Subregion::EasternAsia, + "KR" => Subregion::EasternAsia, + "KW" => Subregion::WesternAsia, + "KG" => Subregion::CentralAsia, + "LA" => Subregion::SouthEasternAsia, + "LV" => Subregion::NorthernEurope, + "LB" => Subregion::WesternAsia, + "LS" => Subregion::SouthernAfrica, + "LR" => Subregion::WesternAfrica, + "LY" => Subregion::NorthernAfrica, + "LI" => Subregion::WesternEurope, + "LT" => Subregion::NorthernEurope, + "LU" => Subregion::WesternEurope, + "MO" => Subregion::EasternAsia, + "MG" => Subregion::EasternAfrica, + "MW" => Subregion::EasternAfrica, + "MY" => Subregion::SouthEasternAsia, + "MV" => Subregion::SouthernAsia, + "ML" => Subregion::WesternAfrica, + "MT" => Subregion::SouthernEurope, + "MH" => Subregion::Micronesia, + "MQ" => Subregion::Caribbean, + "MR" => Subregion::WesternAfrica, + "MU" => Subregion::EasternAfrica, + "YT" => Subregion::EasternAfrica, + "MX" => Subregion::CentralAmerica, + "FM" => Subregion::Micronesia, + "MD" => Subregion::EasternEurope, + "MC" => Subregion::WesternEurope, + "MN" => Subregion::EasternAsia, + "ME" => Subregion::SouthernEurope, + "MS" => Subregion::Caribbean, + "MA" => Subregion::NorthernAfrica, + "MZ" => Subregion::EasternAfrica, + "MM" => Subregion::SouthEasternAsia, + "NA" => Subregion::SouthernAfrica, + "NR" => Subregion::Micronesia, + "NP" => Subregion::SouthernAsia, + "NL" => Subregion::WesternEurope, + "NC" => Subregion::Melanesia, + "NZ" => Subregion::AustraliaAndNewZealand, + "NI" => Subregion::CentralAmerica, + "NE" => Subregion::WesternAfrica, + "NG" => Subregion::WesternAfrica, + "NU" => Subregion::Polynesia, + "NF" => Subregion::AustraliaAndNewZealand, + "MK" => Subregion::SouthernEurope, + "MP" => Subregion::Micronesia, + "NO" => Subregion::NorthernEurope, + "OM" => Subregion::WesternAsia, + "PK" => Subregion::SouthernAsia, + "PW" => Subregion::Micronesia, + "PS" => Subregion::WesternAsia, + "PA" => Subregion::CentralAmerica, + "PG" => Subregion::Melanesia, + "PY" => Subregion::SouthAmerica, + "PE" => Subregion::SouthAmerica, + "PH" => Subregion::SouthEasternAsia, + "PN" => Subregion::Polynesia, + "PL" => Subregion::EasternEurope, + "PT" => Subregion::SouthernEurope, + "PR" => Subregion::Caribbean, + "QA" => Subregion::WesternAsia, + "RE" => Subregion::EasternAfrica, + "RO" => Subregion::EasternEurope, + "RU" => Subregion::EasternEurope, + "RW" => Subregion::EasternAfrica, + "BL" => Subregion::Caribbean, + "SH" => Subregion::WesternAfrica, + "KN" => Subregion::Caribbean, + "LC" => Subregion::Caribbean, + "MF" => Subregion::Caribbean, + "PM" => Subregion::NorthernAmerica, + "VC" => Subregion::Caribbean, + "WS" => Subregion::Polynesia, + "SM" => Subregion::SouthernEurope, + "ST" => Subregion::MiddleAfrica, + "SA" => Subregion::WesternAsia, + "SN" => Subregion::WesternAfrica, + "RS" => Subregion::SouthernEurope, + "SC" => Subregion::EasternAfrica, + "SL" => Subregion::WesternAfrica, + "SG" => Subregion::SouthEasternAsia, + "SX" => Subregion::Caribbean, + "SK" => Subregion::EasternEurope, + "SI" => Subregion::SouthernEurope, + "SB" => Subregion::Melanesia, + "SO" => Subregion::EasternAfrica, + "ZA" => Subregion::SouthernAfrica, + "SS" => Subregion::EasternAfrica, + "ES" => Subregion::SouthernEurope, + "LK" => Subregion::SouthernAsia, + "SD" => Subregion::NorthernAfrica, + "SR" => Subregion::SouthAmerica, + "SJ" => Subregion::NorthernEurope, + "SE" => Subregion::NorthernEurope, + "CH" => Subregion::WesternEurope, + "SY" => Subregion::WesternAsia, + "TW" => Subregion::EasternAsia, + "TJ" => Subregion::CentralAsia, + "TZ" => Subregion::EasternAfrica, + "TH" => Subregion::SouthEasternAsia, + "TL" => Subregion::SouthEasternAsia, + "TG" => Subregion::WesternAfrica, + "TK" => Subregion::Polynesia, + "TO" => Subregion::Polynesia, + "TT" => Subregion::Caribbean, + "TN" => Subregion::NorthernAfrica, + "TR" => Subregion::WesternAsia, + "TM" => Subregion::CentralAsia, + "TC" => Subregion::Caribbean, + "TV" => Subregion::Polynesia, + "UG" => Subregion::EasternAfrica, + "UA" => Subregion::EasternEurope, + "AE" => Subregion::WesternAsia, + "GB" => Subregion::NorthernEurope, + "US" => Subregion::NorthernAmerica, + "UY" => Subregion::SouthAmerica, + "UZ" => Subregion::CentralAsia, + "VU" => Subregion::Melanesia, + "VE" => Subregion::SouthAmerica, + "VN" => Subregion::SouthEasternAsia, + "VG" => Subregion::Caribbean, + "VI" => Subregion::Caribbean, + "WF" => Subregion::Polynesia, + "EH" => Subregion::NorthernAfrica, + "YE" => Subregion::WesternAsia, + "ZM" => Subregion::EasternAfrica, + "ZW" => Subregion::EasternAfrica, + // Additional ISO codes for territories + "AX" => Subregion::NorthernEurope, + "BQ" => Subregion::Caribbean, + "CW" => Subregion::Caribbean, + // "TF" => Subregion::Antarctica, + "IM" => Subregion::NorthernEurope, + _ => return None, + }) + } +} diff --git a/relay-event-normalization/src/normalize/span/mod.rs b/relay-event-normalization/src/normalize/span/mod.rs index f4cdf91486..93c382bdd2 100644 --- a/relay-event-normalization/src/normalize/span/mod.rs +++ b/relay-event-normalization/src/normalize/span/mod.rs @@ -1,6 +1,7 @@ //! Span normalization logic. pub mod ai; +pub mod country_subregion; pub mod description; pub mod exclusive_time; pub mod tag_extraction; diff --git a/relay-event-normalization/src/normalize/span/tag_extraction.rs b/relay-event-normalization/src/normalize/span/tag_extraction.rs index d4c649c71b..9dc15454ac 100644 --- a/relay-event-normalization/src/normalize/span/tag_extraction.rs +++ b/relay-event-normalization/src/normalize/span/tag_extraction.rs @@ -18,6 +18,7 @@ use sqlparser::ast::Visit; use sqlparser::ast::{ObjectName, Visitor}; use url::{Host, Url}; +use crate::span::country_subregion::Subregion; use crate::span::description::{ concatenate_host_and_port, scrub_domain_name, scrub_span_description, }; @@ -86,6 +87,7 @@ pub enum SpanTagKey { ThreadId, ProfilerId, UserCountryCode, + UserSubregion, } impl SpanTagKey { @@ -100,6 +102,7 @@ impl SpanTagKey { SpanTagKey::UserUsername => "user.username", SpanTagKey::UserEmail => "user.email", SpanTagKey::UserCountryCode => "user.geo.country_code", + SpanTagKey::UserSubregion => "user.geo.subregion", SpanTagKey::Environment => "environment", SpanTagKey::Transaction => "transaction", SpanTagKey::TransactionMethod => "transaction.method", @@ -312,6 +315,10 @@ fn extract_shared_tags(event: &Event) -> BTreeMap { } if let Some(country_code) = user.geo.value().and_then(|geo| geo.country_code.value()) { tags.insert(SpanTagKey::UserCountryCode, country_code.to_owned()); + if let Some(subregion) = Subregion::from_iso2(country_code.as_str()) { + let numerical_subregion = subregion as u8; + tags.insert(SpanTagKey::UserSubregion, numerical_subregion.to_string()); + } } } @@ -2580,6 +2587,7 @@ LIMIT 1 "admin@sentry.io" ); assert_eq!(get_value!(span.sentry_tags["user.geo.country_code"]!), "US"); + assert_eq!(get_value!(span.sentry_tags["user.geo.subregion"]!), "21"); } #[test] diff --git a/relay-server/src/metrics_extraction/event.rs b/relay-server/src/metrics_extraction/event.rs index 701318a635..d7e3f94dc1 100644 --- a/relay-server/src/metrics_extraction/event.rs +++ b/relay-server/src/metrics_extraction/event.rs @@ -153,7 +153,7 @@ mod tests { "user": { "id": "user123", "geo": { - "country_code": "US" + "country_code": "FR" } }, "tags": { diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__both_feature_flags_enabled.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__both_feature_flags_enabled.snap index fa0ebcdf5e..b7e4a1a6c8 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__both_feature_flags_enabled.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__both_feature_flags_enabled.snap @@ -3508,6 +3508,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3536,6 +3537,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3566,6 +3568,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3594,6 +3597,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4253,6 +4257,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4282,6 +4287,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "d744fa0716ef1142", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4313,6 +4319,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4342,6 +4349,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "d744fa0716ef1142", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4476,6 +4484,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4505,6 +4514,7 @@ expression: metrics "span.domain": "*.example.com:5688", "span.group": "89bda2e660f6236c", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4536,6 +4546,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4565,6 +4576,7 @@ expression: metrics "span.domain": "*.example.com:5688", "span.group": "89bda2e660f6236c", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7938,6 +7950,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7965,6 +7978,7 @@ expression: metrics "span.domain": "*", "span.group": "3e92c536f98104b2", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7994,6 +8008,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8021,6 +8036,7 @@ expression: metrics "span.domain": "*", "span.group": "3e92c536f98104b2", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8069,6 +8085,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8097,6 +8114,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8127,6 +8145,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8155,6 +8174,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8204,6 +8224,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8233,6 +8254,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "7f402250846262be", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8264,6 +8286,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8293,6 +8316,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "7f402250846262be", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8424,6 +8448,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8450,6 +8475,7 @@ expression: metrics "span.description": "*/zero-length-*", "span.group": "c7d3c9d83f92123a", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8478,6 +8504,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -8504,6 +8531,7 @@ expression: metrics "span.description": "*/zero-length-*", "span.group": "c7d3c9d83f92123a", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__only_common.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__only_common.snap index 89f8dec10d..498f393aa5 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__only_common.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__only_common.snap @@ -3214,6 +3214,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3242,6 +3243,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3272,6 +3274,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3300,6 +3303,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3951,6 +3955,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -3980,6 +3985,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "d744fa0716ef1142", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4011,6 +4017,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4040,6 +4047,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "d744fa0716ef1142", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4174,6 +4182,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4203,6 +4212,7 @@ expression: metrics "span.domain": "*.example.com:5688", "span.group": "89bda2e660f6236c", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4234,6 +4244,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -4263,6 +4274,7 @@ expression: metrics "span.domain": "*.example.com:5688", "span.group": "89bda2e660f6236c", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7367,6 +7379,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7394,6 +7407,7 @@ expression: metrics "span.domain": "*", "span.group": "3e92c536f98104b2", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7423,6 +7437,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7450,6 +7465,7 @@ expression: metrics "span.domain": "*", "span.group": "3e92c536f98104b2", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7498,6 +7514,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7526,6 +7543,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7556,6 +7574,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7584,6 +7603,7 @@ expression: metrics "span.domain": "domain", "span.group": "022f81fdf31228bf", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7633,6 +7653,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7662,6 +7683,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "7f402250846262be", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7693,6 +7715,7 @@ expression: metrics "span.op": "resource.css", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7722,6 +7745,7 @@ expression: metrics "span.domain": "*.domain.com", "span.group": "7f402250846262be", "span.op": "resource.css", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7853,6 +7877,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7879,6 +7904,7 @@ expression: metrics "span.description": "*/zero-length-*", "span.group": "c7d3c9d83f92123a", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7907,6 +7933,7 @@ expression: metrics "span.op": "resource.script", "transaction": "gEt /api/:version/users/", "transaction.op": "myop", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, @@ -7933,6 +7960,7 @@ expression: metrics "span.description": "*/zero-length-*", "span.group": "c7d3c9d83f92123a", "span.op": "resource.script", + "user.geo.subregion": "155", }, metadata: BucketMetadata { merges: 1, diff --git a/relay-server/src/metrics_extraction/transactions/mod.rs b/relay-server/src/metrics_extraction/transactions/mod.rs index 5caf724463..16e68a7a19 100644 --- a/relay-server/src/metrics_extraction/transactions/mod.rs +++ b/relay-server/src/metrics_extraction/transactions/mod.rs @@ -3,6 +3,7 @@ use std::collections::{BTreeMap, BTreeSet}; use relay_base_schema::events::EventType; use relay_common::time::UnixTimestamp; use relay_dynamic_config::{CombinedMetricExtractionConfig, TransactionMetricsConfig}; +use relay_event_normalization::span::country_subregion::Subregion; use relay_event_normalization::utils as normalize_utils; use relay_event_schema::protocol::{ AsPair, BrowserContext, Event, OsContext, PerformanceScoreContext, TraceContext, @@ -29,10 +30,11 @@ const PLACEHOLDER_UNPARAMETERIZED: &str = "<< unparameterized >>"; /// Tags we set on metrics for performance score measurements (e.g. `score.lcp.weight`). /// /// These are a subset of "universal" tags. -const PERFORMANCE_SCORE_TAGS: [CommonTag; 6] = [ +const PERFORMANCE_SCORE_TAGS: [CommonTag; 7] = [ CommonTag::BrowserName, CommonTag::Environment, CommonTag::GeoCountryCode, + CommonTag::UserSubregion, CommonTag::Release, CommonTag::Transaction, CommonTag::TransactionOp, @@ -193,6 +195,16 @@ fn extract_universal_tags(event: &Event, config: &TransactionMetricsConfig) -> C tags.insert(CommonTag::GeoCountryCode, geo_country_code); } + // The product only uses the subregion for web data at the moment + if let Some(_browser_name) = extract_browser_name(event) { + if let Some(geo_country_code) = extract_geo_country_code(event) { + if let Some(subregion) = Subregion::from_iso2(geo_country_code.as_str()) { + let numerical_subregion = subregion as u8; + tags.insert(CommonTag::UserSubregion, numerical_subregion.to_string()); + } + } + } + if let Some(status_code) = normalize_utils::extract_http_status_code(event) { tags.insert(CommonTag::HttpStatusCode, status_code); } @@ -672,6 +684,7 @@ mod tests { "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", "transaction.status": "ok", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -706,6 +719,7 @@ mod tests { "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", "transaction.status": "ok", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -734,6 +748,7 @@ mod tests { "sentry.score_profile_version": "alpha", "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -762,6 +777,7 @@ mod tests { "sentry.score_profile_version": "alpha", "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -790,6 +806,7 @@ mod tests { "sentry.score_profile_version": "alpha", "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -823,6 +840,7 @@ mod tests { "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", "transaction.status": "ok", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -874,6 +892,7 @@ mod tests { "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", "transaction.status": "ok", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, @@ -930,6 +949,7 @@ mod tests { "transaction": "gEt /api/:version/users/", "transaction.op": "mYOp", "transaction.status": "ok", + "user.geo.subregion": "21", }, metadata: BucketMetadata { merges: 1, diff --git a/relay-server/src/metrics_extraction/transactions/types.rs b/relay-server/src/metrics_extraction/transactions/types.rs index c44f1db2ca..0f9923c4f1 100644 --- a/relay-server/src/metrics_extraction/transactions/types.rs +++ b/relay-server/src/metrics_extraction/transactions/types.rs @@ -232,6 +232,7 @@ pub enum CommonTag { BrowserName, OsName, GeoCountryCode, + UserSubregion, DeviceClass, Custom(String), } @@ -251,6 +252,7 @@ impl Display for CommonTag { CommonTag::BrowserName => "browser.name", CommonTag::OsName => "os.name", CommonTag::GeoCountryCode => "geo.country_code", + CommonTag::UserSubregion => "user.geo.subregion", CommonTag::DeviceClass => "device.class", CommonTag::Custom(s) => s, };