← Cloudflare Workers / workers / runtime-apis / nodejs
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 ↗, где это описано подробнее.