11import { expect , test } from '@playwright/test' ;
2- import { waitForError , waitForRequest , waitForTransaction } from '@sentry-internal/test-utils' ;
2+ import {
3+ getSpanOp ,
4+ waitForError ,
5+ waitForRequest ,
6+ waitForStreamedSpan ,
7+ waitForStreamedSpans ,
8+ } from '@sentry-internal/test-utils' ;
39import { SDK_VERSION } from '@sentry/cloudflare' ;
410import { WebSocket } from 'ws' ;
511
@@ -9,6 +15,22 @@ test('Index page', async ({ baseURL }) => {
915 await expect ( result . text ( ) ) . resolves . toBe ( 'Hello World!' ) ;
1016} ) ;
1117
18+ test ( 'Sends a streamed span for a basic request' , async ( { baseURL } ) => {
19+ const spanPromise = waitForStreamedSpan ( 'cloudflare-workersentrypoint' , span => {
20+ return getSpanOp ( span ) === 'http.server' && span . is_segment ;
21+ } ) ;
22+
23+ await fetch ( baseURL ! ) ;
24+
25+ const span = await spanPromise ;
26+
27+ // The root path is a low-cardinality route, so the span keeps the full `GET /` name under streaming.
28+ expect ( span . name ) . toBe ( 'GET /' ) ;
29+ expect ( span . trace_id ) . toMatch ( / [ a - f 0 - 9 ] { 32 } / ) ;
30+ expect ( span . status ) . toBe ( 'ok' ) ;
31+ expect ( span . attributes [ 'sentry.segment.name.source' ] ?. value ) . toBe ( 'route' ) ;
32+ } ) ;
33+
1234test ( "worker's withSentry" , async ( { baseURL } ) => {
1335 const eventWaiter = waitForError ( 'cloudflare-workersentrypoint' , event => {
1436 return event . exception ?. values ?. [ 0 ] ?. mechanism ?. type === 'auto.http.cloudflare' ;
@@ -83,19 +105,18 @@ test('sends user-agent header with SDK name and version in envelope requests', a
83105 } ) ;
84106} ) ;
85107
86- test ( 'Storage operations create spans in Durable Object transactions ' , async ( { baseURL } ) => {
87- const transactionWaiter = waitForTransaction ( 'cloudflare-workersentrypoint' , event => {
88- return event . spans ? .some ( span => span . op === 'db ' && span . description === 'durable_object_storage_put' ) ?? false ;
108+ test ( 'Storage operations create spans in Durable Object' , async ( { baseURL } ) => {
109+ const spansPromise = waitForStreamedSpans ( 'cloudflare-workersentrypoint' , spans => {
110+ return spans . some ( span => span . name === 'durable_object_storage_put ' && getSpanOp ( span ) === 'db' ) ;
89111 } ) ;
90112
91113 const response = await fetch ( `${ baseURL } /pass-to-object/storage/put` ) ;
92114 expect ( response . status ) . toBe ( 200 ) ;
93115
94- const transaction = await transactionWaiter ;
95- const putSpan = transaction . spans ? .find ( span => span . description === 'durable_object_storage_put' ) ;
116+ const spans = await spansPromise ;
117+ const putSpan = spans . find ( span => span . name === 'durable_object_storage_put' && getSpanOp ( span ) === 'db ') ;
96118
97119 expect ( putSpan ) . toBeDefined ( ) ;
98- expect ( putSpan ?. op ) . toBe ( 'db' ) ;
99- expect ( putSpan ?. data ?. [ 'db.system.name' ] ) . toBe ( 'cloudflare.durable_object.storage' ) ;
100- expect ( putSpan ?. data ?. [ 'db.operation.name' ] ) . toBe ( 'put' ) ;
120+ expect ( putSpan ?. attributes [ 'db.system.name' ] ?. value ) . toBe ( 'cloudflare.durable_object.storage' ) ;
121+ expect ( putSpan ?. attributes [ 'db.operation.name' ] ?. value ) . toBe ( 'put' ) ;
101122} ) ;
0 commit comments