feat(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24
, '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(node): Ensure tracing without performance (TWP) works - #11564

Merged
mydea merged 13 commits into
developfrom
fn/twp-node
Apr 15, 2024
Merged

feat(node): Ensure tracing without performance (TWP) works#11564
mydea merged 13 commits into
developfrom
fn/twp-node

Conversation

@mydea

@mydeamydea commented Apr 11, 2024

Copy link
Copy Markdown
Member

This fixes the node SDK to make tracing without performance work as expected.

This has three aspects:

  1. Ensure we always have an url to check against tracePropagationTargets, even if the span is not sampled.
  2. Ensure we use the correct propagation context always
  3. Ensure we actually consistently handle ougoing http.client spans without an active transaction

The fix for 2. was to have a fallback behavior if we don't have a scope linked to a context yet (we'll just use the current scope then). This is needed because we won't necessarily have an assigned scope yet at the time this is called, because at this point in time this is still a floating context. This also meant removing the fallback code to look at the remote span context (because we'll always have a scope now).

The fix for 3. was to move this out of the http integration and do this in the sampler instead.

The fix for 1. was a bit more elaborate, because we require different things to solve the http instrumentation and the fetch instrumentation.

For fetch, we leverage our sampler, which can attach trace state that even unsampled spans will have. We attach the URL as trace state which we can read in the propagator, ensuring this works even for unsampled spans.

Sadly, for http this is not sufficient, because our usage of onlyIfParentForOutgoingRequest lead to some spans being created outside of the sampler. By removing this option (see 3) and doing stuff in the sampler instead, we can ensure that all spans for http are handled properly.

This also bumps our node-fetch otel instrumentation to 1.2.0 which fixes headers for Node 21 (tests were actually failing without this!).

@mydeamydea self-assigned this Apr 11, 2024
@github-actions

github-actionsBot commented Apr 11, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.17 KB (0%)
@sentry/browser (incl. Tracing)31.77 KB (0%)
@sentry/browser (incl. Tracing, Replay)67.08 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags60.49 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas)70.92 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback)80.81 KB (0%)
@sentry/browser (incl. Feedback)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal)35.73 KB (0%)
@sentry/browser (incl. Feedback, Feedback Modal, Feedback Screenshot)37.75 KB (0%)
@sentry/browser (incl. sendFeedback)26.97 KB (0%)
@sentry/react24.85 KB (0%)
@sentry/react (incl. Tracing)34.67 KB (0%)
@sentry/vue25.74 KB (0%)
@sentry/vue (incl. Tracing)33.48 KB (0%)
@sentry/svelte22.3 KB (0%)
CDN Bundle24.29 KB (0%)
CDN Bundle (incl. Tracing)32.79 KB (0%)
CDN Bundle (incl. Tracing, Replay)66.44 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback)82.61 KB (0%)
CDN Bundle - uncompressed72.37 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed98.42 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed208.08 KB (0%)
@sentry/nextjs (client)34.03 KB (0%)
@sentry/sveltekit (client)32.27 KB (0%)
@sentry/node120.41 KB (+0.07% 🔺)

@mydea
mydea marked this pull request as ready for review April 12, 2024 07:59

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

Important tests.

To me, this change screams that we need to decouple our propagation logic from opentlemetry as it seem like OTEL is a bit incompatible with our concept for twp.

Comment on lines +94 to +98

const scopes = getCapturedScopesOnSpan(span);

const isolationScope = (scopes.isolationScope || getIsolationScope()).clone();
const scope = scopes.scope || getCurrentScope();

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.

Why are we moving this above the early return? As far as I can see it doesn't do anything right? (Also the "Update the isolation scope, isolate this request" comment is a bit orphanded 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.

good point, I moved stuff around multiple times here, will move it back down!

Comment threadpackages/node/src/integrations/http.ts
@mydea
mydea merged commit 832a7bf into developApr 15, 2024
@mydea
mydea deleted the fn/twp-node branch April 15, 2024 09:48
Lms24 added a commit that referenced this pull request Apr 17, 2024
…ario (#11636) (#11659)
For some reason, this commit (#11564) caused a conflict in our
master->develop sync. Let's fix this by cherry picking it onto master.
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.

3 participants

@mydea@lforst@Lms24