1
1
import { expect } from '@playwright/test' ;
2
2
import type { Event } from '@sentry/types' ;
3
3
import { sentryTest } from '../../../../utils/fixtures' ;
4
+ import type { EventAndTraceHeader } from '../../../../utils/helpers' ;
4
5
import {
6
+ eventAndTraceHeaderRequestParser ,
5
7
getFirstSentryEnvelopeRequest ,
6
8
getMultipleSentryEnvelopeRequests ,
7
9
shouldSkipTracingTest ,
@@ -14,12 +16,21 @@ sentryTest('creates a new trace on each navigation', async ({ getLocalTestPath,
14
16
15
17
const url = await getLocalTestPath ( { testDir : __dirname } ) ;
16
18
17
- await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
18
- const navigationEvent1 = await getFirstSentryEnvelopeRequest < Event > ( page , `${ url } #foo` ) ;
19
- const navigationEvent2 = await getFirstSentryEnvelopeRequest < Event > ( page , `${ url } #bar` ) ;
19
+ await getFirstSentryEnvelopeRequest ( page , url ) ;
20
+
21
+ const [ navigation1Event , navigation1TraceHeader ] = await getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
22
+ page ,
23
+ `${ url } #foo` ,
24
+ eventAndTraceHeaderRequestParser ,
25
+ ) ;
26
+ const [ navigation2Event , navigation2TraceHeader ] = await getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
27
+ page ,
28
+ `${ url } #bar` ,
29
+ eventAndTraceHeaderRequestParser ,
30
+ ) ;
20
31
21
- const navigation1TraceContext = navigationEvent1 . contexts ?. trace ;
22
- const navigation2TraceContext = navigationEvent2 . contexts ?. trace ;
32
+ const navigation1TraceContext = navigation1Event . contexts ?. trace ;
33
+ const navigation2TraceContext = navigation2Event . contexts ?. trace ;
23
34
24
35
expect ( navigation1TraceContext ) . toMatchObject ( {
25
36
op : 'navigation' ,
@@ -28,13 +39,29 @@ sentryTest('creates a new trace on each navigation', async ({ getLocalTestPath,
28
39
} ) ;
29
40
expect ( navigation1TraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
30
41
42
+ expect ( navigation1TraceHeader ) . toEqual ( {
43
+ environment : 'production' ,
44
+ public_key : 'public' ,
45
+ sample_rate : '1' ,
46
+ sampled : 'true' ,
47
+ trace_id : navigation1TraceContext ?. trace_id ,
48
+ } ) ;
49
+
31
50
expect ( navigation2TraceContext ) . toMatchObject ( {
32
51
op : 'navigation' ,
33
52
trace_id : expect . stringMatching ( / ^ [ 0 - 9 a - f ] { 32 } $ / ) ,
34
53
span_id : expect . stringMatching ( / ^ [ 0 - 9 a - f ] { 16 } $ / ) ,
35
54
} ) ;
36
55
expect ( navigation2TraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
37
56
57
+ expect ( navigation2TraceHeader ) . toEqual ( {
58
+ environment : 'production' ,
59
+ public_key : 'public' ,
60
+ sample_rate : '1' ,
61
+ sampled : 'true' ,
62
+ trace_id : navigation2TraceContext ?. trace_id ,
63
+ } ) ;
64
+
38
65
expect ( navigation1TraceContext ?. trace_id ) . not . toEqual ( navigation2TraceContext ?. trace_id ) ;
39
66
} ) ;
40
67
@@ -48,7 +75,11 @@ sentryTest('error after navigation has navigation traceId', async ({ getLocalTes
48
75
// ensure pageload transaction is finished
49
76
await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
50
77
51
- const navigationEvent = await getFirstSentryEnvelopeRequest < Event > ( page , `${ url } #foo` ) ;
78
+ const [ navigationEvent , navigationTraceHeader ] = await getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
79
+ page ,
80
+ `${ url } #foo` ,
81
+ eventAndTraceHeaderRequestParser ,
82
+ ) ;
52
83
const navigationTraceContext = navigationEvent . contexts ?. trace ;
53
84
54
85
expect ( navigationTraceContext ) . toMatchObject ( {
@@ -58,15 +89,34 @@ sentryTest('error after navigation has navigation traceId', async ({ getLocalTes
58
89
} ) ;
59
90
expect ( navigationTraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
60
91
61
- const errorEventPromise = getFirstSentryEnvelopeRequest < Event > ( page ) ;
92
+ expect ( navigationTraceHeader ) . toEqual ( {
93
+ environment : 'production' ,
94
+ public_key : 'public' ,
95
+ sample_rate : '1' ,
96
+ sampled : 'true' ,
97
+ trace_id : navigationTraceContext ?. trace_id ,
98
+ } ) ;
99
+
100
+ const errorEventPromise = getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
101
+ page ,
102
+ undefined ,
103
+ eventAndTraceHeaderRequestParser ,
104
+ ) ;
62
105
await page . locator ( '#errorBtn' ) . click ( ) ;
63
- const errorEvent = await errorEventPromise ;
106
+ const [ errorEvent , errorTraceHeader ] = await errorEventPromise ;
64
107
65
108
const errorTraceContext = errorEvent . contexts ?. trace ;
66
109
expect ( errorTraceContext ) . toEqual ( {
67
110
trace_id : navigationTraceContext ?. trace_id ,
68
111
span_id : expect . stringMatching ( / ^ [ 0 - 9 a - f ] { 16 } $ / ) ,
69
112
} ) ;
113
+ expect ( errorTraceHeader ) . toEqual ( {
114
+ environment : 'production' ,
115
+ public_key : 'public' ,
116
+ sample_rate : '1' ,
117
+ sampled : 'true' ,
118
+ trace_id : navigationTraceContext ?. trace_id ,
119
+ } ) ;
70
120
} ) ;
71
121
72
122
sentryTest ( 'error during navigation has new navigation traceId' , async ( { getLocalTestPath, page } ) => {
@@ -79,13 +129,19 @@ sentryTest('error during navigation has new navigation traceId', async ({ getLoc
79
129
// ensure navigation transaction is finished
80
130
await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
81
131
82
- const envelopeRequestsPromise = getMultipleSentryEnvelopeRequests < Event > ( page , 2 ) ;
132
+ const envelopeRequestsPromise = getMultipleSentryEnvelopeRequests < EventAndTraceHeader > (
133
+ page ,
134
+ 2 ,
135
+ undefined ,
136
+ eventAndTraceHeaderRequestParser ,
137
+ ) ;
138
+
83
139
await page . goto ( `${ url } #foo` ) ;
84
140
await page . locator ( '#errorBtn' ) . click ( ) ;
85
- const events = await envelopeRequestsPromise ;
141
+ const envelopes = await envelopeRequestsPromise ;
86
142
87
- const navigationEvent = events . find ( event => event . type === 'transaction' ) ;
88
- const errorEvent = events . find ( event => ! event . type ) ;
143
+ const [ navigationEvent , navigationTraceHeader ] = envelopes . find ( envelope => envelope [ 0 ] . type === 'transaction' ) ! ;
144
+ const [ errorEvent , errorTraceHeader ] = envelopes . find ( envelope => ! envelope [ 0 ] . type ) ! ;
89
145
90
146
const navigationTraceContext = navigationEvent ?. contexts ?. trace ;
91
147
expect ( navigationTraceContext ) . toMatchObject ( {
@@ -95,12 +151,28 @@ sentryTest('error during navigation has new navigation traceId', async ({ getLoc
95
151
} ) ;
96
152
expect ( navigationTraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
97
153
154
+ expect ( navigationTraceHeader ) . toEqual ( {
155
+ environment : 'production' ,
156
+ public_key : 'public' ,
157
+ sample_rate : '1' ,
158
+ sampled : 'true' ,
159
+ trace_id : navigationTraceContext ?. trace_id ,
160
+ } ) ;
161
+
98
162
const errorTraceContext = errorEvent ?. contexts ?. trace ;
99
163
expect ( errorTraceContext ) . toMatchObject ( {
100
164
op : 'navigation' ,
101
- trace_id : errorTraceContext ?. trace_id ,
165
+ trace_id : navigationTraceContext ?. trace_id ,
102
166
span_id : expect . stringMatching ( / ^ [ 0 - 9 a - f ] { 16 } $ / ) ,
103
167
} ) ;
168
+
169
+ expect ( errorTraceHeader ) . toEqual ( {
170
+ environment : 'production' ,
171
+ public_key : 'public' ,
172
+ sample_rate : '1' ,
173
+ sampled : 'true' ,
174
+ trace_id : navigationTraceContext ?. trace_id ,
175
+ } ) ;
104
176
} ) ;
105
177
106
178
sentryTest (
@@ -115,7 +187,11 @@ sentryTest(
115
187
// ensure navigation transaction is finished
116
188
await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
117
189
118
- const navigationEvent = await getFirstSentryEnvelopeRequest < Event > ( page , `${ url } #foo` ) ;
190
+ const [ navigationEvent , navigationTraceHeader ] = await getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
191
+ page ,
192
+ `${ url } #foo` ,
193
+ eventAndTraceHeaderRequestParser ,
194
+ ) ;
119
195
120
196
const navigationTraceContext = navigationEvent . contexts ?. trace ;
121
197
expect ( navigationTraceContext ) . toMatchObject ( {
@@ -125,6 +201,14 @@ sentryTest(
125
201
} ) ;
126
202
expect ( navigationTraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
127
203
204
+ expect ( navigationTraceHeader ) . toEqual ( {
205
+ environment : 'production' ,
206
+ public_key : 'public' ,
207
+ sample_rate : '1' ,
208
+ sampled : 'true' ,
209
+ trace_id : navigationTraceContext ?. trace_id ,
210
+ } ) ;
211
+
128
212
const requestPromise = page . waitForRequest ( 'http://example.com/*' ) ;
129
213
await page . locator ( '#fetchBtn' ) . click ( ) ;
130
214
const request = await requestPromise ;
@@ -151,11 +235,18 @@ sentryTest(
151
235
// ensure navigation transaction is finished
152
236
await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
153
237
154
- const navigationEventPromise = getFirstSentryEnvelopeRequest < Event > ( page ) ;
238
+ const navigationEventPromise = getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
239
+ page ,
240
+ undefined ,
241
+ eventAndTraceHeaderRequestParser ,
242
+ ) ;
155
243
const requestPromise = page . waitForRequest ( 'http://example.com/*' ) ;
156
244
await page . goto ( `${ url } #foo` ) ;
157
245
await page . locator ( '#fetchBtn' ) . click ( ) ;
158
- const [ navigationEvent , request ] = await Promise . all ( [ navigationEventPromise , requestPromise ] ) ;
246
+ const [ [ navigationEvent , navigationTraceHeader ] , request ] = await Promise . all ( [
247
+ navigationEventPromise ,
248
+ requestPromise ,
249
+ ] ) ;
159
250
160
251
const navigationTraceContext = navigationEvent . contexts ?. trace ;
161
252
expect ( navigationTraceContext ) . toMatchObject ( {
@@ -165,6 +256,14 @@ sentryTest(
165
256
} ) ;
166
257
expect ( navigationTraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
167
258
259
+ expect ( navigationTraceHeader ) . toEqual ( {
260
+ environment : 'production' ,
261
+ public_key : 'public' ,
262
+ sample_rate : '1' ,
263
+ sampled : 'true' ,
264
+ trace_id : navigationTraceContext ?. trace_id ,
265
+ } ) ;
266
+
168
267
const headers = request . headers ( ) ;
169
268
170
269
// sampling decision is propagated from active span sampling decision
@@ -186,9 +285,13 @@ sentryTest(
186
285
const url = await getLocalTestPath ( { testDir : __dirname } ) ;
187
286
188
287
// ensure navigation transaction is finished
189
- await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
288
+ await getFirstSentryEnvelopeRequest ( page , url ) ;
190
289
191
- const navigationEvent = await getFirstSentryEnvelopeRequest < Event > ( page , `${ url } #foo` ) ;
290
+ const [ navigationEvent , navigationTraceHeader ] = await getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
291
+ page ,
292
+ `${ url } #foo` ,
293
+ eventAndTraceHeaderRequestParser ,
294
+ ) ;
192
295
193
296
const navigationTraceContext = navigationEvent . contexts ?. trace ;
194
297
expect ( navigationTraceContext ) . toMatchObject ( {
@@ -198,6 +301,14 @@ sentryTest(
198
301
} ) ;
199
302
expect ( navigationTraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
200
303
304
+ expect ( navigationTraceHeader ) . toEqual ( {
305
+ environment : 'production' ,
306
+ public_key : 'public' ,
307
+ sample_rate : '1' ,
308
+ sampled : 'true' ,
309
+ trace_id : navigationTraceContext ?. trace_id ,
310
+ } ) ;
311
+
201
312
const xhrPromise = page . waitForRequest ( 'http://example.com/*' ) ;
202
313
await page . locator ( '#xhrBtn' ) . click ( ) ;
203
314
const request = await xhrPromise ;
@@ -222,13 +333,20 @@ sentryTest(
222
333
const url = await getLocalTestPath ( { testDir : __dirname } ) ;
223
334
224
335
// ensure navigation transaction is finished
225
- await getFirstSentryEnvelopeRequest < Event > ( page , url ) ;
336
+ await getFirstSentryEnvelopeRequest ( page , url ) ;
226
337
227
- const navigationEventPromise = getFirstSentryEnvelopeRequest < Event > ( page ) ;
338
+ const navigationEventPromise = getFirstSentryEnvelopeRequest < EventAndTraceHeader > (
339
+ page ,
340
+ undefined ,
341
+ eventAndTraceHeaderRequestParser ,
342
+ ) ;
228
343
const requestPromise = page . waitForRequest ( 'http://example.com/*' ) ;
229
344
await page . goto ( `${ url } #foo` ) ;
230
345
await page . locator ( '#xhrBtn' ) . click ( ) ;
231
- const [ navigationEvent , request ] = await Promise . all ( [ navigationEventPromise , requestPromise ] ) ;
346
+ const [ [ navigationEvent , navigationTraceHeader ] , request ] = await Promise . all ( [
347
+ navigationEventPromise ,
348
+ requestPromise ,
349
+ ] ) ;
232
350
233
351
const navigationTraceContext = navigationEvent . contexts ?. trace ;
234
352
expect ( navigationTraceContext ) . toMatchObject ( {
@@ -237,6 +355,15 @@ sentryTest(
237
355
span_id : expect . stringMatching ( / ^ [ 0 - 9 a - f ] { 16 } $ / ) ,
238
356
} ) ;
239
357
expect ( navigationTraceContext ) . not . toHaveProperty ( 'parent_span_id' ) ;
358
+
359
+ expect ( navigationTraceHeader ) . toEqual ( {
360
+ environment : 'production' ,
361
+ public_key : 'public' ,
362
+ sample_rate : '1' ,
363
+ sampled : 'true' ,
364
+ trace_id : navigationTraceContext ?. trace_id ,
365
+ } ) ;
366
+
240
367
const headers = request . headers ( ) ;
241
368
242
369
// sampling decision is propagated from active span sampling decision
0 commit comments