@@ -464,6 +464,74 @@ def envelope_with_spans(
464
464
)
465
465
)
466
466
467
+ envelope .add_item (
468
+ Item (
469
+ type = "span" ,
470
+ headers = {"metrics_extracted" : metrics_extracted , "item_count" : 2 },
471
+ content_type = "application/vnd.sentry.items.span.v2+json" ,
472
+ payload = PayloadRef (
473
+ json = {"items" : [
474
+ {
475
+ "trace_id" : "89143b0763095bd9c9955e8175d1fb23" ,
476
+ "span_id" : "a342abb1214ca182" ,
477
+ "name" : "my 1st V2 span" ,
478
+ "kind" : "unspecified" ,
479
+ "start_timestamp" : start .timestamp (),
480
+ "end_timestamp" : end .timestamp (),
481
+ "attributes" : {
482
+ "sentry.category" : {
483
+ "type" : "string" ,
484
+ "value" : "db" ,
485
+ },
486
+ "sentry.exclusive_time_nano" : {
487
+ "type" : "integer" ,
488
+ "value" : int ((end - start ).total_seconds () * 1e9 ),
489
+ },
490
+ },
491
+ "links" : [
492
+ {
493
+ "trace_id" : "89143b0763095bd9c9955e8175d1fb24" ,
494
+ "span_id" : "e342abb1214ca183" ,
495
+ "sampled" : False ,
496
+ "attributes" : {
497
+ "link_double_key" : {
498
+ "type" : "double" ,
499
+ "value" : 1.23 ,
500
+ },
501
+ },
502
+ },
503
+ ],
504
+ },
505
+ {
506
+ "trace_id" : "ff62a8b040f340bda5d830223def1d81" ,
507
+ "span_id" : "b0429c44b67a3eb2" ,
508
+ "name" : "resource.script" ,
509
+ "status" : "ok" ,
510
+ "start_timestamp" : start .timestamp (),
511
+ "end_timestamp" : end .timestamp () + 1 ,
512
+ "links" : [
513
+ {
514
+ "trace_id" : "99143b0763095bd9c9955e8175d1fb25" ,
515
+ "span_id" : "e342abb1214ca183" ,
516
+ "sampled" : True ,
517
+ "attributes" : {
518
+ "link_bool_key" : {"type" : "boolean" , "value" : True },
519
+ },
520
+ },
521
+ ],
522
+ "attributes" : {
523
+ "browser.name" : {"type" : "string" , "value" : "Chrome" },
524
+ "sentry.description" : {"type" : "string" , "value" : "https://example.com/p/blah.js" },
525
+ "sentry.exclusive_time_nano" : {"type" : "integer" , "value" : 345 * 1e6 },
526
+ # Span with the same `span_id` and `segment_id`, to make sure it is classified as `is_segment`.
527
+ "sentry.segment_id" : {"type" : "string" , "value" : "b0429c44b67a3eb2" }
528
+ },
529
+ }
530
+ ]}
531
+ ),
532
+ )
533
+ )
534
+
467
535
return envelope
468
536
469
537
@@ -648,7 +716,7 @@ def test_span_ingestion(
648
716
headers = {"Content-Type" : "application/x-protobuf" },
649
717
)
650
718
651
- spans = spans_consumer .get_spans (timeout = 10.0 , n = 6 )
719
+ spans = spans_consumer .get_spans (timeout = 10.0 , n = 8 )
652
720
653
721
for span in spans :
654
722
span .pop ("received" , None )
@@ -694,6 +762,44 @@ def test_span_ingestion(
694
762
"end_timestamp_precise" : end .timestamp (),
695
763
"trace_id" : "89143b0763095bd9c9955e8175d1fb23" ,
696
764
},
765
+ {
766
+ "data" : {
767
+ "browser.name" : "Chrome" ,
768
+ "client.address" : "127.0.0.1" ,
769
+ "sentry.category" : "db" ,
770
+ "user_agent.original" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
771
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
772
+ "Chrome/111.0.0.0 Safari/537.36" ,
773
+ },
774
+ "duration_ms" : 500 ,
775
+ "exclusive_time_ms" : 500.0 ,
776
+ "is_segment" : True ,
777
+ "is_remote" : False ,
778
+ "kind" : "unspecified" ,
779
+ "links" : [
780
+ {
781
+ "trace_id" : "89143b0763095bd9c9955e8175d1fb24" ,
782
+ "span_id" : "e342abb1214ca183" ,
783
+ "sampled" : False ,
784
+ "attributes" : {"link_double_key" : 1.23 },
785
+ }
786
+ ],
787
+ "organization_id" : 1 ,
788
+ "project_id" : 42 ,
789
+ "retention_days" : 90 ,
790
+ "segment_id" : "a342abb1214ca182" ,
791
+ "sentry_tags" : {
792
+ "browser.name" : "Chrome" ,
793
+ "category" : "db" ,
794
+ "op" : "my 1st v2 span" ,
795
+ "status" : "unknown" ,
796
+ },
797
+ "span_id" : "a342abb1214ca182" ,
798
+ "start_timestamp_ms" : int (start .timestamp () * 1e3 ),
799
+ "start_timestamp_precise" : start .timestamp (),
800
+ "end_timestamp_precise" : end .timestamp (),
801
+ "trace_id" : "89143b0763095bd9c9955e8175d1fb23" ,
802
+ },
697
803
{
698
804
"data" : {
699
805
"browser.name" : "Chrome" ,
@@ -737,6 +843,49 @@ def test_span_ingestion(
737
843
"end_timestamp_precise" : end .timestamp () + 1 ,
738
844
"trace_id" : "ff62a8b040f340bda5d830223def1d81" ,
739
845
},
846
+ {
847
+ "data" : {
848
+ "browser.name" : "Chrome" ,
849
+ "client.address" : "127.0.0.1" ,
850
+ "user_agent.original" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
851
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
852
+ "Chrome/111.0.0.0 Safari/537.36" ,
853
+ },
854
+ "description" : "https://example.com/p/blah.js" ,
855
+ "duration_ms" : 1500 ,
856
+ "exclusive_time_ms" : 345.0 ,
857
+ "is_segment" : True ,
858
+ "is_remote" : False ,
859
+ "links" : [
860
+ {
861
+ "trace_id" : "99143b0763095bd9c9955e8175d1fb25" ,
862
+ "span_id" : "e342abb1214ca183" ,
863
+ "sampled" : True ,
864
+ "attributes" : {
865
+ "link_bool_key" : True ,
866
+ },
867
+ },
868
+ ],
869
+ "organization_id" : 1 ,
870
+ "project_id" : 42 ,
871
+ "retention_days" : 90 ,
872
+ "segment_id" : "b0429c44b67a3eb2" ,
873
+ "sentry_tags" : {
874
+ "browser.name" : "Chrome" ,
875
+ "category" : "resource" ,
876
+ "description" : "https://example.com/*/blah.js" ,
877
+ "domain" : "example.com" ,
878
+ "file_extension" : "js" ,
879
+ "group" : "8a97a9e43588e2bd" ,
880
+ "op" : "resource.script" ,
881
+ "status" : "ok" ,
882
+ },
883
+ "span_id" : "b0429c44b67a3eb2" ,
884
+ "start_timestamp_ms" : int (start .timestamp () * 1e3 ),
885
+ "start_timestamp_precise" : start .timestamp (),
886
+ "end_timestamp_precise" : end .timestamp () + 1 ,
887
+ "trace_id" : "ff62a8b040f340bda5d830223def1d81" ,
888
+ },
740
889
{
741
890
"data" : {
742
891
"browser.name" : "Chrome" ,
@@ -866,6 +1015,7 @@ def test_span_ingestion(
866
1015
spans_consumer .assert_empty ()
867
1016
868
1017
metrics = [metric for (metric , _headers ) in metrics_consumer .get_metrics ()]
1018
+ metrics_consumer .assert_empty ()
869
1019
metrics .sort (key = lambda m : (m ["name" ], sorted (m ["tags" ].items ()), m ["timestamp" ]))
870
1020
for metric in metrics :
871
1021
try :
@@ -885,7 +1035,7 @@ def test_span_ingestion(
885
1035
"tags" : {"decision" : "keep" , "target_project_id" : "42" },
886
1036
"timestamp" : expected_timestamp ,
887
1037
"type" : "c" ,
888
- "value" : 3 .0 ,
1038
+ "value" : 4 .0 ,
889
1039
},
890
1040
{
891
1041
"name" : "c:spans/count_per_root_project@none" ,
@@ -906,7 +1056,7 @@ def test_span_ingestion(
906
1056
"tags" : {},
907
1057
"timestamp" : expected_timestamp ,
908
1058
"type" : "c" ,
909
- "value" : 3 .0 ,
1059
+ "value" : 4 .0 ,
910
1060
"received_at" : time_after (now_timestamp ),
911
1061
},
912
1062
{
@@ -952,6 +1102,20 @@ def test_span_ingestion(
952
1102
"value" : [500.0 ],
953
1103
"received_at" : time_after (now_timestamp ),
954
1104
},
1105
+ {
1106
+ "name" : "d:spans/duration@millisecond" ,
1107
+ "org_id" : 1 ,
1108
+ "project_id" : 42 ,
1109
+ "retention_days" : 90 ,
1110
+ "tags" : {
1111
+ "span.category" : "db" ,
1112
+ "span.op" : "my 1st v2 span" ,
1113
+ },
1114
+ "timestamp" : expected_timestamp ,
1115
+ "type" : "d" ,
1116
+ "value" : [500.0 ],
1117
+ "received_at" : time_after (now_timestamp ),
1118
+ },
955
1119
{
956
1120
"name" : "d:spans/duration@millisecond" ,
957
1121
"org_id" : 1 ,
@@ -1018,6 +1182,17 @@ def test_span_ingestion(
1018
1182
"type" : "d" ,
1019
1183
"value" : [500.0 ],
1020
1184
},
1185
+ {
1186
+ "name" : "d:spans/duration_light@millisecond" ,
1187
+ "org_id" : 1 ,
1188
+ "project_id" : 42 ,
1189
+ "received_at" : time_after (now_timestamp ),
1190
+ "retention_days" : 90 ,
1191
+ "tags" : {"span.category" : "db" , "span.op" : "my 1st v2 span" },
1192
+ "timestamp" : expected_timestamp ,
1193
+ "type" : "d" ,
1194
+ "value" : [500.0 ],
1195
+ },
1021
1196
{
1022
1197
"org_id" : 1 ,
1023
1198
"project_id" : 42 ,
@@ -1047,6 +1222,17 @@ def test_span_ingestion(
1047
1222
"value" : [500.0 ],
1048
1223
"received_at" : time_after (now_timestamp ),
1049
1224
},
1225
+ {
1226
+ "org_id" : 1 ,
1227
+ "project_id" : 42 ,
1228
+ "name" : "d:spans/exclusive_time@millisecond" ,
1229
+ "retention_days" : 90 ,
1230
+ "tags" : {"span.category" : "db" , "span.op" : "my 1st v2 span" },
1231
+ "timestamp" : expected_timestamp ,
1232
+ "type" : "d" ,
1233
+ "value" : [500.0 ],
1234
+ "received_at" : time_after (now_timestamp ),
1235
+ },
1050
1236
{
1051
1237
"org_id" : 1 ,
1052
1238
"project_id" : 42 ,
@@ -1109,6 +1295,17 @@ def test_span_ingestion(
1109
1295
"value" : [500.0 ],
1110
1296
"received_at" : time_after (now_timestamp ),
1111
1297
},
1298
+ {
1299
+ "name" : "d:spans/exclusive_time_light@millisecond" ,
1300
+ "org_id" : 1 ,
1301
+ "project_id" : 42 ,
1302
+ "retention_days" : 90 ,
1303
+ "tags" : {"span.category" : "db" , "span.op" : "my 1st v2 span" },
1304
+ "timestamp" : expected_timestamp ,
1305
+ "type" : "d" ,
1306
+ "value" : [500.0 ],
1307
+ "received_at" : time_after (now_timestamp ),
1308
+ },
1112
1309
{
1113
1310
"name" : "d:spans/webvital.score.total@ratio" ,
1114
1311
"org_id" : 1 ,
0 commit comments