INTEGRITY Документация

Diagnostics Channel

diagnostics_channel модуль предоставляет API для создания именованных каналов, через которые можно передавать произвольные данные сообщений для целей диагностики. По сути, это простая модель pub/sub событий, специально разработанная для диагностической отчётности с низкими накладными расходами.

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);
});

Все Channel экземпляры являются одиночными для каждого Isolate/контекста (например, для одной и той же точки входа). Подписчики всегда вызываются синхронно и в порядке регистрации, подобно EventTarget или Node.js EventEmitter в качестве класса.

Интеграция с Tail Workers

При использовании Tail Workers, все сообщения, опубликованные в любом канале, будут также пересылаться в Tail Worker. Внутри Tail Worker сообщения диагностического канала доступны через diagnosticsChannelEvents свойство:

export default {
	async tail(events) {
		for (const event of events) {
			for (const messageData of event.diagnosticsChannelEvents) {
				console.log(
					messageData.timestamp,
					messageData.channel,
					messageData.message,
				);
			}
		}
	},
};

Обратите внимание, что сообщение, опубликованное в tail worker, передается через алгоритм структурного клонирования (тот же механизм, что и structuredClone() API), поэтому поддерживаются только значения, которые можно успешно клонировать.

TracingChannel

Согласно документации Node.js, "TracingChannel представляет собой набор [Channels], которые вместе описывают одно отслеживаемое действие. TracingChannel используется для формализации и упрощения процесса создания событий для трассировки хода выполнения приложения».

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" },
);

См. документация Node.js для diagnostics_channel, где это описано подробнее.