INTEGRITY Dokumentace

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.