fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea
, '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

fix(opentelemetry): Always use active span in Propagator.inject - #13381

Merged
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData
Sep 18, 2024
Merged

fix(opentelemetry): Always use active span in Propagator.inject#13381
Lms24 merged 13 commits into
developfrom
lms/fix-opentelemetry-getInjectionData

Conversation

@Lms24

@Lms24Lms24 commented Aug 14, 2024

Copy link
Copy Markdown
Member

This PR attempts to fix an inconsistency in TwP mode where we previously returned a different trace id in getTraceData than the one we include in the trace context of error events.

Background:

  • when we create the error event, we create the trace context from the active span (if there is one)
    • since there always is an ambient, non-recording span in TwP mode, we always take this span's traceId
  • for getTraceData, we take the span id from Propagator.inject
    • which checks hasTracingEnabled to either return the traceId from a span (true) or from the propagationContext on the scope (false).
    • this happens in the getInjectionData helper function

=> This PR removes the check for hasTracingEnabled in getInjectionData and simply always takes the non-recording span if there is one. Which I guess(?) is always the case 🤔

I'm not sure if this is the way to fix this but it is one way and it seems to not break any existing tests.
Also added a regression test that only passes with this fix.

Alternatively, we can adapt the error event creation pipeline to follow the same logic for the trace context as in our propagator. For example, we create a potel/core (acs) implementation for something like getTraceContext. I can look into this if reviewers prefer it. I guess it comes down to: Do we effectively want to replace the propagationContext with the ambient non-recording span or should we still fall back to the PC if we're in TwP mode?

@github-actions

github-actionsBot commented Aug 14, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser22.52 KB--
@sentry/browser - with treeshaking flags21.3 KB--
@sentry/browser (incl. Tracing)34.8 KB--
@sentry/browser (incl. Tracing, Replay)71.26 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags61.7 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)75.61 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.39 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.23 KB--
@sentry/browser (incl. metrics)26.83 KB--
@sentry/browser (incl. Feedback)39.66 KB--
@sentry/browser (incl. sendFeedback)27.19 KB--
@sentry/browser (incl. FeedbackAsync)31.96 KB--
@sentry/react25.28 KB--
@sentry/react (incl. Tracing)37.77 KB--
@sentry/vue26.72 KB--
@sentry/vue (incl. Tracing)36.67 KB--
@sentry/svelte22.66 KB--
CDN Bundle23.83 KB--
CDN Bundle (incl. Tracing)36.56 KB--
CDN Bundle (incl. Tracing, Replay)71.02 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.33 KB--
CDN Bundle - uncompressed69.81 KB--
CDN Bundle (incl. Tracing) - uncompressed108.44 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed220.21 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed233.43 KB--
@sentry/nextjs (client)37.53 KB--
@sentry/sveltekit (client)35.37 KB--
@sentry/node121.05 KB-0.01%-6 B 🔽
@sentry/node - without tracing93.34 KB--
@sentry/aws-serverless103.04 KB-0.01%-6 B 🔽

View base workflow run

@Lms24Lms24 closed this Aug 14, 2024
@Lms24Lms24 reopened this Aug 14, 2024
Comment on lines +20 to +24
res.send({
traceData: Sentry.getTraceData(),
traceMetaTags: Sentry.getTraceMetaTags(),
errorTraceContext: event.contexts.trace,
});

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.

I get this is not the way how we usually test event payloads but I don't think I can assert on a specific traceId in our runner expectError function which we don't know upfront.

Comment on lines +35 to +39
expect(traceData).toEqual({
'sentry-trace': `${traceId}-${spanId}`,
baggage: expect.stringContaining(`sentry-trace_id=${traceId}`),
});

expect(traceMetaTags).toContain(`content="${traceId}-${spanId}"/>\n`);
expect(traceMetaTags).toContain(`sentry-trace_id=${traceId}`);

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.

these trace and span ids were not the same as the error trace context's trace id without the change

@Lms24
Lms24 requested review from AbhiPrasad and mydeaAugust 14, 2024 16:38
@Lms24Lms24 changed the title fix(opentelemetry): Always use active span in getInjectionDatafix(opentelemetry): Always use active span in Propagator.injectAug 14, 2024
@Lms24Lms24 self-assigned this Aug 14, 2024
@Lms24

Copy link
Copy Markdown
MemberAuthor

Hmm I don't understand why the node integration tests fail on CI. They pass locally so I suspect it's rather a test problem than a problem with the change. But I'll look into this on Monday.

@Lms24
Lms24 marked this pull request as ready for review August 14, 2024 16:54
@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 29e1ae0 to 733483dCompareAugust 30, 2024 08:45

@mydeamydea left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I am not 100% sure anymore if/why this was necessary in the PR that introduced this (#11564). But if tests pass, this should be fine I'd say 😅

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

@Lms24
Lms24force-pushed the lms/fix-opentelemetry-getInjectionData branch from 733483d to 79921ffCompareSeptember 18, 2024 08:20
@mydea

Copy link
Copy Markdown
Member

FWIW there is not always a remote span active, only if an incoming trace is continued I believe.

Right... let me check the scenario for when there's no incoming trace then 😅

@mydea so the thing is, the test I added has no incoming trace headers. So looks like we always have an active span now? 😅

Not 100% sure, but I think we always have an active span if there is an incoming request. We probably (I think?) have none when outside of a request context 🤔 I think the propagator always creates a virtual span, but extract only runs for incoming requests!

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh I see, so adding a test without a server should cover this scenario then, right?

@mydea

Copy link
Copy Markdown
Member

Ahh I see, so adding a test without a server should cover this scenario then, right?

I'd say so 👍

@Lms24

Copy link
Copy Markdown
MemberAuthor

I added a test for non-server/request events. Also rewrote the existing test for events within a request. Looks like TwP mode now has consistent traces everywhere. Just gotta get them passing in CI now 😅

@Lms24

Copy link
Copy Markdown
MemberAuthor

Ahh yes, I think this makes sense now! In case there's no active span, we simply fall back to reading the trace from the propagationContext on the scope. Which is identical to what we do when populating the trace context. I'm going to merge this PR.

@Lms24
Lms24 merged commit 14f0b6e into developSep 18, 2024
@Lms24
Lms24 deleted the lms/fix-opentelemetry-getInjectionData branch September 18, 2024 14:37
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.

2 participants

@Lms24@mydea