getsentry / sentry-javascript

Official Sentry SDKs for JavaScript
https://sentry.io
MIT License
8.01k stars 1.58k forks source link

`@sentry/nestjs` `SentryTraced` decorator does not retain metadata #14384

Open nathan-knight opened 1 day ago

nathan-knight commented 1 day ago

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/nestjs

SDK Version

8.38.0

Framework Version

NestJS 10.4.2

Link to Sentry event

No response

Reproduction Example/SDK Setup

No response

Steps to Reproduce

If you apply the SentryTraced decorator to a function, it replaces it with a new function that retains the name of the original function but does not copy over the metadata using reflect-metadata that may have been applied by another decorator (which is a common pattern in NestJS) such as SetMetadata from @nestjs/common.

Expected Result

After the decorator assigns decorator.value, it should do something like:

const metadataKeys = Reflect.getMetadataKeys(originalMethod);
for (const metadataKey of metadataKeys) {
    const value = Reflect.getMetadata(metadataKey, originalMethod);
    Reflect.defineMetadata(metadataKey, value, descriptor.value);
}

I have applied a patch to get things working for us that does exactly this

Actual Result

It does not copy the metadata so other functionality that relies on it breaks.

andreiborza commented 1 day ago

Hi @nathan-knight, thanks for taking the time to file this.

Would you like to contribute this? No pressure, we can also take care of this on our end.

cc @chargome