@@ -66,4 +66,70 @@ test.describe('distributed tracing', () => {
66
66
expect ( clientTxnEvent . contexts ?. trace ?. parent_span_id ) . toBe ( serverTxnEvent . contexts ?. trace ?. span_id ) ;
67
67
expect ( serverTxnEvent . contexts ?. trace ?. trace_id ) . toBe ( metaTraceId ) ;
68
68
} ) ;
69
+
70
+ test ( 'capture a distributed server request with parametrization' , async ( { page } ) => {
71
+ const clientTxnEventPromise = waitForTransaction ( 'nuxt-4' , txnEvent => {
72
+ return txnEvent . transaction === '/test-param/:param()' ;
73
+ } ) ;
74
+
75
+ const ssrTxnEventPromise = waitForTransaction ( 'nuxt-4' , txnEvent => {
76
+ return txnEvent . transaction . includes ( 'GET /test-param/' ) ;
77
+ } ) ;
78
+
79
+ const serverReqTxnEventPromise = waitForTransaction ( 'nuxt-4' , txnEvent => {
80
+ return txnEvent . transaction . includes ( 'GET /api/test-param/' ) ;
81
+ } ) ;
82
+
83
+ const [ , clientTxnEvent , ssrTxnEvent , , , serverReqTxnEvent ] = await Promise . all ( [
84
+ page . goto ( `/test-param/${ PARAM } ` ) ,
85
+ clientTxnEventPromise ,
86
+ ssrTxnEventPromise ,
87
+ expect ( page . getByText ( `Param: ${ PARAM } ` ) ) . toBeVisible ( ) ,
88
+ page . getByText ( 'Fetch Server Data' , { exact : true } ) . click ( ) ,
89
+ serverReqTxnEventPromise ,
90
+ ] ) ;
91
+
92
+ const httpClientSpan = clientTxnEvent ?. spans ?. find ( span => span . description === `GET /api/test-param/${ PARAM } ` ) ;
93
+
94
+ expect ( ssrTxnEvent ) . toMatchObject ( {
95
+ transaction : `GET /test-param/${ PARAM } ` , // todo: parametrize (nitro)
96
+ transaction_info : { source : 'url' } ,
97
+ type : 'transaction' ,
98
+ contexts : {
99
+ trace : {
100
+ op : 'http.server' ,
101
+ origin : 'auto.http.otel.http' ,
102
+ } ,
103
+ } ,
104
+ } ) ;
105
+
106
+ expect ( httpClientSpan ) . toMatchObject ( {
107
+ description : `GET /api/test-param/${ PARAM } ` , // todo: parametrize (nitro)
108
+ parent_span_id : clientTxnEvent . contexts ?. trace ?. span_id , // pageload span is parent
109
+ data : expect . objectContaining ( {
110
+ 'sentry.op' : 'http.client' ,
111
+ 'sentry.origin' : 'auto.http.browser' ,
112
+ 'http.request_method' : 'GET' ,
113
+ } ) ,
114
+ } ) ;
115
+
116
+ expect ( serverReqTxnEvent ) . toMatchObject ( {
117
+ transaction : `GET /api/test-param/${ PARAM } ` , // todo: parametrize (nitro)
118
+ transaction_info : { source : 'url' } ,
119
+ type : 'transaction' ,
120
+ contexts : {
121
+ trace : {
122
+ op : 'http.server' ,
123
+ origin : 'auto.http.otel.http' ,
124
+ parent_span_id : httpClientSpan ?. span_id , // http.client span is parent
125
+ } ,
126
+ } ,
127
+ } ) ;
128
+
129
+ // All share the same trace_id
130
+ expect ( clientTxnEvent . contexts ?. trace ?. trace_id ) . toBeDefined ( ) ;
131
+ expect ( clientTxnEvent . contexts ?. trace ?. trace_id ) . toBe ( httpClientSpan ?. trace_id ) ;
132
+ expect ( clientTxnEvent . contexts ?. trace ?. trace_id ) . toBe ( ssrTxnEvent . contexts ?. trace ?. trace_id ) ;
133
+ expect ( clientTxnEvent . contexts ?. trace ?. trace_id ) . toBe ( serverReqTxnEvent . contexts ?. trace ?. trace_id ) ;
134
+ } ) ;
69
135
} ) ;
0 commit comments