Skip to content

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

@robert3005@iamdanfox@pkoenig10@carterkozak@diogoholanda
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[improvement] Correctly nest spans when tracing okhttp requests by robert3005 · Pull Request #1069 · palantir/conjure-java-runtime · GitHub
Skip to content

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

@robert3005@iamdanfox@pkoenig10@carterkozak@diogoholanda
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [improvement] Correctly nest spans when tracing okhttp requests by robert3005 · Pull Request #1069 · palantir/conjure-java-runtime · GitHub
Skip to content

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

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

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

@robert3005@iamdanfox@pkoenig10@carterkozak@diogoholanda
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [improvement] Correctly nest spans when tracing okhttp requests by robert3005 · Pull Request #1069 · palantir/conjure-java-runtime · GitHub
Skip to content

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

@robert3005@iamdanfox@pkoenig10@carterkozak@diogoholanda
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [improvement] Correctly nest spans when tracing okhttp requests by robert3005 · Pull Request #1069 · palantir/conjure-java-runtime · GitHub
Skip to content

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

@robert3005@iamdanfox@pkoenig10@carterkozak@diogoholanda
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [improvement] Correctly nest spans when tracing okhttp requests by robert3005 · Pull Request #1069 · palantir/conjure-java-runtime · GitHub
Skip to content

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

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

[improvement] Correctly nest spans when tracing okhttp requests - #1069

Closed
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans
Closed

[improvement] Correctly nest spans when tracing okhttp requests#1069
robert3005 wants to merge 3 commits into
developfrom
rk/different-spans

Conversation

@robert3005

Copy link
Copy Markdown
Contributor

Before this PR

OkHttp: execute-enqueue would measure time in dispatcher pool and acquire-limiter

After this PR

==COMMIT_MSG==
OkHttp tracing spans get correctly nested where acquire-limiter and okhttp: execute don't overlap and okhttp: execute-enqueue measures just the queuing time.
==COMMIT_MSG==

Possible downsides?

Current spans are not easy to understand - this attempts to at least make sure they measure the right thing.

@robert3005
robert3005 requested a review from a team as a code ownerApril 18, 2019 12:57
AsyncTracer tracerTag = chain.request().tag(AsyncTracer.class);
if (tracerTag == null) {
AsyncTracerTag tracerTag = chain.request().tag(AsyncTracerTag.class);
if (tracerTag == null && tracerTag.asyncTracer() == null) {

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.

npe

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

🤦‍♂️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I was surprised errorprone didn't catch this, but then I remembered we don't ahve uber's nullaway enabled!

@iamdanfox

Copy link
Copy Markdown
Contributor

I'm a bit late to this tracing game so I added some comments to try to capture the state of the world. Also here is the 'before this PR' state of the world:

Screenshot 2019-04-18 at 18 16 51

enqueueInternal(callback);
// tracer.withTrace completes the 'acquire-limiter-enqueue'
// tracer.withTrace starts the 'acquire-limiter-run' span
tracer.withTrace(() -> {

@iamdanfoxiamdanfoxApr 18, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think before merging this it would be nice to come up with a solution that doesn't require us to include the acquire-limiter-run and ignore span hacks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That was my thought as well - this pr is here to point to intended behaviour

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.

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 was the hack here needed?
It seems like leaving the old behavior would suffice to leave the acquire-limiter-run span empty and the other spans with the appropriate parents:

tracer.withTrace(() -> null);
enqueueInternal(callback);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It won't work - the callback is executed on different thread and different trace. You need to add spans to the original trace

@pkoenig10

Copy link
Copy Markdown
Member

@iamdanfox in your example, the execute-run is not actually nested under acquire-limiter-run. The alignment occurs on the left side of the div rather than the left side of the text.

@pkoenig10

pkoenig10 commented Apr 20, 2019

Copy link
Copy Markdown
Member

This implementation still nests all async spans directly under the caller's span. This makes it difficult to group spans for a request together when multiple requests are being made simultaneously.

I've put up an alternative and (IMO) simpler implementation in #1073. In that PR I updated the test before making the change to clearly show the span behavior before and after. I would appreciate if someone could take a look.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

Unfortunately the implementations aren't equivalent - this implementation tracks time spent in dispatcher queue while the other doesn't. I am happy to add another top level span but we originally thought it's not helpful, seems we have been wrong.

@robert3005

Copy link
Copy Markdown
ContributorAuthor

If you feel this is useful feel free to reopen - it seems that we aren't concerned with this issue right now

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.

5 participants

@robert3005@iamdanfox@pkoenig10@carterkozak@diogoholanda