Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

@antonfirsov@vishweshbankwar@samsp-msft@cijothomas@lmolkova@stephentoub@noahfalk@reyang@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

@antonfirsov@vishweshbankwar@samsp-msft@cijothomas@lmolkova@stephentoub@noahfalk@reyang@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

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

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

@antonfirsov@vishweshbankwar@samsp-msft@cijothomas@lmolkova@stephentoub@noahfalk@reyang@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

@antonfirsov@vishweshbankwar@samsp-msft@cijothomas@lmolkova@stephentoub@noahfalk@reyang@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

@antonfirsov@vishweshbankwar@samsp-msft@cijothomas@lmolkova@stephentoub@noahfalk@reyang@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

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

Add standard tags to HttpClient native trace instrumentation - #104251

Merged
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01
Jul 10, 2024
Merged

Add standard tags to HttpClient native trace instrumentation#104251
antonfirsov merged 17 commits into
dotnet:mainfrom
antonfirsov:request-attributes-01

Conversation

@antonfirsov

@antonfirsovantonfirsov commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

Add the following standard tags to the HTTP Request Activities started in DelegatingHandler:

http.request.method
http.request.method_original
server.address
server.port
url.full
error.type
http.response.status_code
network.protocol.version

Stable attributes not being added for now, they are not being included by the OTel SDK either:

http.request.resend_count
network.protocol.name
network.peer.port

Just like in #103769, url.full is being redacted by removing UserInfo and the query string, while exposing a System.Net.Http.DisableQueryRedaction switch for opting-out from the latter. This is equivalent to the built-in redaction of OTel SDK, except that the query string is being replaced by a single * instead of replacing values only (key1=*&key2=*), since this is more performant.

Given that the vast majority of current users of HttpClient's distributed tracing relies on the OTel SDK, this redaction technique should not regress those users. In .NET 10 we plan to implement something configurable.

Contributes to #93019, except the enrichment and the propagator aspects which are no longer realistic to address for .NET 9.

@vishweshbankwar note that this is breaking the SDK, since it should now conditionally compile against .NET 9+ so it doesn't double job adding tags. PTAL if it meets your expectations.

cc @samsp-msft@noahfalk

PS: For Aspire dashboard output see #104251 (comment)

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@vishweshbankwar

Copy link
Copy Markdown
Contributor

@antonfirsov - Are you planning to add support for this?

@ghost

ghost commented Jul 1, 2024

Copy link
Copy Markdown

@antonfirsov@vishweshbankwar are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/4c69afa2fbb3b9d84b45bd73dcfad43331516e69/src/OpenTelemetry.Instrumentation.Http/Implementation/HttpHandlerDiagnosticListener.cs#L147

Using a custom ActivityListener to enrich the activity will not give access to the HttpRequestMessage (or it will be necessary to subscribe to System.Net.Http.HttpRequestOut.Start/Stop events as the OTel SDK does today).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

@antonfirsov - Are you planning to add support for this?

@vishweshbankwar does that text mean that the tags should be passed to ActivitySource.(Create|Start)Activity? What should happen if the activity is created via the ctr. /cc @lmolkova

@vishweshbankwar

vishweshbankwar commented Jul 1, 2024

Copy link
Copy Markdown
Contributor

What should happen if the activity is created via the ctr.

That part would stay same.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

are there plans to add a feature in the runtime or OTel SDK to enable enrichment of the activity?

@joegoldman2 enrichment capability will be hopefully added to System.Net.Http in .NET 10. The OTel SDK already exposescallbacks for for that.

@samsp-msft

Copy link
Copy Markdown

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc.
The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated

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

This looks pretty good to me. A couple things to consider called out in comments inline. Thanks @antonfirsov!

Comment threadsrc/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs Outdated
Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@cijothomas

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context!
I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

Comment threadsrc/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs Outdated
@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

Works with Aspire dashboard as expected:

image

@lmolkova

Copy link
Copy Markdown

Works with Aspire dashboard as expected:

🥇

Thanks!

Just noticed: could we also set display name to method? (the one in the http.request.method if it's a known method or HTTP if not known)

The {method} MUST be {http.request.method} if the method represents the original method known to the instrumentation. In other cases (when {http.request.method} is set to _OTHER), {method} MUST be HTTP.

link

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

could we also set display name to method

@lmolkova does that count as a breaking change?

Comment threadsrc/libraries/System.Net.Http/tests/FunctionalTests/DiagnosticsTests.cs Outdated
@lmolkova

Copy link
Copy Markdown

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

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

@vishweshbankwar

Copy link
Copy Markdown
Contributor

@lmolkova does that count as a breaking change?

The OperationName is still the same, but more importantly - did anyone use plain HTTP client instrumentation before?

Adding @vishweshbankwar in case he has any thoughts.

Agree with @lmolkova. In general, I have only seen OperationName being used in older SDKs which won't be impacted with this.

@vishweshbankwar

Copy link
Copy Markdown
Contributor

My goals for getting this in (without Enrichment) is so that the instrumentation libraries are not needed for the basic scenarios, especially being able to do auto-instrumentation out of process via EventPipe, such as with .NET Monitor. In that scenario, we want the Activities to have the OTel data directly on them, so when its collected, it has everything that is needed. In that scenario, the application will not have referenced the OTel libraries or setup OTel etc. The desire to get this into .NET 9 is so that more applications can be monitored using that technique, rather than just those built with the latest runtimes.

Thanks for the additional context! I wonder what should happen to the OTel's instrumentation library for HttpClient? Would it continue to exist for .NET 9 and newer versions, and provide enrichment/filtering capability for users?

OTel instrumentation library would continue to exist and provide enrichment/filtering. In terms of implementation, it will no longer need to set tags/status on activity.

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@antonfirsov

Copy link
Copy Markdown
ContributorAuthor

/ba-g CI failures are unrelated and/or known, eg #104650 or #63224

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.

.NET 9.0 Native Trace Instrumentation Support for HttpClient as per OTel specification

9 participants

@antonfirsov@vishweshbankwar@samsp-msft@cijothomas@lmolkova@stephentoub@noahfalk@reyang@MihaZupan