Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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" + '
Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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('^' + ".*" + ' Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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('^' + ".*" + ' Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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" + ' Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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('^' + ".*" + ' Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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('^' + ".*" + ' Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk
, '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); } })(); })(); Remove public provider from rundown session by davmason · Pull Request #91383 · dotnet/runtime · GitHub
Skip to content

Remove public provider from rundown session - #91383

Merged
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads
Sep 13, 2023
Merged

Remove public provider from rundown session#91383
davmason merged 10 commits into
dotnet:mainfrom
davmason:rundown_threads

Conversation

@davmason

Copy link
Copy Markdown
Contributor

Fixes#90575

When we start rundown we set the level/keywords on the public and the rundown provider:

ep_provider_config_init (&rundown_providers [0], ep_config_get_public_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Public provider.
ep_provider_config_init (&rundown_providers [1], ep_config_get_rundown_provider_name_utf8 (), keywords, verbose_logging_level, NULL); // Rundown provider.
// Update provider list with rundown configuration.
for (uint32_ti=0; i<rundown_providers_len; ++i) {
constEventPipeProviderConfiguration*config=&rundown_providers [i];
EventPipeSessionProvider*session_provider=ep_session_provider_alloc (
ep_provider_config_get_provider_name (config),
ep_provider_config_get_keywords (config),
ep_provider_config_get_logging_level (config),
ep_provider_config_get_filter_data (config));
ep_raise_error_if_nok (ep_session_add_session_provider (session, session_provider));
}

If the user has a different set of events enabled for the public provider this can introduce unwanted events in the trace - i.e. GC events in a trace that specifically excludes them.

I tested that a CPU trace still symbolicates code properly in perfview and VS, if there are other scenarios people think of please let me know.

@davmasondavmason added this to the 9.0.0 milestone Aug 31, 2023
@davmason
davmason requested review from a team, brianrob and lateralusXAugust 31, 2023 09:28
@davmasondavmason self-assigned this Aug 31, 2023

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

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

@brianrob

Copy link
Copy Markdown
Member

Couldn't we just remove adding the public provider to rundown? I seen other strange artifacts due to this in the provider callback that would be eliminated if we didn't add the public provider during rundown. I looked through Mono and nothing in its rundown implementation uses events outside of the rundown provider, I assume the same applies to CoreCLR/NativeAOT.

I am wondering about this as well. Is the reason that these events show up because the hardcoded rundown configuration enables the public provider at verbose level? If so, then I'm thinking that removing the public provider is probably the right answer.

@davmason

Copy link
Copy Markdown
ContributorAuthor

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

@brianrob

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

Reasonably confident, but perhaps this is a good opportunity to consider making rundown configurable? I'm not sure how much work that is though.

@lateralusX

lateralusX commented Sep 1, 2023

Copy link
Copy Markdown
Member

When Noah and I were chatting about this we couldn't be sure if any scenario relied on the public provider during rundown. How confident are we that we won't break any existing scenario by removing the public provider?

I looked through Mono's rundown implementation and the events we emit are only from the rundown provider. Maybe we could do similar check on CoreCLR, ETW::EnumerationLog::EndRundown (). A brief look indicates that it is mainly using the rundown provider to decide what different events to emit. The events that it emits all seems to be DC kind of events, there is one exception checking the private provider:

BOOL bIsRichDebugInfoEnabled =
ETW_EVENT_ENABLED(MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context, JittedMethodRichDebugInfo);

but since the private provider has not been part of rundown, this is either used in some different scenario (maybe ETW) or not working.

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

@davmason

Copy link
Copy Markdown
ContributorAuthor

Maybe we could use a variation of current fix and do some validation checks on CI, checking that written events into a session that is in rundown mode and validate that events written from rundown thread only comes from the rundown provider, if not, log and abort the process so we can track it on CI?

Great idea! I'll give it a shot

Comment threadsrc/mono/mono/eventpipe/ep-rt-types-mono.h Outdated
davmasonand others added 2 commits September 1, 2023 09:05
Co-authored-by: Aleksey Kliger (λgeek) <akliger@gmail.com>

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

The filtering seemed fine, the error checking I'm skeptical on.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-types-aot.h Outdated
@davmasondavmason changed the title Prevent other threads from writing to a session once rundown beginsRemove public provider from rundown sessionSep 8, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

After running the test CI build and local testing I flipped this to removing the public provider from rundown and changed the title to represent that.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/native/eventpipe/ep-session.c Outdated

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

LGTM!

@davmason
davmason merged commit ce0af21 into dotnet:mainSep 13, 2023
@davmason

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6182464190

@ghostghost locked as resolved and limited conversation to collaborators Oct 14, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EventPipe logs unintended events during rundown

5 participants

@davmason@brianrob@lateralusX@lambdageek@noahfalk