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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

Merged
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata
Jan 9, 2024
Merged

feat(core): Deprecate transaction metadata in favor of attributes#10097
mydea merged 2 commits into
developfrom
fn/deprecate-spanMetadata

Conversation

@mydea

@mydeamydea commented Jan 8, 2024

Copy link
Copy Markdown
Member

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

@mydeamydea self-assigned this Jan 8, 2024
@github-actions

github-actionsBot commented Jan 8, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@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%)

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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:

exportconstSENTRY_ATTR_SOURCE='sentry.source';exportconstSENTRY_ATTR_SAMPLE_RATE='sentry.sample_rate';

?

Copy link
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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 threadpackages/core/src/tracing/span.ts Outdated
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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 32a5352 to f49dfc2CompareJanuary 8, 2024 15:27
@mydea

mydea commented Jan 8, 2024

Copy link
Copy Markdown
MemberAuthor

I updated this with new semantic attribute constants!

@lforstlforst left a comment

Copy link
Copy Markdown
Contributor

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch 2 times, most recently from 15fbba1 to 8257765CompareJanuary 8, 2024 16:14

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

Copy link
Copy Markdown
MemberAuthor

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
Copy Markdown
Contributor

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.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

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
mydeaforce-pushed the fn/deprecate-spanMetadata branch from 8257765 to 4d9763aCompareJanuary 9, 2024 08:34
@mydea
mydea merged commit 0276c03 into developJan 9, 2024
@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 freeto 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.

4 participants

@mydea@lforst@Lms24@AbhiPrasad