feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@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(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers - #5292

Merged
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries
Jun 23, 2022
Merged

feat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headers#5292
Lms24 merged 5 commits into
masterfrom
lms-dsc-all-the-entries

Conversation

@Lms24

@Lms24Lms24 commented Jun 22, 2022

Copy link
Copy Markdown
Member

This PR adds several additional Dynamic Sampling Context items to be collected, populated and propagated via baggage or sent via envelope headers. The propagated/sent data now conforms with the specs proposed in getsentry/develop#613.

With this PR, the following fields were added to DSC:

  • transaction name
  • user id
  • user segment
  • sample rate
  • public key
  • trace id

Note that trace id and public key were already previously sent with envelope headers but the SDK would send its own values instead of the trace's values in case it is not the head-of-trace SDK. This PR also fixes that, in the sense that all trace envelope header data items are directly taken from the DSC we either received from an incoming baggage header or from the one we populate instead.

In addition to these fields, this PR makes the following changes:

  • store final baggage in event.sdkProcessingMetadata (was previously stored in event.contexts.baggage which was wrong, caused a bug and caused the baggage to even be sent to Sentry (which we do not want in this form).
  • fix a bug where populated DSC (which was set immutable) would not be stored on the span. This bug would have affected data consistency across multiple outgoing requests in one transaction, where the second/third/etc outgoing requests would potentially still find a mutable baggage object and populate it again
  • rename _getBaggageDataWithSentryValues to _populateBaggageDataWithSentryValues because it better describes the purpose of the function

There are still more open tasks to address to improve DSC propagation (e.g. new handling of 3rd party baggage, adjusting naming to DSC rather than baggage) but this will be done in a follow-up PR.

Fixes#5290

@Lms24
Lms24 marked this pull request as draft June 22, 2022 08:33
@Lms24Lms24 changed the title feat(tracing): Add additional dynamic sampling context items to bagggae and envelope headersfeat(tracing): Add additional Dynamic Sampling Context items to baggage and envelope headersJun 22, 2022
@github-actions

github-actionsBot commented Jun 22, 2022

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser - ES5 CDN Bundle (gzipped + minified)19.39 KB (added)
@sentry/browser - ES5 CDN Bundle (minified)59.95 KB (added)
@sentry/browser - ES6 CDN Bundle (gzipped + minified)18.18 KB (added)
@sentry/browser - ES6 CDN Bundle (minified)53.57 KB (added)
@sentry/browser - Webpack (gzipped + minified)19.96 KB (added)
@sentry/browser - Webpack (minified)65.02 KB (added)
@sentry/react - Webpack (gzipped + minified)19.98 KB (added)
@sentry/nextjs Client - Webpack (gzipped + minified)44.25 KB (added)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified)25.79 KB (added)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified)24.26 KB (added)

@Lms24
Lms24 marked this pull request as ready for review June 22, 2022 13:24
@Lms24
Lms24 requested review from AbhiPrasad and lforstJune 22, 2022 13:24
@AbhiPrasadAbhiPrasad added this to the Dynamic Sampling milestone Jun 22, 2022

@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.

Looking good! One minor thing and one I'm not entirely sure on.

): EventEnvelopeHeaders {
const baggage = event.contexts && (event.contexts.baggage as BaggageObj);
const { environment, release, transaction, userid, usersegment } = baggage || {};
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;

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.

Yup, having this in the sdkProcessingMetadata makes so much more sense.

Comment threadpackages/tracing/src/span.ts Outdated
const { publicKey } = (client && client.getDsn()) || {};

const metadata = this.transaction && this.transaction.metadata;
const sampelRate = metadata && metadata.transactionSampling && metadata.transactionSampling.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.

s/sampelRate/sampleRate/ :D

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.

Whoops 😅

Comment threadpackages/hub/src/scope.ts Outdated
Comment on lines +474 to +479
// Since we're storing dynamic sampling context data in the event.sdkProcessingMetadata
// field We have to re-apply it after we applied the Scope's field.
// (This is because we're storing this data on the span and not on the scope)
const baggage = event.sdkProcessingMetadata && event.sdkProcessingMetadata.baggage;
event.sdkProcessingMetadata = this._sdkProcessingMetadata || {};
event.sdkProcessingMetadata.baggage = baggage;

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'm wondering. This already seemed kinda sketchy before you changed it. Did this line just overwrite/wipe the entire metadata from before? Would it be an option here to just merge them instead (like we do with the breadcrumbs and basically everything else (extra, tags, user, ...) above)?

Like this for example:

event.sdkProcessingMetadata={ ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata};// We probably want this ordering

Wdyt?

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.

Did this line just overwrite/wipe the entire metadata from before?

Yes, everything that was on event.sdkProcessingMetadata.

I had the same feeling when writing this hack. Decided to go with it anyway because I thought that there was a reason for why we do this.
However, I just tried your suggestion and our tests still seem to pass, with it in, so I'll take it. Thanks :D

Comment on lines +81 to +82
'sentry-environment=prod,sentry-release=1.0,sentry-transaction=GET%20%2Ftest%2Fexpress,sentry-samplerate=1,' +
'sentry-publickey=public,sentry-traceid=',

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.

Doesn't really matter here and it's very subjective but I personally avoid breaking up strings this way, simply because it's less "searchable". No action required though - just wanted to get this thought out ^^

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.

Yup but I also don't like super long strings that heavily exceed the characters-per-line limit. Very annoying when working with split editor windows 😅

*/
private _getBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
private _populateBaggageWithSentryValues(baggage: Baggage = createBaggage({})): Baggage {
// Because of a cicular dependency, we cannot import the Transaction class here, hence the type casts

@lforstlforstJun 23, 2022

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.

As discussed: Root cause of the circular dependency is, that we have some of the Dynamic Sampling Context functionality on the Span class, while it should probably all live on the Transaction class.

We will clean this up in a follow-up PR so no required action on this for now.

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.

Almost done with it already. Will make a PR soon

Simplify applyToEvent logic
@Lms24
Lms24 requested a review from lforstJune 23, 2022 10:55
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.

[DSC] include tracesSampleRate in Dynamic Sampling Context

3 participants

@Lms24@lforst@AbhiPrasad