@@ -33,17 +33,17 @@ test('Span nesting: h3 middleware spans are children of the srvx request span',
3333 expect ( srvxSpan ) . toBeDefined ( ) ;
3434
3535 // All h3 middleware spans should be children of the srvx span
36- const h3Spans = event . spans ?. filter ( span => span . origin === 'auto.http.nitro.h3' ) ;
37- expect ( h3Spans ?. length ) . toBeGreaterThanOrEqual ( 1 ) ;
36+ const h3MiddlewareSpans = event . spans ?. filter (
37+ span => span . origin === 'auto.http.nitro.h3' && span . op === 'middleware.nitro' ,
38+ ) ;
39+ expect ( h3MiddlewareSpans ?. length ) . toBeGreaterThanOrEqual ( 1 ) ;
3840
39- for ( const span of h3Spans ?? [ ] ) {
41+ for ( const span of h3MiddlewareSpans ?? [ ] ) {
4042 expect ( span . parent_span_id ) . toBe ( srvxSpan ! . span_id ) ;
4143 }
4244} ) ;
4345
44- test ( 'Span nesting: manual startSpan calls inside route handler are children of the srvx request span' , async ( {
45- request,
46- } ) => {
46+ test ( 'Span nesting: h3 route handler span is a child of the srvx request span' , async ( { request } ) => {
4747 const transactionEventPromise = waitForTransaction ( 'nitro-3' , event => {
4848 return event ?. transaction === 'GET /api/test-nesting' ;
4949 } ) ;
@@ -52,23 +52,42 @@ test('Span nesting: manual startSpan calls inside route handler are children of
5252
5353 const event = await transactionEventPromise ;
5454
55- // Find the srvx request span — this is the parent of all h3 and manual spans
5655 const srvxSpan = event . spans ?. find ( span => span . origin === 'auto.http.nitro.srvx' && span . op === 'http.server' ) ;
5756 expect ( srvxSpan ) . toBeDefined ( ) ;
58- const srvxSpanId = srvxSpan ! . span_id ;
57+
58+ const h3HandlerSpan = event . spans ?. find (
59+ span => span . origin === 'auto.http.nitro.h3' && span . op === 'http.server' ,
60+ ) ;
61+ expect ( h3HandlerSpan ) . toBeDefined ( ) ;
62+ expect ( h3HandlerSpan ! . parent_span_id ) . toBe ( srvxSpan ! . span_id ) ;
63+ } ) ;
64+
65+ test ( 'Span nesting: manual startSpan calls inside route handler are children of the h3 route handler span' , async ( {
66+ request,
67+ } ) => {
68+ const transactionEventPromise = waitForTransaction ( 'nitro-3' , event => {
69+ return event ?. transaction === 'GET /api/test-nesting' ;
70+ } ) ;
71+
72+ await request . get ( '/api/test-nesting' ) ;
73+
74+ const event = await transactionEventPromise ;
75+
76+ // Find the h3 route handler span
77+ const h3HandlerSpan = event . spans ?. find (
78+ span => span . origin === 'auto.http.nitro.h3' && span . op === 'http.server' ,
79+ ) ;
80+ expect ( h3HandlerSpan ) . toBeDefined ( ) ;
5981
6082 // Find the manually created db spans
6183 const dbSelectSpan = event . spans ?. find ( span => span . op === 'db' && span . description === 'db.select' ) ;
6284 const dbInsertSpan = event . spans ?. find ( span => span . op === 'db' && span . description === 'db.insert' ) ;
6385 expect ( dbSelectSpan ) . toBeDefined ( ) ;
6486 expect ( dbInsertSpan ) . toBeDefined ( ) ;
6587
66- // FIXME: Once nitro's h3 tracing plugin emits a separate span for route handlers (type: "route"),
67- // the db spans should be children of the h3 route handler span, not the srvx span directly.
68- // Currently nitro bypasses h3's ~routes for file-based routing, so h3 only emits middleware spans.
69- // Both db spans should be children of the srvx request span
70- expect ( dbSelectSpan ! . parent_span_id ) . toBe ( srvxSpanId ) ;
71- expect ( dbInsertSpan ! . parent_span_id ) . toBe ( srvxSpanId ) ;
88+ // Both db spans should be children of the h3 route handler span
89+ expect ( dbSelectSpan ! . parent_span_id ) . toBe ( h3HandlerSpan ! . span_id ) ;
90+ expect ( dbInsertSpan ! . parent_span_id ) . toBe ( h3HandlerSpan ! . span_id ) ;
7291
7392 // Both db spans should be siblings (same parent)
7493 expect ( dbSelectSpan ! . parent_span_id ) . toBe ( dbInsertSpan ! . parent_span_id ) ;
@@ -79,49 +98,6 @@ test('Span nesting: manual startSpan calls inside route handler are children of
7998 expect ( serializeSpan ! . parent_span_id ) . toBe ( dbInsertSpan ! . span_id ) ;
8099} ) ;
81100
82- // FIXME: Nitro's file-based routing bypasses h3's ~routes, so h3's tracing plugin never wraps
83- // route handlers with type: "route". Once this is fixed upstream or we add our own wrapping,
84- // uncomment these tests to verify the h3 route handler span exists and is the parent of manual spans.
85- //
86- // test('Span nesting: h3 route handler span is a child of the srvx request span', async ({ request }) => {
87- // const transactionEventPromise = waitForTransaction('nitro-3', event => {
88- // return event?.transaction === 'GET /api/test-nesting';
89- // });
90- //
91- // await request.get('/api/test-nesting');
92- //
93- // const event = await transactionEventPromise;
94- //
95- // const srvxSpan = event.spans?.find(span => span.origin === 'auto.http.nitro.srvx' && span.op === 'http.server');
96- // expect(srvxSpan).toBeDefined();
97- //
98- // const h3HandlerSpan = event.spans?.find(
99- // span => span.origin === 'auto.http.nitro.h3' && span.op === 'http.server',
100- // );
101- // expect(h3HandlerSpan).toBeDefined();
102- // expect(h3HandlerSpan!.parent_span_id).toBe(srvxSpan!.span_id);
103- // });
104- //
105- // test('Span nesting: manual startSpan calls are children of the h3 route handler span', async ({ request }) => {
106- // const transactionEventPromise = waitForTransaction('nitro-3', event => {
107- // return event?.transaction === 'GET /api/test-nesting';
108- // });
109- //
110- // await request.get('/api/test-nesting');
111- //
112- // const event = await transactionEventPromise;
113- //
114- // const h3HandlerSpan = event.spans?.find(
115- // span => span.origin === 'auto.http.nitro.h3' && span.op === 'http.server',
116- // );
117- // expect(h3HandlerSpan).toBeDefined();
118- //
119- // const dbSelectSpan = event.spans?.find(span => span.op === 'db' && span.description === 'db.select');
120- // const dbInsertSpan = event.spans?.find(span => span.op === 'db' && span.description === 'db.insert');
121- // expect(dbSelectSpan!.parent_span_id).toBe(h3HandlerSpan!.span_id);
122- // expect(dbInsertSpan!.parent_span_id).toBe(h3HandlerSpan!.span_id);
123- // });
124-
125101test ( 'Span nesting: middleware spans start before manual spans in the span tree' , async ( { request } ) => {
126102 const transactionEventPromise = waitForTransaction ( 'nitro-3' , event => {
127103 return event ?. transaction === 'GET /api/test-nesting' ;
0 commit comments