Skip to content

Commit

Permalink
feat(spans): Extract additional user fields for spans (#3599)
Browse files Browse the repository at this point in the history
Trying to bring the user fields on spans closer to transactions. User
alone is not ergonomic and we'd like to be able to search by user email,
username etc. Transactions also has the user's ip address but the spans
table currently does not have the ipv4 and ipv6 columns for it so going
to hold off on it as the other fields are more useful.
  • Loading branch information
Zylphrex authored May 16, 2024
1 parent db7bbf5 commit ea2a148
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
- Add a calculated measurement based on the AI model and the tokens used. ([#3554](https://github.com/getsentry/relay/pull/3554))
- Restrict usage of OTel endpoint. ([#3597](github.com/getsentry/relay/pull/3597))
- Support new cache span ops in metrics and tag extraction. ([#3598](https://github.com/getsentry/relay/pull/3598))
- Extract additional user fields for spans. ([#3599](https://github.com/getsentry/relay/pull/3599))

## 24.4.2

Expand Down
75 changes: 73 additions & 2 deletions relay-event-normalization/src/normalize/span/tag_extraction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ pub enum SpanTagKey {
// Specific to a transaction
Release,
User,
UserID,
UserUsername,
UserEmail,
Environment,
Transaction,
TransactionMethod,
Expand Down Expand Up @@ -86,6 +89,9 @@ impl SpanTagKey {
match self {
SpanTagKey::Release => "release",
SpanTagKey::User => "user",
SpanTagKey::UserID => "user.id",
SpanTagKey::UserUsername => "user.username",
SpanTagKey::UserEmail => "user.email",
SpanTagKey::Environment => "environment",
SpanTagKey::Transaction => "transaction",
SpanTagKey::TransactionMethod => "transaction.method",
Expand Down Expand Up @@ -213,8 +219,19 @@ fn extract_shared_tags(event: &Event) -> BTreeMap<SpanTagKey, String> {
tags.insert(SpanTagKey::Release, release.to_owned());
}

if let Some(user) = event.user.value().and_then(|u| u.sentry_user.value()) {
tags.insert(SpanTagKey::User, user.clone());
if let Some(user) = event.user.value() {
if let Some(sentry_user) = user.sentry_user.value() {
tags.insert(SpanTagKey::User, sentry_user.clone());
}
if let Some(user_id) = user.id.value() {
tags.insert(SpanTagKey::UserID, user_id.as_str().to_owned());
}
if let Some(user_username) = user.username.value() {
tags.insert(SpanTagKey::UserUsername, user_username.as_str().to_owned());
}
if let Some(user_email) = user.email.value() {
tags.insert(SpanTagKey::UserEmail, user_email.clone());
}
}

if let Some(environment) = event.environment.as_str() {
Expand Down Expand Up @@ -1943,4 +1960,58 @@ LIMIT 1
assert_eq!(tags.get(&SpanTagKey::Description), None);
assert_eq!(tags.get(&SpanTagKey::Domain), None);
}

#[test]
fn extract_user_into_sentry_tags() {
let json = r#"
{
"type": "transaction",
"platform": "javascript",
"start_timestamp": "2021-04-26T07:59:01+0100",
"timestamp": "2021-04-26T08:00:00+0100",
"transaction": "foo",
"contexts": {
"trace": {
"trace_id": "ff62a8b040f340bda5d830223def1d81",
"span_id": "bd429c44b67a3eb4"
}
},
"user": {
"id": "1",
"email": "admin@sentry.io",
"username": "admin"
},
"spans": [
{
"op": "before_first_display",
"span_id": "bd429c44b67a3eb1",
"start_timestamp": 1597976300.0000000,
"timestamp": 1597976302.0000000,
"trace_id": "ff62a8b040f340bda5d830223def1d81"
}
]
}
"#;

let mut event = Annotated::<Event>::from_json(json).unwrap();

normalize_event(
&mut event,
&NormalizationConfig {
enrich_spans: true,
..Default::default()
},
);

let event = event.into_value().unwrap();
let span = &event.spans.value().unwrap()[0];

assert_eq!(get_value!(span.sentry_tags["user"]!), "id:1");
assert_eq!(get_value!(span.sentry_tags["user.id"]!), "1");
assert_eq!(get_value!(span.sentry_tags["user.username"]!), "admin");
assert_eq!(
get_value!(span.sentry_tags["user.email"]!),
"admin@sentry.io"
);
}
}

0 comments on commit ea2a148

Please sign in to comment.