Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: Undici / Global Fetch integration #1615

Open
flovilmart opened this issue Sep 15, 2021 · 25 comments
Open

Feature Request: Undici / Global Fetch integration #1615

flovilmart opened this issue Sep 15, 2021 · 25 comments

Comments

@flovilmart
Copy link

Hi there!

We're starting to shift away from axios / request and wish to roll out undici in our new deployments.
Unfortunately, there is no 'official' tracing package for it.

Is it something that is being worked on? Would a PR be accepted to add an undici plugin? Should I be aware of any 🐉 ?

Thanks!

@rochdev
Copy link
Member

rochdev commented Sep 15, 2021

Is it something that is being worked on?

We've been looking into using Undici for sending traces, but we haven't looked into writing a plugin for it yet.

Would a PR be accepted to add an undici plugin?

Definitely accepted and welcomed!

Should I be aware of any 🐉 ?

Not that I know of, it should be pretty similar to other HTTP servers/clients that are already supported.

@flovilmart
Copy link
Author

Thanks @rochdev ; I'll draw some inspiration from the http tracing plugin.

@bengl
Copy link
Collaborator

bengl commented Sep 15, 2021

@flovilmart Note also that undici has also recently added support for diagnostics channel, so we'll want to use that in versions of undici where that's available.

https://github.com/nodejs/undici/blob/main/docs/api/DiagnosticsChannel.md

@flovilmart
Copy link
Author

That's a super neat feature those diagnostics channels!
I assume we want both implementations and patch based on the node.js and undici versions?

@rochdev
Copy link
Member

rochdev commented Sep 30, 2021

@flovilmart It should be based on the undici version, but the Node version shouldn't matter since in older versions the module will not exist so the plugin will simply never run. Since we're in the process of rewriting a lot of how plugins work and there are no examples currently of using diagnostics channel in a plugin, I would recommend writing the plugin like any other plugin (for example HTTP) and not worry about diagnostics channel for now.

@flovilmart
Copy link
Author

OK that works for me @rochdev , we're not even on node 16 yet! I planned to get on that next week.

@flovilmart
Copy link
Author

Got this nodejs/undici#1053 patch done for undici for better compatibility.

Outside the request call, patching all other API's (pipeline, stream etc...) is proven to be cumbersome.

The implementation through the diag channels is very straightforward with some book-keeping.
I'll visit the implementation through patching the Client and Request objects after.

@flovilmart
Copy link
Author

@rochdev , what do you think about this:nodejs/undici#1053 (comment)?

@rochdev
Copy link
Member

rochdev commented Oct 5, 2021

@flovilmart Actually it's fine if the implementation in Undici is backed 100% by diagnostics channel. My thought was that we need to do the monkey-patching anyway to support older versions of Undici without the channel available. In that sense, the idea was to first implement the monkey-patching and then add support to use the channel once it lands in Undici. This doesn't mean adding any monkey-patching ability to Undici since that would be redundant when the channels are available.

So basically:

  • dd-trace would support older versions of Undici with monkey-patching.
  • dd-trace would support newer versions of Undici with diagnostics channel subscribers when the publishers are implemented in Undici.

In both cases, no change is needed in Undici other than adding diagnostics channel support.

@flovilmart
Copy link
Author

@rochdev @bengl I've open the PR above to gather initial feedback around the implementation.
Notably, the next tests seem to fails because of the inclusion of the diagnostic_channels module. Any guidance on the workaround?

For now, I'm waiting for a new release of undici, which explains why the tests are currently failing.

@rochdev
Copy link
Member

rochdev commented Oct 19, 2021

Notably, the next tests seem to fails because of the inclusion of the diagnostic_channels module. Any guidance on the workaround?

@flovilmart Not sure why these would interact. Can you try rebasing the PR? There was a change to how Next is tests a few weeks ago, maybe that change wasn't in your branch and it would fix the issue.

@flovilmart
Copy link
Author

Interesting! I've rebased, let's see how it goes!

@JustinTRoss
Copy link
Contributor

JustinTRoss commented Jan 27, 2022

Any resolution on this since? I see in your PR that there has been some back and forth on whether to solve monkey-patching or diagnostic channels approach first.

Are we pinning this to Undici DC PR as a dependency?

@flovilmart
Copy link
Author

@JustinTRoss I haven't had a chance to actually move forward with a new implementation; the monkey patching look very complex given undici's architecture; there are multiple APIs that leverage dispatchers differently, I haven't found any "clean" monkey patching strategy for all APIs (request, client, pipeline etc...)

@Grmiade
Copy link

Grmiade commented Aug 29, 2022

Any news on this subject?
Since the last versions of NodeJS use Undici to implement the built-in Fetch API, it could be great to have this support =)

@flovilmart
Copy link
Author

@Grmiade yep agreed - I haven't had the chance to improve on the current design and address the comments.

@rochdev
Copy link
Member

rochdev commented Aug 30, 2022

We're actually in the process of finalizing the approach of instrumenting with async_hooks and diagnostics_channel now that we have rewritten 50+ plugins and put it to the test, so might be worth it waiting a few weeks so that this can be added in Undici directly. We're planning to implement the new API directly in Node core and ship a polyfill.

@kibertoad
Copy link

@flovilmart Maybe it might make sense to skip the complex monkey-patching altogether and only support newer versions of Undici?

@rochdev
Copy link
Member

rochdev commented Oct 13, 2022

Quick update related to the above: we're currently finishing up the new approach which we'll be trying internally in the next few weeks, and we plan to add instrumentation to Undici directly in Node core soon after. That work can be tracked in nodejs/node#44943

@flovilmart
Copy link
Author

Amazing work @rochdev glad your team was able to pull it through! That was not a simple endeavour!

@mrkosima
Copy link

hello there, are there any updates on Undici support?

@saimon-moore
Copy link

Looks like this nodejs/node#44943 was merged so I guess this is closer now?

@SimpleCreations
Copy link

I see that support for fetch has been added here (#3258).
Does this mean this issue can be closed now?

@cassidycodes
Copy link

We tested out undici for our gateway application and datadog didn't report any traces for backend services when we used undici. I don't think this issue can be closed until dd-trace supports undici.

We are using dd-trace-js v 4.14.0

@SimpleCreations
Copy link

I meant to say that most people want undici support because the Fetch API uses undici. But I guess there are cases when one might use undici without fetch.

@tlhunter tlhunter changed the title Support for undici tracing Feature Request: Undici Support Dec 18, 2023
@tlhunter tlhunter changed the title Feature Request: Undici Support Feature Request: Undici / Global Fetch integration Dec 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.