Skip to content

Commit c44960e

Browse files
feat(spans): Extract span.group tag (#2176)
Adds `span.group` tag to span metrics. The span group is calculated by taking the first 16 characters of the MD5 of the sanitized span description; thus, if the span description isn't sanitized, we don't extract it. In order to calculate the MD5 hash, we introduce [the MD5 crate](https://github.com/stainless-steel/md5) as a new dependency ([licensed](https://github.com/stainless-steel/md5/blob/master/LICENSE.md) under both Apache 2.0 and MIT).
1 parent 9505bfa commit c44960e

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

relay-server/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ tower = { version = "0.4.13", default-features = false }
7777
tower-http = { version = "0.4.0", default-features = false, features = ["catch-panic", "cors", "decompression-br", "decompression-deflate", "decompression-gzip", "set-header", "trace"] }
7878
url = { version = "2.1.1", features = ["serde"] }
7979
zstd = { version = "0.12.3", optional = true }
80+
md5 = "0.7.0"
8081

8182
[dev-dependencies]
8283
insta = { version = "1.19.0", features = ["json"] }

relay-server/src/metrics_extraction/transactions/mod.rs

+38-6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use md5;
12
use std::collections::BTreeMap;
23

34
use itertools::Itertools;
@@ -577,6 +578,10 @@ fn extract_span_metrics(
577578
"span.description".to_owned(),
578579
scrubbed_description.to_owned(),
579580
);
581+
582+
let mut span_group = format!("{:?}", md5::compute(scrubbed_description));
583+
span_group.truncate(16);
584+
span_tags.insert("span.group".to_owned(), span_group);
580585
}
581586

582587
if let Some(span_op) = span.op.value() {
@@ -1441,7 +1446,8 @@ mod tests {
14411446
"span.op": "http.client",
14421447
"span.status": "ok",
14431448
"span.status_code": "200",
1444-
"transaction": "mytransaction",
1449+
"transaction": "GET /api/:version/users/",
1450+
"transaction.method": "GET",
14451451
"transaction.op": "myop",
14461452
},
14471453
},
@@ -1459,7 +1465,8 @@ mod tests {
14591465
"span.op": "http.client",
14601466
"span.status": "ok",
14611467
"span.status_code": "200",
1462-
"transaction": "mytransaction",
1468+
"transaction": "GET /api/:version/users/",
1469+
"transaction.method": "GET",
14631470
"transaction.op": "myop",
14641471
},
14651472
},
@@ -1477,7 +1484,8 @@ mod tests {
14771484
"span.op": "http.client",
14781485
"span.status": "ok",
14791486
"span.status_code": "200",
1480-
"transaction": "mytransaction",
1487+
"transaction": "GET /api/:version/users/",
1488+
"transaction.method": "GET",
14811489
"transaction.op": "myop",
14821490
},
14831491
},
@@ -1495,7 +1503,8 @@ mod tests {
14951503
"span.op": "http.client",
14961504
"span.status": "ok",
14971505
"span.status_code": "200",
1498-
"transaction": "mytransaction",
1506+
"transaction": "GET /api/:version/users/",
1507+
"transaction.method": "GET",
14991508
"transaction.op": "myop",
15001509
},
15011510
},
@@ -1513,7 +1522,8 @@ mod tests {
15131522
"span.op": "http.client",
15141523
"span.status": "ok",
15151524
"span.status_code": "200",
1516-
"transaction": "mytransaction",
1525+
"transaction": "GET /api/:version/users/",
1526+
"transaction.method": "GET",
15171527
"transaction.op": "myop",
15181528
},
15191529
},
@@ -1531,7 +1541,8 @@ mod tests {
15311541
"span.op": "http.client",
15321542
"span.status": "ok",
15331543
"span.status_code": "200",
1534-
"transaction": "mytransaction",
1544+
"transaction": "GET /api/:version/users/",
1545+
"transaction.method": "GET",
15351546
"transaction.op": "myop",
15361547
},
15371548
},
@@ -1603,6 +1614,7 @@ mod tests {
16031614
"span.action": "POST",
16041615
"span.description": "POST http://targetdomain:targetport/api/id/*",
16051616
"span.domain": "targetdomain:targetport",
1617+
"span.group": "ca77233e5cdb864b",
16061618
"span.module": "http",
16071619
"span.op": "http.client",
16081620
"span.status": "ok",
@@ -1623,6 +1635,7 @@ mod tests {
16231635
"span.action": "POST",
16241636
"span.description": "POST http://targetdomain:targetport/api/id/*",
16251637
"span.domain": "targetdomain:targetport",
1638+
"span.group": "ca77233e5cdb864b",
16261639
"span.module": "http",
16271640
"span.op": "http.client",
16281641
"span.status": "ok",
@@ -1643,6 +1656,7 @@ mod tests {
16431656
"span.action": "POST",
16441657
"span.description": "POST http://targetdomain:targetport/api/id/*",
16451658
"span.domain": "targetdomain:targetport",
1659+
"span.group": "ca77233e5cdb864b",
16461660
"span.module": "http",
16471661
"span.op": "http.client",
16481662
"span.status": "ok",
@@ -1663,6 +1677,7 @@ mod tests {
16631677
"span.action": "SELECT",
16641678
"span.description": "SELECT column FROM table WHERE id IN (%s)",
16651679
"span.domain": "table",
1680+
"span.group": "a31d8fd4438bc382",
16661681
"span.module": "db",
16671682
"span.op": "db.sql.query",
16681683
"span.status": "ok",
@@ -1683,6 +1698,7 @@ mod tests {
16831698
"span.action": "SELECT",
16841699
"span.description": "SELECT column FROM table WHERE id IN (%s)",
16851700
"span.domain": "table",
1701+
"span.group": "a31d8fd4438bc382",
16861702
"span.module": "db",
16871703
"span.op": "db.sql.query",
16881704
"span.status": "ok",
@@ -1703,6 +1719,7 @@ mod tests {
17031719
"span.action": "SELECT",
17041720
"span.description": "SELECT column FROM table WHERE id IN (%s)",
17051721
"span.domain": "table",
1722+
"span.group": "a31d8fd4438bc382",
17061723
"span.module": "db",
17071724
"span.op": "db.sql.query",
17081725
"span.status": "ok",
@@ -1723,6 +1740,7 @@ mod tests {
17231740
"span.action": "SELECT",
17241741
"span.description": "SELECT column FROM table WHERE id IN (%s)",
17251742
"span.domain": "table",
1743+
"span.group": "a31d8fd4438bc382",
17261744
"span.module": "db",
17271745
"span.op": "db",
17281746
"span.status": "ok",
@@ -1742,6 +1760,7 @@ mod tests {
17421760
"span.action": "SELECT",
17431761
"span.description": "SELECT column FROM table WHERE id IN (%s)",
17441762
"span.domain": "table",
1763+
"span.group": "a31d8fd4438bc382",
17451764
"span.module": "db",
17461765
"span.op": "db",
17471766
"span.status": "ok",
@@ -1761,6 +1780,7 @@ mod tests {
17611780
"span.action": "SELECT",
17621781
"span.description": "SELECT column FROM table WHERE id IN (%s)",
17631782
"span.domain": "table",
1783+
"span.group": "a31d8fd4438bc382",
17641784
"span.module": "db",
17651785
"span.op": "db",
17661786
"span.status": "ok",
@@ -2062,6 +2082,7 @@ mod tests {
20622082
"span.action": "SELECT",
20632083
"span.description": "SELECT %s.%s FROM %s WHERE %s.%s = %s",
20642084
"span.domain": "table",
2085+
"span.group": "c55478a060a56db3",
20652086
"span.module": "db",
20662087
"span.op": "db",
20672088
"span.status": "ok",
@@ -2082,6 +2103,7 @@ mod tests {
20822103
"span.action": "SELECT",
20832104
"span.description": "SELECT %s.%s FROM %s WHERE %s.%s = %s",
20842105
"span.domain": "table",
2106+
"span.group": "c55478a060a56db3",
20852107
"span.module": "db",
20862108
"span.op": "db",
20872109
"span.status": "ok",
@@ -2102,6 +2124,7 @@ mod tests {
21022124
"span.action": "SELECT",
21032125
"span.description": "SELECT %s.%s FROM %s WHERE %s.%s = %s",
21042126
"span.domain": "table",
2127+
"span.group": "c55478a060a56db3",
21052128
"span.module": "db",
21062129
"span.op": "db",
21072130
"span.status": "ok",
@@ -2120,6 +2143,7 @@ mod tests {
21202143
tags: {
21212144
"environment": "fake_environment",
21222145
"span.description": "SAVEPOINT %s",
2146+
"span.group": "3f955cbde39e04b9",
21232147
"span.module": "db",
21242148
"span.op": "db",
21252149
"span.status": "ok",
@@ -2138,6 +2162,7 @@ mod tests {
21382162
tags: {
21392163
"environment": "fake_environment",
21402164
"span.description": "SAVEPOINT %s",
2165+
"span.group": "3f955cbde39e04b9",
21412166
"span.module": "db",
21422167
"span.op": "db",
21432168
"span.status": "ok",
@@ -2156,6 +2181,7 @@ mod tests {
21562181
tags: {
21572182
"environment": "fake_environment",
21582183
"span.description": "SAVEPOINT %s",
2184+
"span.group": "3f955cbde39e04b9",
21592185
"span.module": "db",
21602186
"span.op": "db",
21612187
"span.status": "ok",
@@ -2174,6 +2200,7 @@ mod tests {
21742200
tags: {
21752201
"environment": "fake_environment",
21762202
"span.description": "GET cache:user:*",
2203+
"span.group": "325fa5feb926f121",
21772204
"span.module": "cache",
21782205
"span.op": "cache.get_item",
21792206
"span.status": "ok",
@@ -2191,6 +2218,7 @@ mod tests {
21912218
tags: {
21922219
"environment": "fake_environment",
21932220
"span.description": "GET cache:user:*",
2221+
"span.group": "325fa5feb926f121",
21942222
"span.module": "cache",
21952223
"span.op": "cache.get_item",
21962224
"span.status": "ok",
@@ -2208,6 +2236,7 @@ mod tests {
22082236
tags: {
22092237
"environment": "fake_environment",
22102238
"span.description": "GET cache:user:*",
2239+
"span.group": "325fa5feb926f121",
22112240
"span.module": "cache",
22122241
"span.op": "cache.get_item",
22132242
"span.status": "ok",
@@ -2225,6 +2254,7 @@ mod tests {
22252254
tags: {
22262255
"environment": "fake_environment",
22272256
"span.description": "http://domain/static/myscript-*.js",
2257+
"span.group": "022f81fdf31228bf",
22282258
"span.op": "resource.script",
22292259
"span.status": "ok",
22302260
"transaction": "GET /api/:version/users/",
@@ -2241,6 +2271,7 @@ mod tests {
22412271
tags: {
22422272
"environment": "fake_environment",
22432273
"span.description": "http://domain/static/myscript-*.js",
2274+
"span.group": "022f81fdf31228bf",
22442275
"span.op": "resource.script",
22452276
"span.status": "ok",
22462277
"transaction": "GET /api/:version/users/",
@@ -2257,6 +2288,7 @@ mod tests {
22572288
tags: {
22582289
"environment": "fake_environment",
22592290
"span.description": "http://domain/static/myscript-*.js",
2291+
"span.group": "022f81fdf31228bf",
22602292
"span.op": "resource.script",
22612293
"span.status": "ok",
22622294
"transaction": "GET /api/:version/users/",

relay-server/src/metrics_extraction/transactions/snapshots/relay_server__metrics_extraction__transactions__tests__extract_transaction_metrics.snap

+29-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@ expression: event.value().unwrap().spans
158158
"200",
159159
),
160160
"transaction": String(
161-
"mytransaction",
161+
"GET /api/:version/users/",
162+
),
163+
"transaction.method": String(
164+
"GET",
162165
),
163166
"transaction.op": String(
164167
"myop",
@@ -221,7 +224,10 @@ expression: event.value().unwrap().spans
221224
"200",
222225
),
223226
"transaction": String(
224-
"mytransaction",
227+
"GET /api/:version/users/",
228+
),
229+
"transaction.method": String(
230+
"GET",
225231
),
226232
"transaction.op": String(
227233
"myop",
@@ -332,6 +338,9 @@ expression: event.value().unwrap().spans
332338
"span.domain": String(
333339
"targetdomain:targetport",
334340
),
341+
"span.group": String(
342+
"ca77233e5cdb864b",
343+
),
335344
"span.module": String(
336345
"http",
337346
),
@@ -403,6 +412,9 @@ expression: event.value().unwrap().spans
403412
"span.domain": String(
404413
"table",
405414
),
415+
"span.group": String(
416+
"a31d8fd4438bc382",
417+
),
406418
"span.module": String(
407419
"db",
408420
),
@@ -465,6 +477,9 @@ expression: event.value().unwrap().spans
465477
"span.domain": String(
466478
"table",
467479
),
480+
"span.group": String(
481+
"a31d8fd4438bc382",
482+
),
468483
"span.module": String(
469484
"db",
470485
),
@@ -831,6 +846,9 @@ expression: event.value().unwrap().spans
831846
"span.domain": String(
832847
"table",
833848
),
849+
"span.group": String(
850+
"c55478a060a56db3",
851+
),
834852
"span.module": String(
835853
"db",
836854
),
@@ -890,6 +908,9 @@ expression: event.value().unwrap().spans
890908
"span.description": String(
891909
"SAVEPOINT %s",
892910
),
911+
"span.group": String(
912+
"3f955cbde39e04b9",
913+
),
893914
"span.module": String(
894915
"db",
895916
),
@@ -949,6 +970,9 @@ expression: event.value().unwrap().spans
949970
"span.description": String(
950971
"GET cache:user:*",
951972
),
973+
"span.group": String(
974+
"325fa5feb926f121",
975+
),
952976
"span.module": String(
953977
"cache",
954978
),
@@ -1002,6 +1026,9 @@ expression: event.value().unwrap().spans
10021026
"span.description": String(
10031027
"http://domain/static/myscript-*.js",
10041028
),
1029+
"span.group": String(
1030+
"022f81fdf31228bf",
1031+
),
10051032
"span.op": String(
10061033
"resource.script",
10071034
),

0 commit comments

Comments
 (0)