Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): Deprecate transaction metadata in favor of attributes #10097

Merged
merged 2 commits into from
Jan 9, 2024

Conversation

mydea
Copy link
Member

@mydea mydea commented Jan 8, 2024

This deprecates any usage of metadata on transactions.

The main usages we have are to set sampleRate and source in there. These I replaced with semantic attributes. For backwards compatibility, when creating the transaction event we still check the metadata there as well.

Other usage of metadata (mostly around request) remains intact for now, we need to replace this in v8 - e.g. put this on the isolation scope, probably.

This is the first usage of Semantic Attributes in the SDK!

This replaces #10041

@mydea mydea self-assigned this Jan 8, 2024
Copy link
Contributor

github-actions bot commented Jan 8, 2024

size-limit report 📦

Path Size
@sentry/browser (incl. Tracing, Replay, Feedback) - Webpack (gzipped) 76.57 KB (+0.12% 🔺)
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped) 67.94 KB (+0.08% 🔺)
@sentry/browser (incl. Tracing, Replay) - Webpack with treeshaking flags (gzipped) 61.57 KB (+0.11% 🔺)
@sentry/browser (incl. Tracing) - Webpack (gzipped) 32.18 KB (+0.18% 🔺)
@sentry/browser (incl. Feedback) - Webpack (gzipped) 30.7 KB (0%)
@sentry/browser - Webpack (gzipped) 22.07 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback) - ES6 CDN Bundle (gzipped) 74.21 KB (+0.16% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped) 65.84 KB (+0.14% 🔺)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped) 32 KB (+0.21% 🔺)
@sentry/browser - ES6 CDN Bundle (gzipped) 23.76 KB (0%)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed) 206.8 KB (+0.14% 🔺)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed) 96.66 KB (+0.27% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed) 70.93 KB (0%)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped) 34.97 KB (+0.24% 🔺)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped) 68.31 KB (+0.09% 🔺)
@sentry/react - Webpack (gzipped) 22.09 KB (0%)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped) 85.03 KB (+0.08% 🔺)
@sentry/nextjs Client - Webpack (gzipped) 49.39 KB (+0.13% 🔺)
@sentry-internal/feedback - Webpack (gzipped) 16.74 KB (0%)

Copy link
Member

@lforst lforst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

generally lgtm - only minor stuff but the one with the dict may have long term impact so we should resolve it.

Comment on lines 1 to 4
export const SentrySemanticAttributes = {
Source: 'sentry.source',
SampleRate: 'sentry.sample_rate',
} as const;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: I have a slight concern here. This object is not tree shakable, in the sense that as soon as it grows, whenever you use one value, the entire object is pulled into the bundle.

I would suggest we either a) expose the attribute consts as individual variables, b) create individual variables and put it under some name space that is still tree-shakable.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I was also not 100% sure. I modeled this after OTEL, which does it the same way. 🤔

We could do:

export const SENTRY_ATTR_SOURCE = 'sentry.source';
export const SENTRY_ATTR_SAMPLE_RATE = 'sentry.sample_rate';

?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would probably just do SEMANTIC_ATTRIBUTE_SENTRY_SOURCE. Abbreviations feel weird.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Otel probably didn't consider this because they don't think too much about browser land I imagine. We will have to consider this.

Comment on lines 218 to 293
const idStr = childSpan.transaction.spanId;

const logMessage = `[Tracing] Starting '${opStr}' span on transaction '${nameStr}' (${idStr}).`;
childSpan.transaction.metadata.spanMetadata[childSpan.spanId] = { logMessage };
logger.log(logMessage);
this._logMessage = logMessage;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I vote we kill this entire log-message-on-span thing. I am not sure it is worth the complexity. The actual logger log message should stay though probably.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, I generally agree, problem is we need the transaction name when finishing, where we don't really have access to this. IMHO this is OK for now and we can look to further simplify this when we do more work on spans (I don't want to spend too much time on this right now because... there are a million other things to do as well xD)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that now the span simply keeps it's own log message so we can re-use it when it is ended, so it should already be much simpler than it was before 😅

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good!

Comment on lines 16 to 57
/**
* Metadata associated with the transaction, for internal SDK use.
* @deprecated Use attributes or store data on the scope instead.
*/
metadata?: Partial<TransactionMetadata>;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain the thought process behind adding a deprecated field? Also, it looks like TransactionContext already has this field. If it's just for a slightly different JSDoc, we should say "with the span" here right?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is already added, but the eslint deprecation rule does not seem to pick up inherited deprecated fields 😬 so without this, it does not show up as deprecated. This is generally very sad...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Damn that's crazy/scary. It's fine to keep it then!

@mydea
Copy link
Member Author

mydea commented Jan 8, 2024

I updated this with new semantic attribute constants!

Copy link
Member

@lforst lforst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for integrating my suggestions!

@mydea mydea force-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765 Compare January 8, 2024 16:14
@@ -17,12 +17,12 @@ sentryTest('should be able to handle circular data', async ({ getLocalTestPath,

expect(eventData.contexts).toMatchObject({
trace: {
data: { lays: { contains: '[Circular ~]' } },
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hah, this started failing because it depended on no other data being added to the transaction - but now under the hood it adds sample rate attribute, which lead to this not being the same at the root and one level deeper nesting. Making this an explicit data entry makes this test clearer IMHO.

* Should be one of: custom, url, route, view, component, task, unknown
*
*/
export const SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = 'sentry.source';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might be a good thing to put under a subpath export @sentry/core/attributes, let's give it a try in v8.

Copy link
Member

@Lms24 Lms24 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! I'll wait with #10094 until this is merged to update reading the sample rate

@mydea mydea merged commit 0276c03 into develop Jan 9, 2024
96 checks passed
@mydea mydea deleted the fn/deprecate-spanMetadata branch January 9, 2024 08:58
mydea added a commit that referenced this pull request Jan 9, 2024
So we do not mutate this if we update data there.

Noticed this here:
#10097
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants