-
Notifications
You must be signed in to change notification settings - Fork 541
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* feat: add debug support through diagnostics channel * refactor: replace old diagnostics with new abstraction * refactor: handle diagnostics simpler * test: move tests to 'right' path * fix: smaller tweaks * refactor: use debuglog instead * docs: add documentation * fix: code review * test: add testing coverage * refactor: remove leftover
- Loading branch information
1 parent
c89e3ff
commit 77333e7
Showing
18 changed files
with
410 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# Debug | ||
|
||
Undici (and subsenquently `fetch` and `websocket`) exposes a debug statement that can be enabled by setting `NODE_DEBUG` within the environment. | ||
|
||
The flags availabile are: | ||
|
||
## `undici` | ||
|
||
This flag enables debug statements for the core undici library. | ||
|
||
```sh | ||
NODE_DEBUG=undici node script.js | ||
|
||
UNDICI 16241: connecting to nodejs.org using https:h1 | ||
UNDICI 16241: connecting to nodejs.org using https:h1 | ||
UNDICI 16241: connected to nodejs.org using https:h1 | ||
UNDICI 16241: sending request to GET https://nodejs.org// | ||
UNDICI 16241: received response to GET https://nodejs.org// - HTTP 307 | ||
UNDICI 16241: connecting to nodejs.org using https:h1 | ||
UNDICI 16241: trailers received from GET https://nodejs.org// | ||
UNDICI 16241: connected to nodejs.org using https:h1 | ||
UNDICI 16241: sending request to GET https://nodejs.org//en | ||
UNDICI 16241: received response to GET https://nodejs.org//en - HTTP 200 | ||
UNDICI 16241: trailers received from GET https://nodejs.org//en | ||
``` | ||
|
||
## `fetch` | ||
|
||
This flag enables debug statements for the `fetch` API. | ||
|
||
> **Note**: statements are pretty similar to the ones in the `undici` flag, but scoped to `fetch` | ||
```sh | ||
NODE_DEBUG=fetch node script.js | ||
|
||
FETCH 16241: connecting to nodejs.org using https:h1 | ||
FETCH 16241: connecting to nodejs.org using https:h1 | ||
FETCH 16241: connected to nodejs.org using https:h1 | ||
FETCH 16241: sending request to GET https://nodejs.org// | ||
FETCH 16241: received response to GET https://nodejs.org// - HTTP 307 | ||
FETCH 16241: connecting to nodejs.org using https:h1 | ||
FETCH 16241: trailers received from GET https://nodejs.org// | ||
FETCH 16241: connected to nodejs.org using https:h1 | ||
FETCH 16241: sending request to GET https://nodejs.org//en | ||
FETCH 16241: received response to GET https://nodejs.org//en - HTTP 200 | ||
FETCH 16241: trailers received from GET https://nodejs.org//en | ||
``` | ||
|
||
## `websocket` | ||
|
||
This flag enables debug statements for the `Websocket` API. | ||
|
||
> **Note**: statements can overlap with `UNDICI` ones if `undici` or `fetch` flag has been enabled as well. | ||
```sh | ||
NODE_DEBUG=fetch node script.js | ||
|
||
WEBSOCKET 18309: connecting to echo.websocket.org using https:h1 | ||
WEBSOCKET 18309: connected to echo.websocket.org using https:h1 | ||
WEBSOCKET 18309: sending request to GET https://echo.websocket.org// | ||
WEBSOCKET 18309: connection opened <ip_address> | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
'use strict' | ||
const diagnosticsChannel = require('diagnostics_channel') | ||
const util = require('util') | ||
|
||
const undiciDebugLog = util.debuglog('undici') | ||
const fetchDebuglog = util.debuglog('fetch') | ||
const websocketDebuglog = util.debuglog('websocket') | ||
let isClientSet = false | ||
const channels = { | ||
// Client | ||
beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), | ||
connected: diagnosticsChannel.channel('undici:client:connected'), | ||
connectError: diagnosticsChannel.channel('undici:client:connectError'), | ||
sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'), | ||
// Request | ||
create: diagnosticsChannel.channel('undici:request:create'), | ||
bodySent: diagnosticsChannel.channel('undici:request:bodySent'), | ||
headers: diagnosticsChannel.channel('undici:request:headers'), | ||
trailers: diagnosticsChannel.channel('undici:request:trailers'), | ||
error: diagnosticsChannel.channel('undici:request:error'), | ||
// WebSocket | ||
open: diagnosticsChannel.channel('undici:websocket:open'), | ||
close: diagnosticsChannel.channel('undici:websocket:close'), | ||
socketError: diagnosticsChannel.channel('undici:websocket:socket_error'), | ||
ping: diagnosticsChannel.channel('undici:websocket:ping'), | ||
pong: diagnosticsChannel.channel('undici:websocket:pong') | ||
} | ||
|
||
if (undiciDebugLog.enabled || fetchDebuglog.enabled) { | ||
const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog | ||
|
||
// Track all Client events | ||
diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { | ||
const { | ||
connectParams: { version, protocol, port, host } | ||
} = evt | ||
debuglog( | ||
'connecting to %s using %s%s', | ||
`${host}${port ? `:${port}` : ''}`, | ||
protocol, | ||
version | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { | ||
const { | ||
connectParams: { version, protocol, port, host } | ||
} = evt | ||
debuglog( | ||
'connected to %s using %s%s', | ||
`${host}${port ? `:${port}` : ''}`, | ||
protocol, | ||
version | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { | ||
const { | ||
connectParams: { version, protocol, port, host }, | ||
error | ||
} = evt | ||
debuglog( | ||
'connection to %s using %s%s errored - %s', | ||
`${host}${port ? `:${port}` : ''}`, | ||
protocol, | ||
version, | ||
error.message | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { | ||
const { | ||
request: { method, path, origin } | ||
} = evt | ||
debuglog('sending request to %s %s/%s', method, origin, path) | ||
}) | ||
|
||
// Track Request events | ||
diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { | ||
const { | ||
request: { method, path, origin }, | ||
response: { statusCode } | ||
} = evt | ||
debuglog( | ||
'received response to %s %s/%s - HTTP %d', | ||
method, | ||
origin, | ||
path, | ||
statusCode | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { | ||
const { | ||
request: { method, path, origin } | ||
} = evt | ||
debuglog('trailers received from %s %s/%s', method, origin, path) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:request:error').subscribe(evt => { | ||
const { | ||
request: { method, path, origin }, | ||
error | ||
} = evt | ||
debuglog( | ||
'request to %s %s/%s errored - %s', | ||
method, | ||
origin, | ||
path, | ||
error.message | ||
) | ||
}) | ||
|
||
isClientSet = true | ||
} | ||
|
||
if (websocketDebuglog.enabled) { | ||
if (!isClientSet) { | ||
const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog | ||
diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { | ||
const { | ||
connectParams: { version, protocol, port, host } | ||
} = evt | ||
debuglog( | ||
'connecting to %s%s using %s%s', | ||
host, | ||
port ? `:${port}` : '', | ||
protocol, | ||
version | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { | ||
const { | ||
connectParams: { version, protocol, port, host } | ||
} = evt | ||
debuglog( | ||
'connected to %s%s using %s%s', | ||
host, | ||
port ? `:${port}` : '', | ||
protocol, | ||
version | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { | ||
const { | ||
connectParams: { version, protocol, port, host }, | ||
error | ||
} = evt | ||
debuglog( | ||
'connection to %s%s using %s%s errored - %s', | ||
host, | ||
port ? `:${port}` : '', | ||
protocol, | ||
version, | ||
error.message | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { | ||
const { | ||
request: { method, path, origin } | ||
} = evt | ||
debuglog('sending request to %s %s/%s', method, origin, path) | ||
}) | ||
} | ||
|
||
// Track all WebSocket events | ||
diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { | ||
const { | ||
address: { address, port } | ||
} = evt | ||
websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : '') | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { | ||
const { websocket, code, reason } = evt | ||
websocketDebuglog( | ||
'closed connection to %s - %s %s', | ||
websocket.url, | ||
code, | ||
reason | ||
) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { | ||
websocketDebuglog('connection errored - %s', err.message) | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { | ||
websocketDebuglog('ping received') | ||
}) | ||
|
||
diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { | ||
websocketDebuglog('pong received') | ||
}) | ||
} | ||
|
||
module.exports = { | ||
channels | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.