From 1eb88463093db595a145fc1390b5484aade499c7 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 5 Aug 2025 10:43:10 +0200 Subject: [PATCH 1/2] fix(nestjs): Add missing `sentry.origin` span attribute to `SentryTraced` decorator --- packages/nestjs/src/decorators.ts | 11 ++++++++++- packages/nestjs/test/decorators.test.ts | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/nestjs/src/decorators.ts b/packages/nestjs/src/decorators.ts index 7ac4941be877..449c884b1008 100644 --- a/packages/nestjs/src/decorators.ts +++ b/packages/nestjs/src/decorators.ts @@ -1,5 +1,10 @@ import type { MonitorConfig } from '@sentry/core'; -import { captureException, isThenable } from '@sentry/core'; +import { + captureException, + isThenable, + SEMANTIC_ATTRIBUTE_SENTRY_OP, + SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, +} from '@sentry/core'; import * as Sentry from '@sentry/node'; import { startSpan } from '@sentry/node'; import { isExpectedError } from './helpers'; @@ -52,6 +57,10 @@ export function SentryTraced(op: string = 'function') { { op: op, name: propertyKey, + attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.nestjs.sentry_traced', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, + }, }, () => { return originalMethod.apply(this, args); diff --git a/packages/nestjs/test/decorators.test.ts b/packages/nestjs/test/decorators.test.ts index 329f2fbe8fa4..d6b6852524b3 100644 --- a/packages/nestjs/test/decorators.test.ts +++ b/packages/nestjs/test/decorators.test.ts @@ -1,5 +1,6 @@ import 'reflect-metadata'; import * as core from '@sentry/core'; +import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { SentryCron, SentryExceptionCaptured, SentryTraced } from '../src/decorators'; import * as helpers from '../src/helpers'; @@ -96,6 +97,10 @@ describe('SentryTraced decorator', () => { { op: 'sync-operation', name: 'syncMethod', + attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.nestjs.sentry_traced', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'sync-operation', + }, }, expect.any(Function), ); From b6eeb2fc26de6d49d266dc02c0732b1e7fd736a8 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 5 Aug 2025 11:12:53 +0200 Subject: [PATCH 2/2] adjust tests --- .../nestjs-11/tests/span-decorator.test.ts | 8 ++++---- .../nestjs-8/tests/span-decorator.test.ts | 8 ++++---- .../nestjs-basic/tests/span-decorator.test.ts | 8 ++++---- .../nestjs-fastify/tests/span-decorator.test.ts | 8 ++++---- packages/nestjs/test/decorators.test.ts | 8 ++++++++ 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/nestjs-11/tests/span-decorator.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-11/tests/span-decorator.test.ts index 3d63c1d17953..344ba18223cc 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-11/tests/span-decorator.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-11/tests/span-decorator.test.ts @@ -22,7 +22,7 @@ test('Transaction includes span and correct value for decorated async function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'wait and return a string', }, description: 'wait', @@ -30,7 +30,7 @@ test('Transaction includes span and correct value for decorated async function', start_timestamp: expect.any(Number), status: 'ok', op: 'wait and return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); @@ -57,7 +57,7 @@ test('Transaction includes span and correct value for decorated sync function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'return a string', }, description: 'getString', @@ -65,7 +65,7 @@ test('Transaction includes span and correct value for decorated sync function', start_timestamp: expect.any(Number), status: 'ok', op: 'return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-8/tests/span-decorator.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-8/tests/span-decorator.test.ts index 57eca5bc9dfe..961586bacb7f 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-8/tests/span-decorator.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-8/tests/span-decorator.test.ts @@ -22,7 +22,7 @@ test('Transaction includes span and correct value for decorated async function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'wait and return a string', }, description: 'wait', @@ -30,7 +30,7 @@ test('Transaction includes span and correct value for decorated async function', start_timestamp: expect.any(Number), status: 'ok', op: 'wait and return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); @@ -57,7 +57,7 @@ test('Transaction includes span and correct value for decorated sync function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'return a string', }, description: 'getString', @@ -65,7 +65,7 @@ test('Transaction includes span and correct value for decorated sync function', start_timestamp: expect.any(Number), status: 'ok', op: 'return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/span-decorator.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/span-decorator.test.ts index b82213e6157a..87d66a0a2d4d 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/span-decorator.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/span-decorator.test.ts @@ -22,7 +22,7 @@ test('Transaction includes span and correct value for decorated async function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'wait and return a string', }, description: 'wait', @@ -30,7 +30,7 @@ test('Transaction includes span and correct value for decorated async function', start_timestamp: expect.any(Number), status: 'ok', op: 'wait and return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); @@ -57,7 +57,7 @@ test('Transaction includes span and correct value for decorated sync function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'return a string', }, description: 'getString', @@ -65,7 +65,7 @@ test('Transaction includes span and correct value for decorated sync function', start_timestamp: expect.any(Number), status: 'ok', op: 'return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/span-decorator.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/span-decorator.test.ts index 6efb193751b9..14e53bf5912e 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/span-decorator.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-fastify/tests/span-decorator.test.ts @@ -22,7 +22,7 @@ test('Transaction includes span and correct value for decorated async function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'wait and return a string', }, description: 'wait', @@ -30,7 +30,7 @@ test('Transaction includes span and correct value for decorated async function', start_timestamp: expect.any(Number), status: 'ok', op: 'wait and return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); @@ -57,7 +57,7 @@ test('Transaction includes span and correct value for decorated sync function', span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/), data: { - 'sentry.origin': 'manual', + 'sentry.origin': 'auto.function.nestjs.sentry_traced', 'sentry.op': 'return a string', }, description: 'getString', @@ -65,7 +65,7 @@ test('Transaction includes span and correct value for decorated sync function', start_timestamp: expect.any(Number), status: 'ok', op: 'return a string', - origin: 'manual', + origin: 'auto.function.nestjs.sentry_traced', }), ]), ); diff --git a/packages/nestjs/test/decorators.test.ts b/packages/nestjs/test/decorators.test.ts index d6b6852524b3..07bd8922f373 100644 --- a/packages/nestjs/test/decorators.test.ts +++ b/packages/nestjs/test/decorators.test.ts @@ -39,6 +39,10 @@ describe('SentryTraced decorator', () => { { op: 'test-operation', name: 'testMethod', + attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.nestjs.sentry_traced', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'test-operation', + }, }, expect.any(Function), ); @@ -68,6 +72,10 @@ describe('SentryTraced decorator', () => { { op: 'function', // default value name: 'testDefaultOp', + attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.nestjs.sentry_traced', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function', + }, }, expect.any(Function), );