diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-express/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-express/test.ts index 8e4072305e2f..7fb2aafd0bf6 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-express/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-express/test.ts @@ -46,8 +46,8 @@ Deno.test('express instrumentation: orchestrion:express:handle channel produces "'parent' transaction", ); - const expressSpan = parent.spans?.find(s => s.op === 'middleware.express'); - assertExists(expressSpan, `expected a middleware.express span, got ops: ${parent.spans?.map(s => s.op).join(', ')}`); + const expressSpan = parent.spans?.find(s => s.op === 'middleware'); + assertExists(expressSpan, `expected an express middleware span, got ops: ${parent.spans?.map(s => s.op).join(', ')}`); assertEquals(expressSpan!.description, 'myMiddleware'); assertEquals(expressSpan!.data?.['express.name'], 'myMiddleware'); assertEquals(expressSpan!.data?.['express.type'], 'middleware'); diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-koa/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-koa/test.ts index ae52b8997897..e084e4cd136a 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-koa/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-koa/test.ts @@ -44,8 +44,8 @@ Deno.test('koa instrumentation: orchestrion:koa:use channel wraps middleware int "'parent' transaction", ); - const koaSpan = parent.spans?.find(s => s.op === 'middleware.koa'); - assertExists(koaSpan, `expected a middleware.koa child span, got ops: ${parent.spans?.map(s => s.op).join(', ')}`); + const koaSpan = parent.spans?.find(s => s.op === 'middleware'); + assertExists(koaSpan, `expected a koa middleware child span, got ops: ${parent.spans?.map(s => s.op).join(', ')}`); assertEquals(koaSpan!.description, 'myMiddleware'); assertEquals(koaSpan!.data?.['sentry.origin'], 'auto.http.koa'); }); diff --git a/dev-packages/e2e-tests/test-applications/elysia-bun/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/elysia-bun/tests/transactions.test.ts index b0b21fb9227f..fd51305e733a 100644 --- a/dev-packages/e2e-tests/test-applications/elysia-bun/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/elysia-bun/tests/transactions.test.ts @@ -181,7 +181,7 @@ test('Creates lifecycle spans for route-specific middleware', async ({ baseURL, expect(spans).toContainEqual( expect.objectContaining({ description: 'BeforeHandle', - op: 'middleware.elysia', + op: 'middleware', origin: 'auto.http.elysia', }), ); diff --git a/dev-packages/e2e-tests/test-applications/elysia-node/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/elysia-node/tests/transactions.test.ts index 941341c3422a..a5949b507dfa 100644 --- a/dev-packages/e2e-tests/test-applications/elysia-node/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/elysia-node/tests/transactions.test.ts @@ -181,7 +181,7 @@ test('Creates lifecycle spans for route-specific middleware', async ({ baseURL, expect(spans).toContainEqual( expect.objectContaining({ description: 'BeforeHandle', - op: 'middleware.elysia', + op: 'middleware', origin: 'auto.http.elysia', }), ); diff --git a/dev-packages/e2e-tests/test-applications/hono-4/tests/basepath-and-late-routes.test.ts b/dev-packages/e2e-tests/test-applications/hono-4/tests/basepath-and-late-routes.test.ts index 03a97816c9c5..c22897c4a349 100644 --- a/dev-packages/e2e-tests/test-applications/hono-4/tests/basepath-and-late-routes.test.ts +++ b/dev-packages/e2e-tests/test-applications/hono-4/tests/basepath-and-late-routes.test.ts @@ -55,7 +55,7 @@ test.skip('.basePath() middleware instrumentation', () => { const spans = transaction.spans || []; const middlewareSpan = spans.find( (span: { description?: string; op?: string }) => - span.op === 'middleware.hono' && span.description === 'basepathMiddleware', + span.op === 'middleware' && span.description === 'basepathMiddleware', ); expect(middlewareSpan).toBeDefined(); diff --git a/dev-packages/e2e-tests/test-applications/hono-4/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/hono-4/tests/errors.test.ts index fbe758c708a9..a157de5bd896 100644 --- a/dev-packages/e2e-tests/test-applications/hono-4/tests/errors.test.ts +++ b/dev-packages/e2e-tests/test-applications/hono-4/tests/errors.test.ts @@ -151,7 +151,7 @@ test.describe('middleware errors', () => { expect(errorEvent.transaction).toBe('GET /test-errors/middleware-http-exception'); const transaction = await transactionPromise; - const middlewareSpan = (transaction.spans || []).find(s => s.op === 'middleware.hono'); + const middlewareSpan = (transaction.spans || []).find(s => s.op === 'middleware'); expect(middlewareSpan?.status).toBe('internal_error'); }); @@ -187,7 +187,7 @@ test.describe('middleware errors', () => { if (RUNTIME === 'cloudflare') { expect(transaction.transaction).toBe('GET /test-errors/middleware-http-exception-4xx'); - const middlewareSpan = (transaction.spans || []).find(s => s.op === 'middleware.hono'); + const middlewareSpan = (transaction.spans || []).find(s => s.op === 'middleware'); expect(middlewareSpan?.status).not.toBe('internal_error'); } diff --git a/dev-packages/e2e-tests/test-applications/hono-4/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/hono-4/tests/middleware.test.ts index 0ef039000c9a..a68d347a597a 100644 --- a/dev-packages/e2e-tests/test-applications/hono-4/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/hono-4/tests/middleware.test.ts @@ -30,14 +30,13 @@ for (const { name, prefix } of SCENARIOS) { const spans = transaction.spans || []; const middlewareSpan = spans.find( - (span: { description?: string; op?: string }) => - span.op === 'middleware.hono' && span.description === 'middlewareA', + (span: { description?: string; op?: string }) => span.op === 'middleware' && span.description === 'middlewareA', ); expect(middlewareSpan).toEqual( expect.objectContaining({ description: 'middlewareA', - op: 'middleware.hono', + op: 'middleware', origin: 'auto.middleware.hono', }), ); @@ -62,8 +61,7 @@ for (const { name, prefix } of SCENARIOS) { const spans = transaction.spans || []; const anonymousSpan = spans.find( - (span: { description?: string; op?: string }) => - span.op === 'middleware.hono' && span.description === '', + (span: { description?: string; op?: string }) => span.op === 'middleware' && span.description === '', ); expect(anonymousSpan).toBeDefined(); expect(anonymousSpan?.origin).toBe('auto.middleware.hono'); @@ -133,9 +131,7 @@ for (const { name, prefix } of SCENARIOS) { const spans = transaction.spans || []; - const failingSpan = spans.find( - (span: SpanJSON) => span.op === 'middleware.hono' && span.status === 'internal_error', - ); + const failingSpan = spans.find((span: SpanJSON) => span.op === 'middleware' && span.status === 'internal_error'); expect(failingSpan).toBeDefined(); expect(failingSpan?.status).toBe('internal_error'); @@ -154,8 +150,7 @@ for (const { name, prefix } of SCENARIOS) { const spans = transaction.spans || []; const middlewareSpan = spans.find( - (span: { description?: string; op?: string }) => - span.op === 'middleware.hono' && span.description === 'middlewareA', + (span: { description?: string; op?: string }) => span.op === 'middleware' && span.description === 'middlewareA', ); expect(middlewareSpan).toBeDefined(); }); @@ -241,7 +236,7 @@ test.describe('inline middleware spans (sub-app)', () => { const inlineSpan = (transaction.spans || []).find(s => s.description === expectedDescription); expect(inlineSpan).toBeDefined(); - expect(inlineSpan?.op).toBe('middleware.hono'); + expect(inlineSpan?.op).toBe('middleware'); expect(inlineSpan?.origin).toBe('auto.middleware.hono'); expect(inlineSpan?.status).not.toBe('internal_error'); }); @@ -276,11 +271,11 @@ test.describe('inline middleware spans (main app)', () => { const inlineSpan = spans.find(s => s.description === expectedMiddlewareName); expect(inlineSpan).toBeDefined(); - expect(inlineSpan?.op).toBe('middleware.hono'); + expect(inlineSpan?.op).toBe('middleware'); expect(inlineSpan?.origin).toBe('auto.middleware.hono'); expect(inlineSpan?.status).not.toBe('internal_error'); - const middlewareSpans = spans.filter(s => s.op === 'middleware.hono'); + const middlewareSpans = spans.filter(s => s.op === 'middleware'); expect(middlewareSpans).toHaveLength(1); }); }); @@ -299,18 +294,18 @@ test.describe('inline middleware spans (main app)', () => { expect(transaction.transaction).toBe(`GET ${fullPath}`); const spans = transaction.spans || []; - const middlewareSpans = spans.filter(s => s.op === 'middleware.hono'); + const middlewareSpans = spans.filter(s => s.op === 'middleware'); expect(middlewareSpans).toHaveLength(2); const [spanA, spanB] = middlewareSpans.sort((a, b) => (a.description ?? '').localeCompare(b.description ?? '')); expect(spanA?.description).toBe('combinedInlineMw'); - expect(spanA?.op).toBe('middleware.hono'); + expect(spanA?.op).toBe('middleware'); expect(spanA?.origin).toBe('auto.middleware.hono'); expect(spanA?.status).not.toBe('internal_error'); expect(spanB?.description).toBe('middlewareA'); - expect(spanB?.op).toBe('middleware.hono'); + expect(spanB?.op).toBe('middleware'); expect(spanB?.origin).toBe('auto.middleware.hono'); expect(spanB?.status).not.toBe('internal_error'); }); diff --git a/dev-packages/e2e-tests/test-applications/hono-4/tests/multi-fetch.test.ts b/dev-packages/e2e-tests/test-applications/hono-4/tests/multi-fetch.test.ts index 3fde49185424..da369c1c6c31 100644 --- a/dev-packages/e2e-tests/test-applications/hono-4/tests/multi-fetch.test.ts +++ b/dev-packages/e2e-tests/test-applications/hono-4/tests/multi-fetch.test.ts @@ -48,13 +48,13 @@ test.describe('multi-fetch: internal .request() calls between sub-apps', () => { const middlewareSpan = spans.find( (span: { description?: string; op?: string }) => - span.op === 'middleware.hono' && span.description === 'storefrontAuth', + span.op === 'middleware' && span.description === 'storefrontAuth', ); expect(middlewareSpan).toEqual( expect.objectContaining({ description: 'storefrontAuth', - op: 'middleware.hono', + op: 'middleware', origin: 'auto.middleware.hono', }), ); diff --git a/dev-packages/e2e-tests/test-applications/hono-4/tests/route-patterns.test.ts b/dev-packages/e2e-tests/test-applications/hono-4/tests/route-patterns.test.ts index 6cd48dfac68c..6bb9b81b4d74 100644 --- a/dev-packages/e2e-tests/test-applications/hono-4/tests/route-patterns.test.ts +++ b/dev-packages/e2e-tests/test-applications/hono-4/tests/route-patterns.test.ts @@ -26,7 +26,7 @@ test.describe('HTTP methods', () => { expect(transaction.contexts?.trace?.data?.['sentry.source']).toBe('route'); const spans = transaction.spans || []; - const middlewareSpans = spans.filter(s => s.op === 'middleware.hono'); + const middlewareSpans = spans.filter(s => s.op === 'middleware'); expect(middlewareSpans).toEqual([]); }); }); @@ -48,7 +48,7 @@ test.describe('route registration styles', () => { expect(transaction.contexts?.trace?.data?.['sentry.source']).toBe('route'); const spans = transaction.spans || []; - const middlewareSpans = spans.filter(s => s.op === 'middleware.hono'); + const middlewareSpans = spans.filter(s => s.op === 'middleware'); expect(middlewareSpans).toEqual([]); }); }); @@ -70,7 +70,7 @@ test.describe('route registration styles', () => { expect(transaction.contexts?.trace?.data?.['sentry.source']).toBe('route'); const spans = transaction.spans || []; - const middlewareSpans = spans.filter(s => s.op === 'middleware.hono'); + const middlewareSpans = spans.filter(s => s.op === 'middleware'); expect(middlewareSpans).toEqual([]); }); }); @@ -142,6 +142,6 @@ test('async handler sends transaction', async ({ baseURL }) => { expect(transaction.contexts?.trace?.data?.['sentry.source']).toBe('route'); const spans = transaction.spans || []; - const middlewareSpans = spans.filter(s => s.op === 'middleware.hono'); + const middlewareSpans = spans.filter(s => s.op === 'middleware'); expect(middlewareSpans).toEqual([]); }); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-11/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-11/tests/transactions.test.ts index f6fcce730296..88dc03adecc8 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-11/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-11/tests/transactions.test.ts @@ -151,7 +151,7 @@ test('API route transaction includes nest middleware span. Spans created in and span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs', }, description: 'ExampleMiddleware', @@ -159,7 +159,7 @@ test('API route transaction includes nest middleware span. Spans created in and start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs', }, ]), @@ -231,7 +231,7 @@ test('API route transaction includes nest guard span and span started in guard i span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.guard', }, description: 'ExampleGuard', @@ -239,7 +239,7 @@ test('API route transaction includes nest guard span and span started in guard i start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.guard', }, ]), @@ -295,7 +295,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -303,7 +303,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -332,7 +332,7 @@ test('API route transaction includes nest pipe span for invalid request', async span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -340,7 +340,7 @@ test('API route transaction includes nest pipe span for invalid request', async start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'internal_error', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -371,7 +371,7 @@ test('API route transaction includes nest interceptor spans before route executi span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor1', @@ -379,14 +379,14 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor2', @@ -394,7 +394,7 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -489,7 +489,7 @@ test('API route transaction includes exactly one nest interceptor span after rou span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -497,7 +497,7 @@ test('API route transaction includes exactly one nest interceptor span after rou start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -571,7 +571,7 @@ test('API route transaction includes nest async interceptor spans before route e span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'AsyncInterceptor', @@ -579,7 +579,7 @@ test('API route transaction includes nest async interceptor spans before route e start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -656,7 +656,7 @@ test('API route transaction includes exactly one nest async interceptor span aft span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -664,7 +664,7 @@ test('API route transaction includes exactly one nest async interceptor span aft start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), diff --git a/dev-packages/e2e-tests/test-applications/nestjs-8/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-8/tests/transactions.test.ts index d3004503544c..b606ef7eed53 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-8/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-8/tests/transactions.test.ts @@ -155,7 +155,7 @@ test('API route transaction includes nest middleware span. Spans created in and span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs', }, description: 'ExampleMiddleware', @@ -163,7 +163,7 @@ test('API route transaction includes nest middleware span. Spans created in and start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs', }, ]), @@ -235,7 +235,7 @@ test('API route transaction includes nest guard span and span started in guard i span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.guard', }, description: 'ExampleGuard', @@ -243,7 +243,7 @@ test('API route transaction includes nest guard span and span started in guard i start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.guard', }, ]), @@ -299,7 +299,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -307,7 +307,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -336,7 +336,7 @@ test('API route transaction includes nest pipe span for invalid request', async span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -344,7 +344,7 @@ test('API route transaction includes nest pipe span for invalid request', async start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'internal_error', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -375,7 +375,7 @@ test('API route transaction includes nest interceptor spans before route executi span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor1', @@ -383,14 +383,14 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor2', @@ -398,7 +398,7 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -493,7 +493,7 @@ test('API route transaction includes exactly one nest interceptor span after rou span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -501,7 +501,7 @@ test('API route transaction includes exactly one nest interceptor span after rou start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -575,7 +575,7 @@ test('API route transaction includes nest async interceptor spans before route e span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'AsyncInterceptor', @@ -583,7 +583,7 @@ test('API route transaction includes nest async interceptor spans before route e start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -660,7 +660,7 @@ test('API route transaction includes exactly one nest async interceptor span aft span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -668,7 +668,7 @@ test('API route transaction includes exactly one nest async interceptor span aft start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), diff --git a/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/transactions.test.ts index 31472452f460..66e69b630304 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/transactions.test.ts @@ -177,7 +177,7 @@ test('API route transaction includes nest middleware span. Spans created in and span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs', }, description: 'ExampleMiddleware', @@ -185,7 +185,7 @@ test('API route transaction includes nest middleware span. Spans created in and start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs', }, ]), @@ -257,7 +257,7 @@ test('API route transaction includes nest guard span and span started in guard i span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.guard', }, description: 'ExampleGuard', @@ -265,7 +265,7 @@ test('API route transaction includes nest guard span and span started in guard i start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.guard', }, ]), @@ -321,7 +321,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -329,7 +329,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -358,7 +358,7 @@ test('API route transaction includes nest pipe span for invalid request', async span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -366,7 +366,7 @@ test('API route transaction includes nest pipe span for invalid request', async start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'internal_error', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -397,7 +397,7 @@ test('API route transaction includes nest interceptor spans before route executi span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor1', @@ -405,14 +405,14 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor2', @@ -420,7 +420,7 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -515,7 +515,7 @@ test('API route transaction includes exactly one nest interceptor span after rou span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -523,7 +523,7 @@ test('API route transaction includes exactly one nest interceptor span after rou start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -597,7 +597,7 @@ test('API route transaction includes nest async interceptor spans before route e span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'AsyncInterceptor', @@ -605,7 +605,7 @@ test('API route transaction includes nest async interceptor spans before route e start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -682,7 +682,7 @@ test('API route transaction includes exactly one nest async interceptor span aft span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -690,7 +690,7 @@ test('API route transaction includes exactly one nest async interceptor span aft start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), diff --git a/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/transactions.test.ts index 2c263ea7c8ff..70c272838a4d 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/transactions.test.ts @@ -65,13 +65,13 @@ test.skip('Sends an API route transaction', async ({ baseURL }) => { trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { 'sentry.origin': 'auto.http.otel.fastify', - 'sentry.op': 'hook.fastify', + 'sentry.op': 'middleware', 'hook.name': 'fastify -> @sentry/instrumentation-fastify -> @fastify/middie - onRequest', 'fastify.type': 'hook', 'hook.callback.name': 'runMiddie', }, description: '@fastify/middie - onRequest', - op: 'hook.fastify', + op: 'middleware', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), timestamp: expect.any(Number), @@ -198,7 +198,7 @@ test('API route transaction includes nest middleware span. Spans created in and span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs', }, description: 'ExampleMiddleware', @@ -206,7 +206,7 @@ test('API route transaction includes nest middleware span. Spans created in and start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs', }, ]), @@ -278,7 +278,7 @@ test('API route transaction includes nest guard span and span started in guard i span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.guard', }, description: 'ExampleGuard', @@ -286,7 +286,7 @@ test('API route transaction includes nest guard span and span started in guard i start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.guard', }, ]), @@ -342,7 +342,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -350,7 +350,7 @@ test('API route transaction includes nest pipe span for valid request', async ({ start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -379,7 +379,7 @@ test('API route transaction includes nest pipe span for invalid request', async span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.pipe', }, description: 'ParseIntPipe', @@ -387,7 +387,7 @@ test('API route transaction includes nest pipe span for invalid request', async start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'internal_error', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.pipe', }, ]), @@ -418,7 +418,7 @@ test('API route transaction includes nest interceptor spans before route executi span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor1', @@ -426,14 +426,14 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'ExampleInterceptor2', @@ -441,7 +441,7 @@ test('API route transaction includes nest interceptor spans before route executi start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -536,7 +536,7 @@ test('API route transaction includes exactly one nest interceptor span after rou span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -544,7 +544,7 @@ test('API route transaction includes exactly one nest interceptor span after rou start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -618,7 +618,7 @@ test('API route transaction includes nest async interceptor spans before route e span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'AsyncInterceptor', @@ -626,7 +626,7 @@ test('API route transaction includes nest async interceptor spans before route e start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), @@ -703,7 +703,7 @@ test('API route transaction includes exactly one nest async interceptor span aft span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.interceptor', }, description: 'Interceptors - After Route', @@ -711,7 +711,7 @@ test('API route transaction includes exactly one nest async interceptor span aft start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.interceptor', }, ]), diff --git a/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/README.md b/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/README.md index c637516cc6fc..e0a137d517d4 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/README.md +++ b/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/README.md @@ -12,9 +12,8 @@ The tests assert the **same** span tree the OTel path produced instrumentation against that baseline: - `transactions.test.ts`: `app_creation`, `request_context`, - `handler`, and the - `middleware.nestjs[.guard|.pipe|.interceptor|.exception_filter]` - spans. + `handler`, and the `middleware` spans + (origin `auto.middleware.nestjs[.guard|.pipe|.interceptor|.exception_filter]`). - `schedule.test.ts`: `@Cron`/`@Interval`/`@Timeout` error mechanisms. - `events.test.ts`: the `@OnEvent` `event.nestjs` transaction. diff --git a/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/src/example.guard.ts b/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/src/example.guard.ts index a9069f4e6f9d..dbcd982d1f7b 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/src/example.guard.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/src/example.guard.ts @@ -5,7 +5,7 @@ import * as Sentry from '@sentry/nestjs'; export class ExampleGuard implements CanActivate { public canActivate(_context: ExecutionContext): boolean { // Child span - // should nest under the guard span (middleware.nestjs / .guard). + // should nest under the guard span (middleware op, auto.middleware.nestjs.guard origin). Sentry.startSpan({ name: 'test-guard-span' }, () => undefined); return true; } diff --git a/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/tests/transactions.test.ts index 897467c903d8..41c6c93f4e75 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-orchestrion/tests/transactions.test.ts @@ -90,13 +90,13 @@ for (const { route, origin, description } of MIDDLEWARE_CASES) { await fetch(`${baseURL}/${route}`); const transactionEvent = await transactionPromise; - const span = findSpan(transactionEvent, 'middleware.nestjs', origin); + const span = findSpan(transactionEvent, 'middleware', origin); expect(span, `expected a ${origin} span`).toBeDefined(); expect(span?.description).toBe(description); }); } -test('exception_filter span: a @Catch filter opens a middleware.nestjs span', async ({ baseURL }) => { +test('exception_filter span: a @Catch filter opens a middleware span', async ({ baseURL }) => { const transactionPromise = waitForTransaction(PROXY, transactionEvent => { return ( transactionEvent?.contexts?.trace?.op === 'http.server' && transactionEvent?.transaction === 'GET /test-exception' @@ -106,7 +106,7 @@ test('exception_filter span: a @Catch filter opens a middleware.nestjs span', as await fetch(`${baseURL}/test-exception`); const transactionEvent = await transactionPromise; - const span = findSpan(transactionEvent, 'middleware.nestjs', 'auto.middleware.nestjs.exception_filter'); + const span = findSpan(transactionEvent, 'middleware', 'auto.middleware.nestjs.exception_filter'); expect(span).toBeDefined(); expect(span?.description).toBe('ExampleExceptionFilter'); }); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-with-submodules-decorator/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-with-submodules-decorator/tests/transactions.test.ts index bfbfbf98081a..c2cec87de93b 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-with-submodules-decorator/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-with-submodules-decorator/tests/transactions.test.ts @@ -152,7 +152,7 @@ test('API route transaction includes exception filter span for global filter in span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.exception_filter', }, description: 'ExampleExceptionFilter', @@ -160,7 +160,7 @@ test('API route transaction includes exception filter span for global filter in start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.exception_filter', }, ]), @@ -191,7 +191,7 @@ test('API route transaction includes exception filter span for local filter in m span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.exception_filter', }, description: 'LocalExampleExceptionFilter', @@ -199,7 +199,7 @@ test('API route transaction includes exception filter span for local filter in m start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.exception_filter', }, ]), @@ -230,7 +230,7 @@ test('API route transaction includes exception filter span for global filter in span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.exception_filter', }, description: 'ExampleExceptionFilterRegisteredFirst', @@ -238,7 +238,7 @@ test('API route transaction includes exception filter span for global filter in start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.exception_filter', }, ]), diff --git a/dev-packages/e2e-tests/test-applications/nestjs-with-submodules/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-with-submodules/tests/transactions.test.ts index 3b1aad002241..1b6a02b747e2 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-with-submodules/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-with-submodules/tests/transactions.test.ts @@ -152,7 +152,7 @@ test('API route transaction includes exception filter span for global filter in span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.exception_filter', }, description: 'ExampleExceptionFilter', @@ -160,7 +160,7 @@ test('API route transaction includes exception filter span for global filter in start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.exception_filter', }, ]), @@ -191,7 +191,7 @@ test('API route transaction includes exception filter span for local filter in m span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.exception_filter', }, description: 'LocalExampleExceptionFilter', @@ -199,7 +199,7 @@ test('API route transaction includes exception filter span for local filter in m start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.exception_filter', }, ]), @@ -230,7 +230,7 @@ test('API route transaction includes exception filter span for global filter in span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.op': 'middleware.nestjs', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nestjs.exception_filter', }, description: 'ExampleExceptionFilterRegisteredFirst', @@ -238,7 +238,7 @@ test('API route transaction includes exception filter span for global filter in start_timestamp: expect.any(Number), timestamp: expect.any(Number), status: 'ok', - op: 'middleware.nestjs', + op: 'middleware', origin: 'auto.middleware.nestjs.exception_filter', }, ]), diff --git a/dev-packages/e2e-tests/test-applications/nitro-3/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/nitro-3/tests/middleware.test.ts index eec281d28f98..50aed0ddabe2 100644 --- a/dev-packages/e2e-tests/test-applications/nitro-3/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/nitro-3/tests/middleware.test.ts @@ -12,9 +12,9 @@ test('Creates middleware spans for requests', async ({ request }) => { const transactionEvent = await transactionEventPromise; - // h3 middleware spans have origin auto.http.nitro.h3 and op middleware.nitro + // h3 middleware spans have origin auto.http.nitro.h3 and op middleware const h3MiddlewareSpans = transactionEvent.spans?.filter( - span => span.origin === 'auto.http.nitro.h3' && span.op === 'middleware.nitro', + span => span.origin === 'auto.http.nitro.h3' && span.op === 'middleware', ); expect(h3MiddlewareSpans?.length).toBeGreaterThanOrEqual(1); }); diff --git a/dev-packages/e2e-tests/test-applications/nitro-3/tests/span-nesting.test.ts b/dev-packages/e2e-tests/test-applications/nitro-3/tests/span-nesting.test.ts index 8a824c4fe429..841566b32d74 100644 --- a/dev-packages/e2e-tests/test-applications/nitro-3/tests/span-nesting.test.ts +++ b/dev-packages/e2e-tests/test-applications/nitro-3/tests/span-nesting.test.ts @@ -34,7 +34,7 @@ test('Span nesting: h3 middleware spans are children of the srvx request span', // All h3 middleware spans should be children of the srvx span const h3MiddlewareSpans = event.spans?.filter( - span => span.origin === 'auto.http.nitro.h3' && span.op === 'middleware.nitro', + span => span.origin === 'auto.http.nitro.h3' && span.op === 'middleware', ); expect(h3MiddlewareSpans?.length).toBeGreaterThanOrEqual(1); @@ -104,7 +104,7 @@ test('Span nesting: middleware spans start before manual spans in the span tree' const event = await transactionEventPromise; // Middleware spans should start before the manual db spans - const middlewareSpans = event.spans?.filter(span => span.op === 'middleware.nitro') ?? []; + const middlewareSpans = event.spans?.filter(span => span.op === 'middleware') ?? []; const dbSpans = event.spans?.filter(span => span.op === 'db') ?? []; expect(middlewareSpans.length).toBeGreaterThanOrEqual(1); diff --git a/dev-packages/e2e-tests/test-applications/node-express-cjs-preload/tests/server.test.ts b/dev-packages/e2e-tests/test-applications/node-express-cjs-preload/tests/server.test.ts index bc6cbde21393..2e4de0e27c7a 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-cjs-preload/tests/server.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-express-cjs-preload/tests/server.test.ts @@ -65,9 +65,9 @@ test('Should record a transaction for route with parameters', async ({ request } 'express.name': 'query', 'express.type': 'middleware', 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', }, - op: 'middleware.express', + op: 'middleware', description: 'query', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -83,9 +83,9 @@ test('Should record a transaction for route with parameters', async ({ request } 'express.name': 'expressInit', 'express.type': 'middleware', 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', }, - op: 'middleware.express', + op: 'middleware', description: 'expressInit', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), diff --git a/dev-packages/e2e-tests/test-applications/node-express-esm-loader/tests/server.test.ts b/dev-packages/e2e-tests/test-applications/node-express-esm-loader/tests/server.test.ts index d51e9639696a..33468ad705c7 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-esm-loader/tests/server.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-express-esm-loader/tests/server.test.ts @@ -65,9 +65,9 @@ test('Should record a transaction for route with parameters', async ({ request } 'express.name': 'query', 'express.type': 'middleware', 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', }, - op: 'middleware.express', + op: 'middleware', description: 'query', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -83,9 +83,9 @@ test('Should record a transaction for route with parameters', async ({ request } 'express.name': 'expressInit', 'express.type': 'middleware', 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', }, - op: 'middleware.express', + op: 'middleware', description: 'expressInit', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), diff --git a/dev-packages/e2e-tests/test-applications/node-express-esm-preload/tests/server.test.ts b/dev-packages/e2e-tests/test-applications/node-express-esm-preload/tests/server.test.ts index fb089b27b5f0..45e432b9d5a7 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-esm-preload/tests/server.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-express-esm-preload/tests/server.test.ts @@ -65,9 +65,9 @@ test('Should record a transaction for route with parameters', async ({ request } 'express.name': 'query', 'express.type': 'middleware', 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', }, - op: 'middleware.express', + op: 'middleware', description: 'query', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -83,9 +83,9 @@ test('Should record a transaction for route with parameters', async ({ request } 'express.name': 'expressInit', 'express.type': 'middleware', 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', }, - op: 'middleware.express', + op: 'middleware', description: 'expressInit', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), diff --git a/dev-packages/e2e-tests/test-applications/node-express/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/node-express/tests/transactions.test.ts index 48b7cc58aed7..717d049158a1 100644 --- a/dev-packages/e2e-tests/test-applications/node-express/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-express/tests/transactions.test.ts @@ -86,12 +86,12 @@ test('Sends an API route transaction', async ({ baseURL }) => { expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'query', 'express.type': 'middleware', }, description: 'query', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -104,12 +104,12 @@ test('Sends an API route transaction', async ({ baseURL }) => { expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'expressInit', 'express.type': 'middleware', }, description: 'expressInit', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -162,12 +162,12 @@ test('Sends an API route transaction for an errored route', async ({ baseURL }) expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'query', 'express.type': 'middleware', }, description: 'query', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -180,12 +180,12 @@ test('Sends an API route transaction for an errored route', async ({ baseURL }) expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'expressInit', 'express.type': 'middleware', }, description: 'expressInit', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), diff --git a/dev-packages/e2e-tests/test-applications/node-fastify-4/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/node-fastify-4/tests/transactions.test.ts index 8c0017620628..054193da1a84 100644 --- a/dev-packages/e2e-tests/test-applications/node-fastify-4/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-fastify-4/tests/transactions.test.ts @@ -70,11 +70,11 @@ test('Sends an API route transaction', async ({ baseURL }) => { 'fastify.type': 'hook', 'hook.callback.name': 'anonymous', 'hook.name': 'fastify -> @sentry/instrumentation-fastify - onRequest', - 'sentry.op': 'hook.fastify', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.otel.fastify', }, description: '@sentry/instrumentation-fastify - onRequest', - op: 'hook.fastify', + op: 'middleware', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/node-fastify-5/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/node-fastify-5/tests/transactions.test.ts index d820e157c36e..6fafa28a162b 100644 --- a/dev-packages/e2e-tests/test-applications/node-fastify-5/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-fastify-5/tests/transactions.test.ts @@ -70,11 +70,11 @@ test('Sends an API route transaction', async ({ baseURL }) => { 'fastify.type': 'hook', 'hook.callback.name': 'anonymous', 'hook.name': 'fastify -> @sentry/instrumentation-fastify - onRequest', - 'sentry.op': 'hook.fastify', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.otel.fastify', }, description: '@sentry/instrumentation-fastify - onRequest', - op: 'hook.fastify', + op: 'middleware', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/node-koa/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/node-koa/tests/transactions.test.ts index 7509c87bf4e8..e42d821e63d3 100644 --- a/dev-packages/e2e-tests/test-applications/node-koa/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-koa/tests/transactions.test.ts @@ -67,11 +67,11 @@ test('Sends an API route transaction', async ({ baseURL }) => { 'koa.name': 'bodyParser', 'code.function.name': 'bodyParser', 'koa.type': 'middleware', - 'sentry.op': 'middleware.koa', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.koa', }, description: 'bodyParser', - op: 'middleware.koa', + op: 'middleware', origin: 'auto.http.koa', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -86,9 +86,9 @@ test('Sends an API route transaction', async ({ baseURL }) => { 'code.function.name': 'middleware', 'koa.type': 'middleware', 'sentry.origin': 'auto.http.koa', - 'sentry.op': 'middleware.koa', + 'sentry.op': 'middleware', }, - op: 'middleware.koa', + op: 'middleware', origin: 'auto.http.koa', description: 'middleware', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/middleware.test.ts index 7cb3c84e9050..0ebd88e2ed18 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-3/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/middleware.test.ts @@ -17,7 +17,7 @@ test.describe('Server Middleware Instrumentation', () => { const serverTxnEvent = await serverTxnEventPromise; // Verify that we have spans for each middleware - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // 3 simple + 3 hooks (onRequest+handler+onBeforeResponse) + 5 array hooks (2 onRequest + 1 handler + 2 onBeforeResponse) expect(middlewareSpans).toHaveLength(11); @@ -41,9 +41,9 @@ test.describe('Server Middleware Instrumentation', () => { [firstMiddlewareSpan, secondMiddlewareSpan, authMiddlewareSpan].forEach(span => { expect(span).toEqual( expect.objectContaining({ - op: 'middleware.nuxt', + op: 'middleware', data: expect.objectContaining({ - 'sentry.op': 'middleware.nuxt', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nuxt', 'sentry.source': 'custom', 'http.request.method': 'GET', @@ -76,7 +76,7 @@ test.describe('Server Middleware Instrumentation', () => { await request.get('/api/middleware-test'); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // All middleware spans should be children of the main transaction middlewareSpans.forEach(span => { @@ -103,7 +103,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the auth middleware span const authMiddlewareSpan = serverTxnEvent.spans?.find( - span => span.op === 'middleware.nuxt' && span.data?.['nuxt.middleware.name'] === '03.auth', + span => span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '03.auth', ); expect(authMiddlewareSpan).toBeDefined(); @@ -141,7 +141,7 @@ test.describe('Server Middleware Instrumentation', () => { expect(response.status()).toBe(200); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // Find spans for the hooks middleware const hooksSpans = middlewareSpans.filter(span => span.data?.['nuxt.middleware.name'] === '04.hooks'); @@ -191,7 +191,7 @@ test.describe('Server Middleware Instrumentation', () => { expect(response.status()).toBe(200); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // Find spans for the array hooks middleware const arrayHooksSpans = middlewareSpans.filter(span => span.data?.['nuxt.middleware.name'] === '05.array-hooks'); @@ -255,7 +255,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the onRequest span that should have error status const onRequestSpan = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '04.hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onRequest', ); @@ -283,7 +283,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the onBeforeResponse span that should have error status const onBeforeResponseSpan = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '04.hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onBeforeResponse', ); @@ -311,7 +311,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the second onRequest span that should have error status const onRequest1Span = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '05.array-hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onRequest' && span.data?.['nuxt.middleware.hook.index'] === 1, @@ -324,7 +324,7 @@ test.describe('Server Middleware Instrumentation', () => { // Verify the first onRequest handler still executed successfully const onRequest0Span = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '05.array-hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onRequest' && span.data?.['nuxt.middleware.hook.index'] === 0, diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-4/tests/middleware.test.ts index 005330c01fee..b24775e8db63 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-4/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/tests/middleware.test.ts @@ -17,7 +17,7 @@ test.describe('Server Middleware Instrumentation', () => { const serverTxnEvent = await serverTxnEventPromise; // Verify that we have spans for each middleware - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // 3 simple + 3 hooks (onRequest+handler+onBeforeResponse) + 5 array hooks (2 onRequest + 1 handler + 2 onBeforeResponse expect(middlewareSpans).toHaveLength(11); @@ -41,9 +41,9 @@ test.describe('Server Middleware Instrumentation', () => { [firstMiddlewareSpan, secondMiddlewareSpan, authMiddlewareSpan].forEach(span => { expect(span).toEqual( expect.objectContaining({ - op: 'middleware.nuxt', + op: 'middleware', data: expect.objectContaining({ - 'sentry.op': 'middleware.nuxt', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nuxt', 'sentry.source': 'custom', 'http.request.method': 'GET', @@ -76,7 +76,7 @@ test.describe('Server Middleware Instrumentation', () => { await request.get('/api/middleware-test'); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // All middleware spans should be children of the main transaction middlewareSpans.forEach(span => { @@ -103,7 +103,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the auth middleware span const authMiddlewareSpan = serverTxnEvent.spans?.find( - span => span.op === 'middleware.nuxt' && span.data?.['nuxt.middleware.name'] === '03.auth', + span => span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '03.auth', ); expect(authMiddlewareSpan).toBeDefined(); @@ -137,7 +137,7 @@ test.describe('Server Middleware Instrumentation', () => { expect(response.status()).toBe(200); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // Find spans for the hooks middleware const hooksSpans = middlewareSpans.filter(span => span.data?.['nuxt.middleware.name'] === '04.hooks'); @@ -187,7 +187,7 @@ test.describe('Server Middleware Instrumentation', () => { expect(response.status()).toBe(200); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // Find spans for the array hooks middleware const arrayHooksSpans = middlewareSpans.filter(span => span.data?.['nuxt.middleware.name'] === '05.array-hooks'); @@ -251,7 +251,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the onRequest span that should have error status const onRequestSpan = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '04.hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onRequest', ); @@ -279,7 +279,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the onBeforeResponse span that should have error status const onBeforeResponseSpan = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '04.hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onBeforeResponse', ); @@ -307,7 +307,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the second onRequest span that should have error status const onRequest1Span = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '05.array-hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onRequest' && span.data?.['nuxt.middleware.hook.index'] === 1, @@ -320,7 +320,7 @@ test.describe('Server Middleware Instrumentation', () => { // Verify the first onRequest handler still executed successfully const onRequest0Span = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '05.array-hooks' && span.data?.['nuxt.middleware.hook.name'] === 'onRequest' && span.data?.['nuxt.middleware.hook.index'] === 0, diff --git a/dev-packages/e2e-tests/test-applications/nuxt-5/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-5/tests/middleware.test.ts index 71ef433b6c07..ff4cdf76157b 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-5/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-5/tests/middleware.test.ts @@ -18,7 +18,7 @@ test.describe('Server Middleware Instrumentation', () => { const serverTxnEvent = await serverTxnEventPromise; // Verify that we have spans for each middleware - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // 3 simple + 2 hooks (middleware+handler) + 3 array hooks (2 middleware + 1 handler) expect(middlewareSpans).toHaveLength(8); @@ -42,9 +42,9 @@ test.describe('Server Middleware Instrumentation', () => { [firstMiddlewareSpan, secondMiddlewareSpan, authMiddlewareSpan].forEach(span => { expect(span).toEqual( expect.objectContaining({ - op: 'middleware.nuxt', + op: 'middleware', data: expect.objectContaining({ - 'sentry.op': 'middleware.nuxt', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.nuxt', 'sentry.source': 'custom', 'http.request.method': 'GET', @@ -77,7 +77,7 @@ test.describe('Server Middleware Instrumentation', () => { await request.get('/api/middleware-test'); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // All middleware spans should be children of the main transaction middlewareSpans.forEach(span => { @@ -104,7 +104,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the auth middleware span const authMiddlewareSpan = serverTxnEvent.spans?.find( - span => span.op === 'middleware.nuxt' && span.data?.['nuxt.middleware.name'] === '03.auth', + span => span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '03.auth', ); expect(authMiddlewareSpan).toBeDefined(); @@ -138,7 +138,7 @@ test.describe('Server Middleware Instrumentation', () => { expect(response.status()).toBe(200); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // Find spans for the hooks middleware const hooksSpans = middlewareSpans.filter(span => span.data?.['nuxt.middleware.name'] === '04.hooks'); @@ -181,7 +181,7 @@ test.describe('Server Middleware Instrumentation', () => { expect(response.status()).toBe(200); const serverTxnEvent = await serverTxnEventPromise; - const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware.nuxt') || []; + const middlewareSpans = serverTxnEvent.spans?.filter(span => span.op === 'middleware') || []; // Find spans for the array hooks middleware const arrayHooksSpans = middlewareSpans.filter(span => span.data?.['nuxt.middleware.name'] === '05.array-hooks'); @@ -232,7 +232,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the middleware span that should have error status const middlewareSpan = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '04.hooks' && span.data?.['nuxt.middleware.hook.name'] === 'middleware', ); @@ -260,7 +260,7 @@ test.describe('Server Middleware Instrumentation', () => { // Find the second middleware span that should have error status const middleware1Span = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '05.array-hooks' && span.data?.['nuxt.middleware.hook.name'] === 'middleware' && span.data?.['nuxt.middleware.hook.index'] === 1, @@ -273,7 +273,7 @@ test.describe('Server Middleware Instrumentation', () => { // Verify the first middleware handler still executed successfully const middleware0Span = serverTxnEvent.spans?.find( span => - span.op === 'middleware.nuxt' && + span.op === 'middleware' && span.data?.['nuxt.middleware.name'] === '05.array-hooks' && span.data?.['nuxt.middleware.hook.name'] === 'middleware' && span.data?.['nuxt.middleware.hook.index'] === 0, diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/middleware.test.ts index ab31ce5e022a..c5c1961c0413 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/tests/middleware.test.ts @@ -38,7 +38,7 @@ test('Sends spans for multiple middlewares and verifies they are siblings under expect(serverFnMiddlewareSpan).toEqual( expect.objectContaining({ description: 'serverFnMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', status: 'ok', }), @@ -46,7 +46,7 @@ test('Sends spans for multiple middlewares and verifies they are siblings under expect(globalFunctionMiddlewareSpan).toEqual( expect.objectContaining({ description: 'globalFunctionMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', status: 'ok', }), @@ -77,7 +77,7 @@ test('Sends spans for global function middleware', async ({ page }) => { expect.arrayContaining([ expect.objectContaining({ description: 'globalFunctionMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', status: 'ok', }), @@ -104,7 +104,7 @@ test('Sends spans for global request middleware', async ({ page }) => { expect.arrayContaining([ expect.objectContaining({ description: 'globalRequestMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', status: 'ok', }), @@ -131,7 +131,7 @@ test('Sends spans for server route request middleware', async ({ page }) => { expect.arrayContaining([ expect.objectContaining({ description: 'serverRouteRequestMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', status: 'ok', }), @@ -160,7 +160,7 @@ test('Sends span for middleware that returns early without calling next()', asyn expect.arrayContaining([ expect.objectContaining({ description: 'earlyReturnMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', status: 'ok', }), @@ -189,7 +189,7 @@ test('Sends span for middleware that throws an error', async ({ page }) => { expect.arrayContaining([ expect.objectContaining({ description: 'errorMiddleware', - op: 'middleware.tanstackstart', + op: 'middleware', origin: 'auto.middleware.tanstackstart', }), ]), diff --git a/dev-packages/e2e-tests/test-applications/tsx-express/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/tsx-express/tests/transactions.test.ts index 916cc4bb3d7b..b2408811daac 100644 --- a/dev-packages/e2e-tests/test-applications/tsx-express/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/tsx-express/tests/transactions.test.ts @@ -72,12 +72,12 @@ test('Sends an API route transaction', async ({ baseURL }) => { expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'query', 'express.type': 'middleware', }, description: 'query', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -90,12 +90,12 @@ test('Sends an API route transaction', async ({ baseURL }) => { expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'expressInit', 'express.type': 'middleware', }, description: 'expressInit', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -148,12 +148,12 @@ test('Sends an API route transaction for an errored route', async ({ baseURL }) expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'query', 'express.type': 'middleware', }, description: 'query', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -166,12 +166,12 @@ test('Sends an API route transaction for an errored route', async ({ baseURL }) expect(spans).toContainEqual({ data: { 'sentry.origin': 'auto.http.express', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'express.name': 'expressInit', 'express.type': 'middleware', }, description: 'expressInit', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), diff --git a/dev-packages/node-integration-tests/suites/express/tracing/test.ts b/dev-packages/node-integration-tests/suites/express/tracing/test.ts index d3df34d3bea1..882732ff8d3b 100644 --- a/dev-packages/node-integration-tests/suites/express/tracing/test.ts +++ b/dev-packages/node-integration-tests/suites/express/tracing/test.ts @@ -32,7 +32,7 @@ describe('express tracing', () => { 'express.type': 'middleware', }), description: 'corsMiddleware', - op: 'middleware.express', + op: 'middleware', origin: 'auto.http.express', }), expect.objectContaining({ diff --git a/dev-packages/node-integration-tests/suites/tracing/fastify/test.ts b/dev-packages/node-integration-tests/suites/tracing/fastify/test.ts index d2e1157e8294..f20dc2ca767b 100644 --- a/dev-packages/node-integration-tests/suites/tracing/fastify/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/fastify/test.ts @@ -17,11 +17,11 @@ describe('fastify auto-instrumentation', () => { transaction: 'GET /test-transaction', spans: expect.arrayContaining([ expect.objectContaining({ - op: 'hook.fastify', + op: 'middleware', origin: 'auto.http.otel.fastify', data: expect.objectContaining({ 'fastify.type': 'hook', - 'sentry.op': 'hook.fastify', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.otel.fastify', }), }), diff --git a/dev-packages/node-integration-tests/suites/tracing/ignoreSpans-streamed/children/test.ts b/dev-packages/node-integration-tests/suites/tracing/ignoreSpans-streamed/children/test.ts index 60ef7a9f1d95..9dc823fab5de 100644 --- a/dev-packages/node-integration-tests/suites/tracing/ignoreSpans-streamed/children/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/ignoreSpans-streamed/children/test.ts @@ -31,8 +31,8 @@ describe('filtering child spans with ignoreSpans (streaming)', () => { container.items.find( item => item.name === name && item.attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]?.value === op, ); - const queryMiddlewareSpan = getSpan('query', 'middleware.express'); - const corsMiddlewareSpan = getSpan('corsMiddleware', 'middleware.express'); + const queryMiddlewareSpan = getSpan('query', 'middleware'); + const corsMiddlewareSpan = getSpan('corsMiddleware', 'middleware'); const requestHandlerSpan = getSpan('/test/express', 'request_handler.express'); const httpServerSpan = getSpan('GET /test/express', 'http.server'); const customSpan = getSpan('custom', 'custom'); diff --git a/dev-packages/node-integration-tests/suites/tracing/koa/scenario.mjs b/dev-packages/node-integration-tests/suites/tracing/koa/scenario.mjs index c1c0abc772cb..945f90feb39a 100644 --- a/dev-packages/node-integration-tests/suites/tracing/koa/scenario.mjs +++ b/dev-packages/node-integration-tests/suites/tracing/koa/scenario.mjs @@ -10,7 +10,7 @@ const app = new Koa(); // Registered first so it wraps every downstream middleware/route in its try/catch. Sentry.setupKoaErrorHandler(app); -// Plain middleware -> produces a `middleware.koa` span named after the function. +// Plain middleware -> produces a `middleware` span named after the function. app.use(async function simpleMiddleware(ctx, next) { await next(); }); diff --git a/dev-packages/node-integration-tests/suites/tracing/koa/test.ts b/dev-packages/node-integration-tests/suites/tracing/koa/test.ts index f730e24ab449..5cec23c83c9e 100644 --- a/dev-packages/node-integration-tests/suites/tracing/koa/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/koa/test.ts @@ -47,13 +47,13 @@ describe('koa auto-instrumentation', () => { // Plain middleware span. expect.objectContaining({ description: 'simpleMiddleware', - op: 'middleware.koa', + op: 'middleware', origin, data: expect.objectContaining({ 'koa.type': 'middleware', 'koa.name': 'simpleMiddleware', 'code.function.name': 'simpleMiddleware', - 'sentry.op': 'middleware.koa', + 'sentry.op': 'middleware', 'sentry.origin': origin, }), }), diff --git a/packages/core/src/integrations/express/patch-layer.ts b/packages/core/src/integrations/express/patch-layer.ts index 6a026afa67f8..059dbca039f7 100644 --- a/packages/core/src/integrations/express/patch-layer.ts +++ b/packages/core/src/integrations/express/patch-layer.ts @@ -27,8 +27,10 @@ * limitations under the License. */ +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import { DEBUG_BUILD } from '../../debug-build'; -import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes'; +import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes'; import { SPAN_STATUS_ERROR, startSpanManual, withActiveSpan } from '../../tracing'; import { debug } from '../../utils/debug-logger'; import type { SpanAttributes } from '../../types/span'; @@ -122,7 +124,7 @@ export function patchLayer( const type = metadata.attributes[ATTR_EXPRESS_TYPE]; const attributes: SpanAttributes = Object.assign(metadata.attributes, { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.express', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.express`, + [SENTRY_OP]: type === 'middleware' ? WEB_SERVER_MIDDLEWARE_SPAN_OP : `${type}.express`, }); if (actualMatchedRoute) { attributes[ATTR_HTTP_ROUTE] = actualMatchedRoute; diff --git a/packages/core/test/lib/integrations/express/patch-layer.test.ts b/packages/core/test/lib/integrations/express/patch-layer.test.ts index 3c44bd93836f..aada88147215 100644 --- a/packages/core/test/lib/integrations/express/patch-layer.test.ts +++ b/packages/core/test/lib/integrations/express/patch-layer.test.ts @@ -263,7 +263,7 @@ describe('patchLayer', () => { 'express.name': 'mw', 'express.type': 'middleware', 'http.route': '/a/:boo/:car/layerPath', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.express', }, description: 'mw', @@ -453,7 +453,7 @@ describe('patchLayer', () => { 'express.name': 'mw', 'express.type': 'middleware', 'http.route': '/a/b/c', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.express', }, description: 'mw', @@ -543,7 +543,7 @@ describe('patchLayer', () => { data: { 'express.name': 'mw', 'express.type': 'middleware', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.express', }, description: 'mw', @@ -593,7 +593,7 @@ describe('patchLayer', () => { data: { 'express.name': 'mw', 'express.type': 'middleware', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.express', }, description: 'mw', @@ -636,7 +636,7 @@ describe('patchLayer', () => { 'express.name': 'mw', 'express.type': 'middleware', 'http.route': '/a/b/c', - 'sentry.op': 'middleware.express', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.http.express', }, description: 'mw', diff --git a/packages/core/test/lib/utils/should-ignore-span.test.ts b/packages/core/test/lib/utils/should-ignore-span.test.ts index e329f3d7f00b..22d9594ea42c 100644 --- a/packages/core/test/lib/utils/should-ignore-span.test.ts +++ b/packages/core/test/lib/utils/should-ignore-span.test.ts @@ -94,9 +94,7 @@ describe('shouldIgnoreSpan', () => { }); it('matches middleware span names with regex', () => { - expect( - shouldIgnoreSpan({ description: 'middleware - expressInit', op: 'middleware.express' }, [/middleware/]), - ).toBe(true); + expect(shouldIgnoreSpan({ description: 'middleware - expressInit', op: 'middleware' }, [/middleware/])).toBe(true); }); it('matches IgnoreSpanFilter with op only', () => { diff --git a/packages/elysia/src/withElysia.ts b/packages/elysia/src/withElysia.ts index d1a253a99267..30253e0caad6 100644 --- a/packages/elysia/src/withElysia.ts +++ b/packages/elysia/src/withElysia.ts @@ -1,4 +1,5 @@ import { HTTP_ROUTE, URL_FULL, URL_PATH } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import type { Span } from '@sentry/core'; import { captureException, @@ -29,15 +30,15 @@ const ELYSIA_ORIGIN = 'auto.http.elysia'; * Map Elysia lifecycle phase names to Sentry span ops. */ const ELYSIA_LIFECYCLE_OP_MAP: Record = { - Request: 'middleware.elysia', - Parse: 'middleware.elysia', - Transform: 'middleware.elysia', - BeforeHandle: 'middleware.elysia', + Request: WEB_SERVER_MIDDLEWARE_SPAN_OP, + Parse: WEB_SERVER_MIDDLEWARE_SPAN_OP, + Transform: WEB_SERVER_MIDDLEWARE_SPAN_OP, + BeforeHandle: WEB_SERVER_MIDDLEWARE_SPAN_OP, Handle: 'request_handler.elysia', - AfterHandle: 'middleware.elysia', - MapResponse: 'middleware.elysia', - AfterResponse: 'middleware.elysia', - Error: 'middleware.elysia', + AfterHandle: WEB_SERVER_MIDDLEWARE_SPAN_OP, + MapResponse: WEB_SERVER_MIDDLEWARE_SPAN_OP, + AfterResponse: WEB_SERVER_MIDDLEWARE_SPAN_OP, + Error: WEB_SERVER_MIDDLEWARE_SPAN_OP, }; function isBun(): boolean { diff --git a/packages/hono/src/shared/wrapMiddlewareSpan.ts b/packages/hono/src/shared/wrapMiddlewareSpan.ts index 8c2e4787314b..7776e261f99e 100644 --- a/packages/hono/src/shared/wrapMiddlewareSpan.ts +++ b/packages/hono/src/shared/wrapMiddlewareSpan.ts @@ -1,8 +1,9 @@ +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import { getActiveSpan, getOriginalFunction, getRootSpan, - SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SPAN_STATUS_ERROR, startInactiveSpan, @@ -31,11 +32,10 @@ export function wrapMiddlewareWithSpan(handler: MiddlewareHandler): MiddlewareHa const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined; const span = startInactiveSpan({ name: handler.name || '', - op: 'middleware.hono', onlyIfParent: true, parentSpan: rootSpan, attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.hono', + [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: MIDDLEWARE_ORIGIN, }, }); diff --git a/packages/hono/test/shared/patchAppUse.test.ts b/packages/hono/test/shared/patchAppUse.test.ts index dca53be16040..a499a6a7b17c 100644 --- a/packages/hono/test/shared/patchAppUse.test.ts +++ b/packages/hono/test/shared/patchAppUse.test.ts @@ -39,10 +39,9 @@ describe('patchAppUse (middleware spans)', () => { expect(startInactiveSpanMock).toHaveBeenCalledTimes(1); expect(startInactiveSpanMock).toHaveBeenCalledWith( expect.objectContaining({ - op: 'middleware.hono', onlyIfParent: true, attributes: expect.objectContaining({ - 'sentry.op': 'middleware.hono', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.hono', }), }), @@ -124,8 +123,8 @@ describe('patchAppUse (middleware spans)', () => { expect(startInactiveSpanMock).toHaveBeenCalledTimes(3); const [firstCall, secondCall, thirdCall] = startInactiveSpanMock.mock.calls; - expect(firstCall![0]).toMatchObject({ op: 'middleware.hono' }); - expect(secondCall![0]).toMatchObject({ op: 'middleware.hono' }); + expect(firstCall![0]).toMatchObject({ attributes: { 'sentry.op': 'middleware' } }); + expect(secondCall![0]).toMatchObject({ attributes: { 'sentry.op': 'middleware' } }); expect(firstCall![0].name).toMatch(''); expect(secondCall![0].name).toBe('namedMiddleware'); expect(thirdCall![0].name).toBe(''); @@ -225,11 +224,10 @@ describe('patchHttpMethodHandlers (inline middleware spans on main app)', () => expect(startInactiveSpanMock).toHaveBeenCalledTimes(1); expect(startInactiveSpanMock).toHaveBeenCalledWith({ name: 'inlineMw', - op: 'middleware.hono', onlyIfParent: true, parentSpan: undefined, attributes: { - 'sentry.op': 'middleware.hono', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.hono', }, }); diff --git a/packages/nestjs/src/integrations/helpers.ts b/packages/nestjs/src/integrations/helpers.ts index d3b1c5f14800..dd3ea3fb2dbd 100644 --- a/packages/nestjs/src/integrations/helpers.ts +++ b/packages/nestjs/src/integrations/helpers.ts @@ -1,3 +1,5 @@ +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import type { Span } from '@sentry/core'; import { addNonEnumerableProperty, @@ -89,7 +91,7 @@ export function getMiddlewareSpanOptions( return { name: name ?? target.name ?? 'unknown', attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nestjs', + [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: middlewareOrigin(componentType), }, }; diff --git a/packages/nestjs/test/integrations/orchestrion-subscriber.test.ts b/packages/nestjs/test/integrations/orchestrion-subscriber.test.ts index b506ab153f06..8764075efe63 100644 --- a/packages/nestjs/test/integrations/orchestrion-subscriber.test.ts +++ b/packages/nestjs/test/integrations/orchestrion-subscriber.test.ts @@ -354,7 +354,7 @@ describe('NestJS orchestrion subscriber: @Injectable (middleware/guard/pipe/inte expect(next).toHaveBeenCalledTimes(1); const json = spanToJSON(spanInside!); expect(json.description).toBe('LoggerMiddleware'); - expect(json.op).toBe('middleware.nestjs'); + expect(json.op).toBe('middleware'); expect(json.origin).toBe('auto.middleware.nestjs'); // startSpanManual span ends when the proxied `next` is called. expect(json.timestamp).toBeDefined(); @@ -377,7 +377,7 @@ describe('NestJS orchestrion subscriber: @Injectable (middleware/guard/pipe/inte expect(new AuthGuard().canActivate({ ctx: true })).toBe(true); const json = spanToJSON(spanInside!); expect(json.description).toBe('AuthGuard'); - expect(json.op).toBe('middleware.nestjs'); + expect(json.op).toBe('middleware'); expect(json.origin).toBe('auto.middleware.nestjs.guard'); }); @@ -398,7 +398,7 @@ describe('NestJS orchestrion subscriber: @Injectable (middleware/guard/pipe/inte expect(new ParseIntPipe().transform('42', { type: 'param' })).toBe(42); const json = spanToJSON(spanInside!); expect(json.description).toBe('ParseIntPipe'); - expect(json.op).toBe('middleware.nestjs'); + expect(json.op).toBe('middleware'); expect(json.origin).toBe('auto.middleware.nestjs.pipe'); }); @@ -432,7 +432,7 @@ describe('NestJS orchestrion subscriber: @Injectable (middleware/guard/pipe/inte const beforeJson = spanToJSON(beforeSpan!); expect(beforeJson.description).toBe('LoggingInterceptor'); - expect(beforeJson.op).toBe('middleware.nestjs'); + expect(beforeJson.op).toBe('middleware'); expect(beforeJson.origin).toBe('auto.middleware.nestjs.interceptor'); // before-span ends when `next.handle()` is called. expect(beforeJson.timestamp).toBeDefined(); @@ -659,7 +659,7 @@ describe('NestJS orchestrion subscriber: @Catch (exception filter)', () => { const json = spanToJSON(spanInside!); expect(json.description).toBe('HttpExceptionFilter'); - expect(json.op).toBe('middleware.nestjs'); + expect(json.op).toBe('middleware'); expect(json.origin).toBe('auto.middleware.nestjs.exception_filter'); }); @@ -714,7 +714,7 @@ describe('NestJS orchestrion subscriber: @Catch (exception filter)', () => { const json = spanToJSON(spanInside!); expect(json.description).toBe('HttpExceptionFilter'); - expect(json.op).toBe('middleware.nestjs'); + expect(json.op).toBe('middleware'); expect(json.origin).toBe('auto.middleware.nestjs.exception_filter'); }); @@ -738,7 +738,7 @@ describe('NestJS orchestrion subscriber: @Catch (exception filter)', () => { const json = spanToJSON(spanInside!); expect(json.description).toBe('HttpExceptionFilter'); - expect(json.op).toBe('middleware.nestjs'); + expect(json.op).toBe('middleware'); expect(json.origin).toBe('auto.middleware.nestjs.exception_filter'); }); diff --git a/packages/nitro/package.json b/packages/nitro/package.json index cc17edbd6b86..48c495001f26 100644 --- a/packages/nitro/package.json +++ b/packages/nitro/package.json @@ -36,6 +36,7 @@ }, "dependencies": { "@sentry/bundler-plugins": "^10.67.0", + "@sentry/conventions": "^0.16.0", "@sentry/core": "10.67.0", "@sentry/node": "10.67.0", "@sentry/server-utils": "10.67.0" diff --git a/packages/nitro/src/runtime/hooks/captureTracingEvents.ts b/packages/nitro/src/runtime/hooks/captureTracingEvents.ts index 155d8f1d6553..faad0238a5d7 100644 --- a/packages/nitro/src/runtime/hooks/captureTracingEvents.ts +++ b/packages/nitro/src/runtime/hooks/captureTracingEvents.ts @@ -1,4 +1,6 @@ import * as dc from 'node:diagnostics_channel'; +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_HTTP_SERVER_SPAN_OP, WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import { isObjectLike, getActiveSpan, @@ -8,7 +10,6 @@ import { GLOBAL_OBJ, httpHeadersToSpanAttributes, parseStringToURLObject, - SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, setHttpStatus, type Span, @@ -107,7 +108,7 @@ function setupH3TracingChannels(): void { attributes: { ...urlAttributes, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.h3', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: data?.type === 'middleware' ? 'middleware.nitro' : 'http.server', + [SENTRY_OP]: data?.type === 'middleware' ? WEB_SERVER_MIDDLEWARE_SPAN_OP : WEB_SERVER_HTTP_SERVER_SPAN_OP, }, }); @@ -172,7 +173,7 @@ function setupSrvxTracingChannels(): void { ...urlAttributes, ...headerAttributes, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: data.middleware ? 'middleware.nitro' : 'http.server', + [SENTRY_OP]: data.middleware ? WEB_SERVER_MIDDLEWARE_SPAN_OP : WEB_SERVER_HTTP_SERVER_SPAN_OP, 'server.port': data.server.options.port, }, // Use the same parent span as middleware to make them siblings @@ -211,7 +212,7 @@ function setupSrvxTracingChannels(): void { attributes: { ...urlAttributes, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nitro', + [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP, }, parentSpan: requestParentSpans.get(data.request) || undefined, }); diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 1ef9e69ef68b..7e59613e6546 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -56,6 +56,7 @@ "@nuxt/kit": "^3.13.2", "@sentry/browser": "10.67.0", "@sentry/cloudflare": "10.67.0", + "@sentry/conventions": "^0.16.0", "@sentry/core": "10.67.0", "@sentry/node": "10.67.0", "@sentry/bundler-plugins": "10.67.0", diff --git a/packages/nuxt/src/runtime/hooks/wrapMiddlewareHandler.ts b/packages/nuxt/src/runtime/hooks/wrapMiddlewareHandler.ts index f425651cfe00..7c024388b948 100644 --- a/packages/nuxt/src/runtime/hooks/wrapMiddlewareHandler.ts +++ b/packages/nuxt/src/runtime/hooks/wrapMiddlewareHandler.ts @@ -1,10 +1,11 @@ +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import { captureException, debug, flushIfServerless, getClient, httpHeadersToSpanAttributes, - SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SPAN_STATUS_ERROR, @@ -164,7 +165,7 @@ function getSpanAttributes( index?: number, ): SpanAttributes { const attributes: SpanAttributes = { - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nuxt', + [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP, [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.middleware.nuxt', 'nuxt.middleware.name': middlewareName, diff --git a/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts b/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts index 3a3c9bdca5c0..96621d1e442d 100644 --- a/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts +++ b/packages/nuxt/test/runtime/hooks/wrapMiddlewareHandler.test.ts @@ -177,7 +177,7 @@ describe('wrapMiddlewareHandlerWithSentry', () => { expect.objectContaining({ name: 'object-middleware', attributes: expect.objectContaining({ - [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nuxt', + [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware', 'nuxt.middleware.name': 'object-middleware', }), }), @@ -208,7 +208,7 @@ describe('wrapMiddlewareHandlerWithSentry', () => { expect.objectContaining({ name: 'request-middleware.onRequest', attributes: expect.objectContaining({ - [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nuxt', + [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware', 'nuxt.middleware.name': 'request-middleware', 'nuxt.middleware.hook.name': 'onRequest', }), @@ -295,7 +295,7 @@ describe('wrapMiddlewareHandlerWithSentry', () => { expect.objectContaining({ name: 'response-middleware.onBeforeResponse', attributes: expect.objectContaining({ - [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nuxt', + [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware', 'nuxt.middleware.name': 'response-middleware', 'nuxt.middleware.hook.name': 'onBeforeResponse', }), @@ -507,7 +507,7 @@ describe('wrapMiddlewareHandlerWithSentry', () => { expect.objectContaining({ name: 'v2-middleware.middleware', attributes: expect.objectContaining({ - [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nuxt', + [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware', 'nuxt.middleware.name': 'v2-middleware', 'nuxt.middleware.hook.name': 'middleware', 'nuxt.middleware.hook.index': 0, @@ -586,7 +586,7 @@ describe('wrapMiddlewareHandlerWithSentry', () => { expect.objectContaining({ name: 'api-middleware', attributes: expect.objectContaining({ - [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nuxt', + [SentryCore.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware', 'nuxt.middleware.name': 'api-middleware', 'http.request.method': 'GET', 'http.route': '/test-path', diff --git a/packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts b/packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts index 60950d23aa45..0c3411fe41cf 100644 --- a/packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts +++ b/packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts @@ -1,12 +1,12 @@ import type * as diagnosticsChannel from 'node:diagnostics_channel'; -import { HTTP_ROUTE } from '@sentry/conventions/attributes'; +import { HTTP_ROUTE, SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import type { Span } from '@sentry/core'; import { debug, getActiveSpan, getDefaultIsolationScope, getIsolationScope, - SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startInactiveSpan, stringMatchesSomePattern, @@ -223,7 +223,7 @@ function getSpanForLayer(data: HandleChannelContext, options: ExpressIntegration name, attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN, - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.express`, + [SENTRY_OP]: type === 'middleware' ? WEB_SERVER_MIDDLEWARE_SPAN_OP : `${type}.express`, [ATTR_EXPRESS_NAME]: name, [ATTR_EXPRESS_TYPE]: type, ...(matchedRoute ? { [HTTP_ROUTE]: matchedRoute } : {}), diff --git a/packages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.ts b/packages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.ts index 1964307844c4..f37abddc651e 100644 --- a/packages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.ts +++ b/packages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.ts @@ -15,7 +15,14 @@ /* eslint-disable max-lines */ import * as diagnosticsChannel from 'node:diagnostics_channel'; -import { HTTP_REQUEST_METHOD, HTTP_RESPONSE_STATUS_CODE, HTTP_ROUTE, URL_PATH } from '@sentry/conventions/attributes'; +import { + HTTP_REQUEST_METHOD, + HTTP_RESPONSE_STATUS_CODE, + HTTP_ROUTE, + SENTRY_OP, + URL_PATH, +} from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import type { Span } from '@sentry/core'; import { isObjectLike, @@ -35,7 +42,7 @@ const PACKAGE_NAME = '@sentry/instrumentation-fastify'; const SUPPORTED_VERSIONS = '>=3.21.0 <6'; const ORIGIN = 'auto.http.otel.fastify'; -const HOOK_OP = 'hook.fastify'; +const HOOK_OP = WEB_SERVER_MIDDLEWARE_SPAN_OP; const REQUEST_HANDLER_OP = 'request_handler.fastify'; const FASTIFY_HOOKS = [ @@ -344,9 +351,9 @@ function handlerWrapper(handler: AnyFn, hookName: string, spanAttributes: Record return startSpan( { name, - op, attributes: { ...spanAttributes, + [SENTRY_OP]: op, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN, }, parentSpan, diff --git a/packages/server-utils/src/integrations/tracing-channel/koa.ts b/packages/server-utils/src/integrations/tracing-channel/koa.ts index 0efcd75623ba..9acc9dafda95 100644 --- a/packages/server-utils/src/integrations/tracing-channel/koa.ts +++ b/packages/server-utils/src/integrations/tracing-channel/koa.ts @@ -10,7 +10,8 @@ import { startSpan, } from '@sentry/core'; // oxlint-disable-next-line typescript/no-deprecated -import { CODE_FUNCTION_NAME, HTTP_ROUTE, KOA_NAME, KOA_TYPE } from '@sentry/conventions/attributes'; +import { CODE_FUNCTION_NAME, HTTP_ROUTE, KOA_NAME, KOA_TYPE, SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import { DEBUG_BUILD } from '../../debug-build'; import { CHANNELS } from '../../orchestrion/channels'; import { setHttpServerSpanRouteAttribute } from '../../utils/setHttpServerSpanRouteAttribute'; @@ -181,9 +182,9 @@ function patchLayer( return startSpan( { name, - op: `${layerType}.koa`, attributes: { ...metadata.attributes, + [SENTRY_OP]: layerType === LAYER_TYPE.MIDDLEWARE ? WEB_SERVER_MIDDLEWARE_SPAN_OP : `${layerType}.koa`, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN, }, }, diff --git a/packages/tanstackstart-react/src/server/utils.ts b/packages/tanstackstart-react/src/server/utils.ts index 9ff87c8ebbf4..ed6c38c3718b 100644 --- a/packages/tanstackstart-react/src/server/utils.ts +++ b/packages/tanstackstart-react/src/server/utils.ts @@ -1,16 +1,17 @@ +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op'; import type { StartSpanOptions } from '@sentry/core'; -import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node'; +import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/node'; /** * Returns span options for TanStack Start middleware spans. */ export function getMiddlewareSpanOptions(name: string): StartSpanOptions { return { - op: 'middleware.tanstackstart', name, attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.middleware.tanstackstart', - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.tanstackstart', + [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP, }, }; } diff --git a/packages/tanstackstart-react/test/server/utils.test.ts b/packages/tanstackstart-react/test/server/utils.test.ts index 66540bf3dfb3..5ddfc7b49c23 100644 --- a/packages/tanstackstart-react/test/server/utils.test.ts +++ b/packages/tanstackstart-react/test/server/utils.test.ts @@ -5,10 +5,9 @@ describe('getMiddlewareSpanOptions', () => { it('returns correct span options', () => { const options = getMiddlewareSpanOptions('testMiddleware'); expect(options).toEqual({ - op: 'middleware.tanstackstart', name: 'testMiddleware', attributes: { - 'sentry.op': 'middleware.tanstackstart', + 'sentry.op': 'middleware', 'sentry.origin': 'auto.middleware.tanstackstart', }, });