Dokumentace Domluvit pilot

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.

Požádejte o pilot zdarma

Domluvit pilot