Канал диагностики
Исходный код: lib/diagnostics_channel.js
Модуль node:diagnostics_channel предоставляет API для создания именованных каналов, предназначенных для передачи произвольных данных сообщений в диагностических целях.
Его можно подключить следующим образом:
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
CommonJS
const diagnostics_channel = require('node:diagnostics_channel');Предполагается, что автор модуля, желающий передавать диагностические сообщения, создаст один или несколько каналов верхнего уровня для отправки сообщений. Каналы также можно получать во время выполнения, однако этого не рекомендуется делать из-за дополнительных накладных расходов. Каналы можно экспортировать для удобства, но при условии, что их имя известно, получить к ним доступ можно откуда угодно.
Если ваш модуль предназначен для создания диагностических данных, которые будут использовать другие модули, рекомендуется задокументировать используемые именованные каналы и структуру данных сообщений. Имена каналов, как правило, должны содержать имя модуля, чтобы избежать конфликтов с данными других модулей.
Публичный API
Обзор
Ниже представлен краткий обзор публичного API.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
// Get a reusable channel object
const channel = diagnostics_channel.channel('my-channel');
function onMessage(message, name) {
// Received data
}
// Subscribe to the channel
diagnostics_channel.subscribe('my-channel', onMessage);
// Check if the channel has an active subscriber
if (channel.hasSubscribers) {
// Publish data to the channel
channel.publish({
some: 'data',
});
}
// Unsubscribe from the channel
diagnostics_channel.unsubscribe('my-channel', onMessage);CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
// Get a reusable channel object
const channel = diagnostics_channel.channel('my-channel');
function onMessage(message, name) {
// Received data
}
// Subscribe to the channel
diagnostics_channel.subscribe('my-channel', onMessage);
// Check if the channel has an active subscriber
if (channel.hasSubscribers) {
// Publish data to the channel
channel.publish({
some: 'data',
});
}
// Unsubscribe from the channel
diagnostics_channel.unsubscribe('my-channel', onMessage);
diagnostics_channel.hasSubscribers(name)
Проверяет, есть ли у именованного канала активные подписчики. Это полезно, если подготовка отправляемого сообщения может быть затратной.
Этот API необязателен, но полезен при публикации сообщений из кода, критичного к производительности.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
if (diagnostics_channel.hasSubscribers('my-channel')) {
// There are subscribers, prepare and publish message
}CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
if (diagnostics_channel.hasSubscribers('my-channel')) {
// There are subscribers, prepare and publish message
}
diagnostics_channel.channel(name)
Это основная точка входа для всех, кто хочет публиковать сообщения в именованный канал. Метод создает объект канала, оптимизированный для максимально возможного сокращения накладных расходов при публикации.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
diagnostics_channel.subscribe(name, onMessage)
-
name<string> | <symbol> Имя канала -
onMessage<Function> Обработчик для получения сообщений канала
Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик будет выполняться синхронно каждый раз, когда в канал публикуется сообщение. Любые ошибки, возникшие в обработчике сообщений, вызовут 'uncaughtException'.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
diagnostics_channel.subscribe('my-channel', (message, name) => {
// Received data
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
diagnostics_channel.subscribe('my-channel', (message, name) => {
// Received data
});
diagnostics_channel.unsubscribe(name, onMessage)
-
name<string> | <symbol> Имя канала -
onMessage<Function> Предыдущий подписанный обработчик, который нужно удалить - Возвращает: <boolean>
true, если обработчик найден, иfalseв противном случае.
Удаляет обработчик сообщений, ранее зарегистрированный для этого канала с помощью diagnostics_channel.subscribe(name, onMessage).
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
function onMessage(message, name) {
// Received data
}
diagnostics_channel.subscribe('my-channel', onMessage);
diagnostics_channel.unsubscribe('my-channel', onMessage);CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
function onMessage(message, name) {
// Received data
}
diagnostics_channel.subscribe('my-channel', onMessage);
diagnostics_channel.unsubscribe('my-channel', onMessage);
diagnostics_channel.tracingChannel(nameOrChannels)
-
nameOrChannels<string> | <TracingChannel> Имя канала или объект, содержащий все каналы TracingChannel - Возвращает: <TracingChannel> Набор каналов для трассировки
Создает оболочку TracingChannel для указанных каналов TracingChannel. Если указано имя, соответствующие каналы трассировки будут созданы в виде tracing:${name}:${eventType}, где eventType соответствует типам каналов TracingChannel.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channelsByName = diagnostics_channel.tracingChannel('my-channel');
// or...
const channelsByCollection = diagnostics_channel.tracingChannel({
start: diagnostics_channel.channel('tracing:my-channel:start'),
end: diagnostics_channel.channel('tracing:my-channel:end'),
asyncStart: diagnostics_channel.channel('tracing:my-channel:asyncStart'),
asyncEnd: diagnostics_channel.channel('tracing:my-channel:asyncEnd'),
error: diagnostics_channel.channel('tracing:my-channel:error'),
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channelsByName = diagnostics_channel.tracingChannel('my-channel');
// or...
const channelsByCollection = diagnostics_channel.tracingChannel({
start: diagnostics_channel.channel('tracing:my-channel:start'),
end: diagnostics_channel.channel('tracing:my-channel:end'),
asyncStart: diagnostics_channel.channel('tracing:my-channel:asyncStart'),
asyncEnd: diagnostics_channel.channel('tracing:my-channel:asyncEnd'),
error: diagnostics_channel.channel('tracing:my-channel:error'),
});Класс: Channel
Класс Channel представляет отдельный именованный канал в конвейере данных. Он используется для отслеживания подписчиков и публикации сообщений, когда подписчики присутствуют. Канал существует как отдельный объект, чтобы избежать поиска канала во время публикации, что обеспечивает очень высокую скорость публикации и позволяет интенсивно использовать его с минимальными затратами. Каналы создаются с помощью diagnostics_channel.channel(name); создавать канал напрямую с помощью new Channel(name) не поддерживается.
channel.hasSubscribers
- Возвращает: <boolean> Есть ли активные подписчики
Проверяет, есть ли у этого канала активные подписчики. Это полезно, если подготовка отправляемого сообщения может быть затратной.
Этот API необязателен, но полезен при публикации сообщений из кода, критичного к производительности.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
if (channel.hasSubscribers) {
// There are subscribers, prepare and publish message
}CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
if (channel.hasSubscribers) {
// There are subscribers, prepare and publish message
}
channel.publish(message)
-
message<any> Сообщение для отправки подписчикам канала
Публикует сообщение для всех подписчиков канала. Это синхронно запускает обработчики сообщений, поэтому они выполняются в том же контексте.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
channel.publish({
some: 'message',
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
channel.publish({
some: 'message',
});
channel.subscribe(onMessage)
-
onMessage<Function> Обработчик для получения сообщений канала
Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик будет выполняться синхронно каждый раз, когда в канал публикуется сообщение. Любые ошибки, возникшие в обработчике сообщений, вызовут 'uncaughtException'.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
channel.subscribe((message, name) => {
// Received data
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
channel.subscribe((message, name) => {
// Received data
});
channel.unsubscribe(onMessage)
-
onMessage<Function> Предыдущий подписанный обработчик, который нужно удалить - Возвращает: <boolean>
true, если обработчик найден, иfalseв противном случае.
Удаляет обработчик сообщений, ранее зарегистрированный для этого канала с помощью channel.subscribe(onMessage).
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
function onMessage(message, name) {
// Received data
}
channel.subscribe(onMessage);
channel.unsubscribe(onMessage);CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
function onMessage(message, name) {
// Received data
}
channel.subscribe(onMessage);
channel.unsubscribe(onMessage);
channel.bindStore(store[, transform])
-
store<AsyncLocalStorage> Хранилище, к которому привязываются данные контекста -
transform<Function> Преобразует данные контекста перед установкой контекста хранилища
При вызове channel.runStores(context, ...) указанные данные контекста будут применены ко всем хранилищам, привязанным к каналу. Если хранилище уже привязано, предыдущая функция transform будет заменена новой. Функцию transform можно не указывать, чтобы задать указанные данные контекста непосредственно как контекст.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
import { AsyncLocalStorage } from 'node:async_hooks';
const store = new AsyncLocalStorage();
const channel = diagnostics_channel.channel('my-channel');
channel.bindStore(store, (data) => {
return { data };
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const { AsyncLocalStorage } = require('node:async_hooks');
const store = new AsyncLocalStorage();
const channel = diagnostics_channel.channel('my-channel');
channel.bindStore(store, (data) => {
return { data };
});
channel.unbindStore(store)
-
store<AsyncLocalStorage> Хранилище, которое нужно отвязать от канала. - Возвращает: <boolean>
true, если хранилище найдено, иfalseв противном случае.
Удаляет обработчик сообщений, ранее зарегистрированный для этого канала с помощью channel.bindStore(store).
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
import { AsyncLocalStorage } from 'node:async_hooks';
const store = new AsyncLocalStorage();
const channel = diagnostics_channel.channel('my-channel');
channel.bindStore(store);
channel.unbindStore(store);CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const { AsyncLocalStorage } = require('node:async_hooks');
const store = new AsyncLocalStorage();
const channel = diagnostics_channel.channel('my-channel');
channel.bindStore(store);
channel.unbindStore(store);
channel.runStores(context, fn[, thisArg[, ...args]])
-
context<any> Сообщение для отправки подписчикам и привязки к хранилищам -
fn<Function> Обработчик, выполняемый в активированном контексте хранилища -
thisArg<any> Получатель, используемый при вызове функции. -
...args<any> Необязательные аргументы, передаваемые функции.
Применяет указанные данные ко всем экземплярам AsyncLocalStorage, привязанным к каналу, на время выполнения указанной функции, а затем публикует сообщение в канал в контексте, в котором эти данные применены к хранилищам.
Если для channel.bindStore(store) была указана функция преобразования, она преобразует данные сообщения, прежде чем они станут значением контекста для хранилища. Предыдущий контекст хранилища доступен внутри функции преобразования в случаях, когда требуется связать контексты.
Контекст, примененный к хранилищу, должен быть доступен в любом асинхронном коде, продолжающем выполнение, начатое во время работы указанной функции, однако в некоторых ситуациях может произойти потеря контекста.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
import { AsyncLocalStorage } from 'node:async_hooks';
const store = new AsyncLocalStorage();
const channel = diagnostics_channel.channel('my-channel');
channel.bindStore(store, (message) => {
const parent = store.getStore();
return new Span(message, parent);
});
channel.runStores({ some: 'message' }, () => {
store.getStore(); // Span({ some: 'message' })
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const { AsyncLocalStorage } = require('node:async_hooks');
const store = new AsyncLocalStorage();
const channel = diagnostics_channel.channel('my-channel');
channel.bindStore(store, (message) => {
const parent = store.getStore();
return new Span(message, parent);
});
channel.runStores({ some: 'message' }, () => {
store.getStore(); // Span({ some: 'message' })
});Класс: TracingChannel
Класс TracingChannel представляет собой набор каналов TracingChannel, которые вместе описывают одно трассируемое действие. Он используется для формализации и упрощения создания событий, отслеживающих поток выполнения приложения. Для создания TracingChannel используется diagnostics_channel.tracingChannel(). Как и в случае с Channel, рекомендуется создавать и повторно использовать один экземпляр TracingChannel на верхнем уровне файла, а не создавать их динамически.
tracingChannel.subscribe(subscribers)
-
subscribers<Object> Набор подписчиков каналов TracingChannel-
start<Function> Подписчик событияstart -
end<Function> Подписчик событияend -
asyncStart<Function> Подписчик событияasyncStart -
asyncEnd<Function> Подписчик событияasyncEnd -
error<Function> Подписчик событияerror
-
Вспомогательный метод для подписки набора функций на соответствующие каналы. Он эквивалентен отдельному вызову channel.subscribe(onMessage) для каждого канала.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.subscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.subscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
});
tracingChannel.unsubscribe(subscribers)
-
subscribers<Object> Набор подписчиков каналов TracingChannel-
start<Function> Подписчик событияstart -
end<Function> Подписчик событияend -
asyncStart<Function> Подписчик событияasyncStart -
asyncEnd<Function> Подписчик событияasyncEnd -
error<Function> Подписчик событияerror
-
- Возвращает: <boolean>
true, если все обработчики успешно отписаны, иfalseв противном случае.
Вспомогательный метод для отмены подписки набора функций на соответствующие каналы. Он эквивалентен отдельному вызову channel.unsubscribe(onMessage) для каждого канала.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.unsubscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.unsubscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
});
tracingChannel.traceSync(fn[, context[, thisArg[, ...args]]])
-
fn<Function> Функция, вызов которой нужно обернуть трассировкой -
context<Object> Общий объект для сопоставления событий -
thisArg<any> Получатель, используемый при вызове функции -
...args<any> Необязательные аргументы, передаваемые функции - Возвращает: <any> Возвращаемое значение указанной функции
Трассирует вызов синхронной функции. При этом вокруг выполнения всегда создаются событие start и событие end; если указанная функция выбрасывает ошибку, также может создаваться событие error. Указанная функция выполняется с помощью channel.runStores(context, ...) в канале start, что гарантирует соответствие всех привязанных хранилищ контексту этой трассировки для всех событий.
Чтобы гарантировать формирование только корректных графов трассировки, события публикуются, только если подписчики присутствуют до начала трассировки. Подписчики, добавленные после начала трассировки, не будут получать последующие события этой трассировки; им будут доступны только будущие трассировки.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.traceSync(() => {
// Do something
}, {
some: 'thing',
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.traceSync(() => {
// Do something
}, {
some: 'thing',
});
tracingChannel.tracePromise(fn[, context[, thisArg[, ...args]]])
-
fn<Function> Функция, возвращающая Promise, вызов которой нужно обернуть трассировкой -
context<Object> Общий объект для сопоставления событий трассировки -
thisArg<any> Получатель, используемый при вызове функции -
...args<any> Необязательные аргументы, передаваемые функции - Возвращает: <Promise> Цепочка, продолженная от Promise, возвращенного указанной функцией
Трассирует вызов функции, возвращающей Promise. При этом вокруг синхронной части выполнения функции всегда создаются событие start и событие end; при переходе к продолжению Promise создаются событие asyncStart и событие asyncEnd. Если указанная функция выбрасывает ошибку или возвращенный Promise отклоняется, также может создаваться событие error. Указанная функция выполняется с помощью channel.runStores(context, ...) в канале start, что гарантирует соответствие всех привязанных хранилищ контексту этой трассировки для всех событий.
Чтобы гарантировать формирование только корректных графов трассировки, события публикуются, только если подписчики присутствуют до начала трассировки. Подписчики, добавленные после начала трассировки, не будут получать последующие события этой трассировки; им будут доступны только будущие трассировки.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.tracePromise(async () => {
// Do something
}, {
some: 'thing',
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.tracePromise(async () => {
// Do something
}, {
some: 'thing',
});
tracingChannel.traceCallback(fn[, position[, context[, thisArg[, ...args]]]])
-
fn<Function> Функция обратного вызова, для которой нужно создать трассировку -
position<number> Позиция ожидаемой функции обратного вызова, отсчитываемая от нуля (по умолчанию — последний аргумент, если переданundefined) -
context<Object> Общий объект для сопоставления событий трассировки (по умолчанию —{}, если переданundefined) -
thisArg<any> Получатель, используемый при вызове функции -
...args<any> Аргументы, передаваемые функции (должны включать функцию обратного вызова) - Возвращает: <any> Возвращаемое значение указанной функции
Трассирует вызов функции, принимающей функцию обратного вызова. Ожидается, что обратный вызов будет следовать принятому соглашению, согласно которому первым аргументом передается ошибка. Вокруг синхронной части выполнения функции всегда создаются событие start и событие end, а вокруг выполнения обратного вызова — событие asyncStart и событие asyncEnd. Если указанная функция выбрасывает ошибку или первый аргумент, переданный обратному вызову, задан, также может создаваться событие error. Указанная функция выполняется с помощью channel.runStores(context, ...) в канале start, что гарантирует соответствие всех привязанных хранилищ контексту этой трассировки для всех событий.
Чтобы гарантировать формирование только корректных графов трассировки, события публикуются, только если подписчики присутствуют до начала трассировки. Подписчики, добавленные после начала трассировки, не будут получать последующие события этой трассировки; им будут доступны только будущие трассировки.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.traceCallback((arg1, callback) => {
// Do something
callback(null, 'result');
}, 1, {
some: 'thing',
}, thisArg, arg1, callback);CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.traceCallback((arg1, callback) => {
// Do something
callback(null, 'result');
}, 1, {
some: 'thing',
}, thisArg, arg1, callback);Обратный вызов также будет выполнен с помощью channel.runStores(context, ...), что в некоторых случаях позволяет восстановить потерянный контекст.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
import { AsyncLocalStorage } from 'node:async_hooks';
const channels = diagnostics_channel.tracingChannel('my-channel');
const myStore = new AsyncLocalStorage();
// The start channel sets the initial store data to something
// and stores that store data value on the trace context object
channels.start.bindStore(myStore, (data) => {
const span = new Span(data);
data.span = span;
return span;
});
// Then asyncStart can restore from that data it stored previously
channels.asyncStart.bindStore(myStore, (data) => {
return data.span;
});CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const { AsyncLocalStorage } = require('node:async_hooks');
const channels = diagnostics_channel.tracingChannel('my-channel');
const myStore = new AsyncLocalStorage();
// The start channel sets the initial store data to something
// and stores that store data value on the trace context object
channels.start.bindStore(myStore, (data) => {
const span = new Span(data);
data.span = span;
return span;
});
// Then asyncStart can restore from that data it stored previously
channels.asyncStart.bindStore(myStore, (data) => {
return data.span;
});
tracingChannel.hasSubscribers
- Возвращает: <boolean>
true, если у какого-либо отдельного канала есть подписчик, иfalse, если нет.
Это вспомогательный метод экземпляра TracingChannel, позволяющий проверить, есть ли подписчики хотя бы у одного из каналов TracingChannel. Если хотя бы у одного канала есть подписчик, возвращается true; в противном случае возвращается false.
Модули JavaScript
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
if (channels.hasSubscribers) {
// Do something
}CommonJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
if (channels.hasSubscribers) {
// Do something
}Каналы TracingChannel
TracingChannel — это набор из нескольких diagnostics_channels, представляющих определённые этапы жизненного цикла выполнения одного трассируемого действия. Поведение разделено на пять diagnostics_channels: start, end, asyncStart, asyncEnd и error. Все события одного трассируемого действия используют один и тот же объект события, что может быть полезно для управления корреляцией с помощью WeakMap.
При «завершении» задачи к этим объектам событий добавляются значения result или error. В случае синхронной задачи result будет возвращаемым значением, а error — всем, что было выброшено функцией. В асинхронных функциях на основе обратного вызова result будет вторым аргументом обратного вызова, а error — либо выброшенной ошибкой, видимой в событии end, либо первым аргументом обратного вызова в одном из событий asyncStart или asyncEnd.
Чтобы формировались только корректные графы трассировки, события следует публиковать, только если подписчики присутствуют до начала трассировки. Подписчики, добавленные после начала трассировки, не должны получать последующие события этой трассировки; им будут доступны только события будущих трассировок.
Имена каналов трассировки должны соответствовать следующему шаблону:
-
tracing:module.class.method:startилиtracing:module.function:start -
tracing:module.class.method:endилиtracing:module.function:end -
tracing:module.class.method:asyncStartилиtracing:module.function:asyncStart -
tracing:module.class.method:asyncEndилиtracing:module.function:asyncEnd -
tracing:module.class.method:errorилиtracing:module.function:error
start(event)
- Имя:
tracing:${name}:start
Событие start обозначает момент вызова функции. На этом этапе данные события могут содержать аргументы функции или любые другие данные, доступные в самом начале её выполнения.
end(event)
- Имя:
tracing:${name}:end
Событие end обозначает момент, когда вызов функции возвращает значение. В случае асинхронной функции это происходит, когда возвращается промис, а не когда сама функция выполняет оператор return. На этом этапе, если отслеживаемая функция была синхронной, поле result будет содержать возвращаемое функцией значение. Также может присутствовать поле error, в котором указываются выброшенные ошибки.
Для отслеживания ошибок рекомендуется подписываться именно на событие error, поскольку трассируемое действие может породить несколько ошибок. Например, внутренняя асинхронная задача может завершиться с ошибкой ещё до того, как синхронная часть задачи выбросит ошибку.
asyncStart(event)
- Имя:
tracing:${name}:asyncStart
Событие asyncStart обозначает момент вызова обратного вызова или продолжения трассируемой функции. На этом этапе могут быть доступны такие данные, как аргументы обратного вызова, или любые другие данные, описывающие «результат» действия.
Для функций с обратными вызовами первый аргумент обратного вызова будет присвоен полю error, если он не равен undefined или null, а второй аргумент будет присвоен полю result.
Для промисов аргумент пути resolve будет присвоен result, а аргумент пути reject будет присвоен error.
Для отслеживания ошибок рекомендуется подписываться именно на событие error, поскольку трассируемое действие может породить несколько ошибок. Например, внутренняя асинхронная задача может завершиться с ошибкой ещё до того, как синхронная часть задачи выбросит ошибку.
asyncEnd(event)
- Имя:
tracing:${name}:asyncEnd
Событие asyncEnd обозначает возврат из обратного вызова асинхронной функции. Маловероятно, что данные события изменятся после события asyncStart, однако может быть полезно отслеживать момент завершения обратного вызова.
error(event)
- Имя:
tracing:${name}:error
Событие error обозначает любую ошибку, возникшую в трассируемой функции — синхронно или асинхронно. Если ошибка выброшена в синхронной части отслеживаемой функции, она будет присвоена полю error события, а событие error будет вызвано. Если ошибка получена асинхронно через обратный вызов или отклонение промиса, она также будет присвоена полю error события и вызовет событие error.
Один вызов трассируемой функции может привести к нескольким ошибкам, поэтому при обработке этого события следует учитывать такую возможность. Например, если внутри запускается другая асинхронная задача, которая завершается с ошибкой, а затем синхронная часть функции выбрасывает ошибку, будут отправлены два события error: одно для синхронной ошибки и одно для асинхронной.
Встроенные каналы
Консоль
Событие: 'console.log'
-
args<any[]>
Вызывается при вызове console.log(). Получает массив аргументов, переданных в console.log().
Событие: 'console.info'
-
args<any[]>
Вызывается при вызове console.info(). Получает массив аргументов, переданных в console.info().
Событие: 'console.debug'
-
args<any[]>
Вызывается при вызове console.debug(). Получает массив аргументов, переданных в console.debug().
Событие: 'console.warn'
-
args<any[]>
Вызывается при вызове console.warn(). Получает массив аргументов, переданных в console.warn().
Событие: 'console.error'
-
args<any[]>
Вызывается при вызове console.error(). Получает массив аргументов, переданных в console.error().
HTTP
Событие: 'http.client.request.created'
-
request<http.ClientRequest>
Вызывается, когда клиент создаёт объект запроса. В отличие от http.client.request.start, это событие вызывается до отправки запроса.
Событие: 'http.client.request.start'
-
request<http.ClientRequest>
Вызывается, когда клиент начинает запрос.
Событие: 'http.client.request.error'
-
request<http.ClientRequest> -
error<Error>
Вызывается при возникновении ошибки во время запроса клиента.
Событие: 'http.client.response.finish'
-
request<http.ClientRequest> -
response<http.IncomingMessage>
Вызывается, когда клиент получает ответ.
Событие: 'http.server.request.start'
-
request<http.IncomingMessage> -
response<http.ServerResponse> -
socket<net.Socket> -
server<http.Server>
Вызывается, когда сервер получает запрос.
Событие: 'http.server.response.created'
-
request<http.IncomingMessage> -
response<http.ServerResponse>
Вызывается, когда сервер создаёт ответ. Событие вызывается до отправки ответа.
Событие: 'http.server.response.finish'
-
request<http.IncomingMessage> -
response<http.ServerResponse> -
socket<net.Socket> -
server<http.Server>
Вызывается, когда сервер отправляет ответ.
HTTP/2
Событие: 'http2.client.stream.created'
-
stream<ClientHttp2Stream> -
headers<HTTP/2 Headers Object>
Вызывается, когда на клиенте создаётся поток.
Событие: 'http2.client.stream.start'
-
stream<ClientHttp2Stream> -
headers<HTTP/2 Headers Object>
Вызывается, когда на клиенте начинается поток.
Событие: 'http2.client.stream.error'
-
stream<ClientHttp2Stream> -
error<Error>
Вызывается при возникновении ошибки во время обработки потока на клиенте.
Событие: 'http2.client.stream.finish'
-
stream<ClientHttp2Stream> -
headers<HTTP/2 Headers Object> -
flags<number>
Вызывается, когда клиент получает поток.
Событие: 'http2.client.stream.bodyChunkSent'
-
stream<ClientHttp2Stream> -
writev<boolean> -
data<Buffer> | <string> | <Buffer[]> | <Object[]> -
encoding<string>
Вызывается при отправке фрагмента тела потока клиента.
Событие: 'http2.client.stream.bodySent'
-
stream<ClientHttp2Stream>
Вызывается после полной отправки тела потока клиента.
Событие: 'http2.client.stream.close'
-
stream<ClientHttp2Stream>
Вызывается при закрытии потока на клиенте. Код ошибки HTTP/2, использованный при закрытии потока, можно получить с помощью свойства stream.rstCode.
Событие: 'http2.server.stream.created'
-
stream<ServerHttp2Stream> -
headers<HTTP/2 Headers Object>
Вызывается, когда на сервере создаётся поток.
Событие: 'http2.server.stream.start'
-
stream<ServerHttp2Stream> -
headers<HTTP/2 Headers Object>
Вызывается, когда на сервере начинается поток.
Событие: 'http2.server.stream.error'
-
stream<ServerHttp2Stream> -
error<Error>
Вызывается при возникновении ошибки во время обработки потока на сервере.
Событие: 'http2.server.stream.finish'
-
stream<ServerHttp2Stream> -
headers<HTTP/2 Headers Object> -
flags<number>
Вызывается при отправке потока на сервере.
Событие: 'http2.server.stream.close'
-
stream<ServerHttp2Stream>
Вызывается при закрытии потока на сервере. Код ошибки HTTP/2, использованный при закрытии потока, можно получить с помощью свойства stream.rstCode.
Модули
Событие: 'module.require.start'
-
event<Object> со следующими свойствами-
idАргумент, переданный вrequire(). Имя модуля. -
parentFilenameИмя модуля, который попытался выполнить require(id).
-
Вызывается при выполнении require(). См. событие start.
Событие: 'module.require.end'
-
event<Object> со следующими свойствами-
idАргумент, переданный вrequire(). Имя модуля. -
parentFilenameИмя модуля, который попытался выполнить require(id).
-
Вызывается при возврате из вызова require(). См. событие end.
Событие: 'module.require.error'
-
event<Object> со следующими свойствами-
idАргумент, переданный вrequire(). Имя модуля. -
parentFilenameИмя модуля, который попытался выполнить require(id).
-
-
error<Error>
Вызывается, когда require() выбрасывает ошибку. См. событие error.
Событие: 'module.import.asyncStart'
-
event<Object> со следующими свойствами-
idАргумент, переданный вimport(). Имя модуля. -
parentURLОбъект URL модуля, который попытался выполнить import(id).
-
Вызывается при вызове import(). См. событие asyncStart.
Сеть
Событие: 'net.client.socket'
-
socket<net.Socket> | <tls.TLSSocket>
Вызывается при создании нового клиентского сокетного соединения TCP или через канал.
Событие: 'net.server.socket'
-
socket<net.Socket>
Вызывается при получении нового соединения TCP или соединения через канал.
Событие: 'tracing:net.server.listen:asyncStart'
-
server<net.Server> -
options<Object>
Вызывается при вызове net.Server.listen(), до фактической настройки порта или канала.
Событие: 'tracing:net.server.listen:asyncEnd'
-
server<net.Server>
Вызывается после завершения net.Server.listen(), когда сервер готов принимать соединения.
Событие: 'tracing:net.server.listen:error'
-
server<net.Server> -
error<Error>
Вызывается, когда net.Server.listen() возвращает ошибку.
UDP
Процесс
Событие: 'execve'
-
execPath<string> -
args<string[]> -
env<string[]>
Вызывается при вызове process.execve().
Поток Worker
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/diagnostics_channel.html