← Cloudflare Workers / workers / runtime-apis / nodejs
Diagnostics Channel
diagnostics_channel ↗ modul poskytuje API pro vytváření pojmenovaných kanálů k reportování libovolných dat zpráv pro diagnostické účely. Toto API je v podstatě jednoduchý model pub/sub událostí navržený speciálně pro diagnostické reportování s nízkou režií.
import {
channel,
hasSubscribers,
subscribe,
unsubscribe,
tracingChannel,
} from "node:diagnostics_channel";
// For publishing messages to a channel, acquire a channel object:
const myChannel = channel("my-channel");
// Any JS value can be published to a channel.
myChannel.publish({ foo: "bar" });
// For receiving messages on a channel, use subscribe:
subscribe("my-channel", (message) => {
console.log(message);
});Všechny Channel instance jsou singletony pro každý Isolate/kontext (například stejný vstupní bod). Odběratelé jsou vždy voláni synchronně a v pořadí, v jakém byli zaregistrováni, podobně jako EventTarget nebo Node.js EventEmitter třídu.
Integrace s Tail Workers
Při použití Tail Workers, všechny zprávy publikované do libovolného kanálu se přeposílají také do Tail Worker. V rámci Tail Workeru lze ke zprávám diagnostického kanálu přistupovat přes diagnosticsChannelEvents vlastnost:
export default {
async tail(events) {
for (const event of events) {
for (const messageData of event.diagnosticsChannelEvents) {
console.log(
messageData.timestamp,
messageData.channel,
messageData.message,
);
}
}
},
};Mějte na paměti, že zpráva publikovaná do tail workeru prochází přes algoritmus strukturovaného klonování ↗ (stejný mechanismus jako structuredClone() ↗ API), takže jsou podporovány pouze hodnoty, které lze úspěšně klonovat.
TracingChannel
Podle dokumentace Node.js: „TracingChannel ↗ je kolekce [Channels], které společně vyjadřují jednu sledovatelnou akci. TracingChannel se používá k formalizaci a zjednodušení procesu generování událostí pro trasování průběhu aplikace."
import { tracingChannel } from "node:diagnostics_channel";
import { AsyncLocalStorage } from "node:async_hooks";
const channels = tracingChannel("my-channel");
const requestId = new AsyncLocalStorage();
channels.start.bindStore(requestId);
channels.subscribe({
start(message) {
console.log(requestId.getStore()); // { requestId: '123' }
// Handle start message
},
end(message) {
console.log(requestId.getStore()); // { requestId: '123' }
// Handle end message
},
asyncStart(message) {
console.log(requestId.getStore()); // { requestId: '123' }
// Handle asyncStart message
},
asyncEnd(message) {
console.log(requestId.getStore()); // { requestId: '123' }
// Handle asyncEnd message
},
error(message) {
console.log(requestId.getStore()); // { requestId: '123' }
// Handle error message
},
});
// The subscriber handlers will be invoked while tracing the execution of the async
// function passed into `channel.tracePromise`...
channel.tracePromise(
async () => {
// Perform some asynchronous work...
},
{ requestId: "123" },
);Viz Dokumentace Node.js pro diagnostics_channel ↗ s dalšími informacemi.