Канал диагностики
Исходный код: lib/diagnostics_channel.js
Модуль node:diagnostics_channel предоставляет API для создания именованных каналов для отчёта произвольных данных сообщений в диагностических целях.
К нему можно получить доступ, используя:
MJS модули
import diagnostics_channel from 'node:diagnostics_channel';
CJS модули
const diagnostics_channel = require('node:diagnostics_channel'); Предполагается, что разработчик модуля, желающий отправить диагностические сообщения, создаст один или несколько каналов верхнего уровня для отсылки сообщений. Каналы также могут быть получены во время выполнения, но это не рекомендуется из-за дополнительной нагрузки. Каналы могут быть экспортированы для удобства, но при условии, что имя известно, его можно получить в любом месте.
Если вы хотите, чтобы ваш модуль генерировал диагностические данные, которые другие модули смогут использовать, рекомендуется включить документацию, в которой указаны используемые именованные каналы и структура данных сообщений. Имена каналов обычно должны включать имя модуля, чтобы избежать коллизий с данными из других модулей.
Общедоступный API
Обзор
Ниже приведён краткий обзор общедоступного API.
Модули MJS
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);
Модули CJS
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 необязателен, но полезен при попытке публикации сообщений из кода, чувствительного к производительности.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
if (diagnostics_channel.hasSubscribers('my-channel')) {
// There are subscribers, prepare and publish message
}
Модули CJS
const diagnostics_channel = require('node:diagnostics_channel');
if (diagnostics_channel.hasSubscribers('my-channel')) {
// There are subscribers, prepare and publish message
}
diagnostics_channel.channel(name)
Это основной входной пункт для всех, кто хочет опубликовать сообщение в именованный канал. Он создаёт объект канала, оптимизированный для минимизации накладных расходов при публикации.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
Модули CJS
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'.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
diagnostics_channel.subscribe('my-channel', (message, name) => {
// Received data
});
Модули CJS
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).
Модули MJS
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);
Модули CJS
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.
Модули MJS
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'),
});
Модули CJS
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 необязателен, но полезен при попытке публикации сообщений из кода, чувствительного к производительности.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
if (channel.hasSubscribers) {
// There are subscribers, prepare and publish message
}
Модули CJS
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> Сообщение для отправки подписчикам канала
Публикует сообщение всем подписчикам канала. Это запустит обработчики сообщений синхронно, поэтому они будут выполнены в том же контексте.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
channel.publish({
some: 'message',
});
Модули CJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
channel.publish({
some: 'message',
});
channel.subscribe(onMessage)
diagnostics_channel.subscribe(name, onMessage)
-
onMessage<Function> Обработчик для получения сообщений канала
Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик будет выполняться синхронно всякий раз, когда в канал публикуется сообщение. Любые ошибки, выброшенные в обработчике сообщений, приведут к срабатыванию события 'uncaughtException'.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
const channel = diagnostics_channel.channel('my-channel');
channel.subscribe((message, name) => {
// Received data
});
Модули CJS
const diagnostics_channel = require('node:diagnostics_channel');
const channel = diagnostics_channel.channel('my-channel');
channel.subscribe((message, name) => {
// Received data
});
channel.unsubscribe(onMessage)
diagnostics_channel.unsubscribe(name, onMessage)
-
onMessage<Function> Предыдущий обработчик подписки для удаления - Возвращает: <boolean>
trueесли обработчик найден,falseв противном случае.
Удаляет обработчик сообщений, ранее зарегистрированный для этого канала с помощью channel.subscribe(onMessage).
Модули MJS
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);
Модули CJS
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 может быть опущена для установки предоставленных данных контекста как контекста напрямую.
Модули MJS
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 };
});
Модули CJS
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).
Модули MJS
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);
Модули CJS
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), она будет применена для преобразования данных сообщения перед тем, как оно станет значением контекста для хранилища. Предыдущий контекст хранилища доступен внутри функции преобразования в тех случаях, когда требуется связывание контекста.
Контекст, применённый к хранилищу, должен быть доступен в любом асинхронном коде, который продолжается после выполнения заданной функции, однако есть некоторые ситуации, в которых может произойти потеря контекста.
Модули MJS
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' })
});
Модули CJS
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 Channels, которые вместе выражают одно отслеживаемое действие. Он используется для формализации и упрощения процесса создания событий для отслеживания потока приложения. diagnostics_channel.tracingChannel() используется для построения TracingChannel. Как и в случае с Channel, рекомендуется создавать и повторно использовать один TracingChannel в верхней части файла, а не создавать их динамически.
tracingChannel.subscribe(subscribers)
-
subscribers<Object> Набор подписчиков каналов TracingChannel Channels-
start<Function> Подписчик на событиеstartсобытия -
end<Function> Подписчик на событиеendсобытия -
asyncStart<Function> Подписчик на событиеasyncStartсобытия -
asyncEnd<Function> Подписчик на событиеasyncEndсобытия -
error<Function> Подписчик на событиеerrorсобытия
-
Функция для подписки набора функций на соответствующие каналы. Это то же самое, что вызов channel.subscribe(onMessage) для каждого канала индивидуально.
Модули MJS
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
},
});
Модули CJS
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 Channels-
start<Function> Подписчик на событиеstartсобытия -
end<Function> Подписчик на событиеendсобытия -
asyncStart<Function> Подписчик на событиеasyncStartсобытия -
asyncEnd<Function> Подписчик на событиеasyncEndсобытия -
error<Function> Подписчик на событиеerrorсобытия
-
- Возвращает: <boolean>
trueесли все обработчики были успешно отписаны, иfalseв противном случае.
Функция для отписки набора функций от соответствующих каналов. Это то же самое, что вызов channel.unsubscribe(onMessage) для каждого канала индивидуально.
Модули MJS
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
},
});
Модули CJS
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, что гарантирует, что все события должны иметь любые связанные хранилища, установленные для соответствия контексту этого отслеживания.
Для обеспечения создания только корректных графиков отслеживания, события будут опубликованы только в том случае, если подписчики присутствуют до начала отслеживания. Подписки, добавленные после начала отслеживания, не получат будущие события от этого отслеживания, только будущие отслеживания будут видны.
Модули MJS
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.traceSync(() => {
// Do something
}, {
some: 'thing',
});
Модули CJS
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> Функция, возвращающая промис, для обертывания трассировки -
context<Object> Общий объект для корреляции событий трассировки -
thisArg<any> Получатель, используемый для вызова функции -
...args<any> Необязательные аргументы для передачи функции - Возвращает: <Promise> Цепочка, полученная от промиса, возвращённого заданной функцией
Отследить вызов функции, возвращающей промис. Это всегда генерирует событие start и событие end вокруг синхронной части выполнения функции, а также событие asyncStart и событие asyncEnd, когда достигнута продолжение промиса. Также может генерировать событие error, если заданная функция вызывает ошибку или возвращаемый промис отклоняется. Выполнит заданную функцию с использованием channel.runStores(context, ...) на канале start, что гарантирует, что все события должны иметь любые связанные хранилища, установленные для соответствия контексту этой трассировки.
Для обеспечения формирования только правильных графиков трассировки события будут опубликованы только при наличии подписчиков до начала трассировки. Подписки, добавленные после начала трассировки, не получат будущие события из этой трассировки, будут видны только будущие трассировки.
МОДУЛИ MJS
import diagnostics_channel from 'node:diagnostics_channel';
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.tracePromise(async () => {
// Do something
}, {
some: 'thing',
});
МОДУЛИ CJS
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> Номер аргумента (с индексом 0) ожидаемого обратного вызова (по умолчанию последний аргумент, еслиundefinedпередаётся) -
context<Object> Общий объект для корреляции событий трассировки (по умолчанию{}, еслиundefinedпередаётся) -
thisArg<any> Получатель, используемый для вызова функции -
...args<any> аргументы для передачи функции (должны включать обратный вызов) - Возвращает: <any> Возвращаемое значение заданной функции
Отследить вызов функции, принимающей обратный вызов. Обратный вызов ожидается, что он будет следовать соглашению по обработке ошибок как первого аргумента. Это всегда генерирует событие start и событие end вокруг синхронной части выполнения функции, и генерирует события asyncStart и asyncEnd вокруг выполнения обратного вызова. Также может генерировать событие error, если заданная функция генерирует исключение или первый аргумент, переданный обратному вызову, установлен. Выполнит заданную функцию с использованием channel.runStores(context, ...) на канале start, что гарантирует, что все события должны иметь любые связанные хранилища, установленные для соответствия контексту этой трассировки.
Для обеспечения формирования только правильных графиков трассировки события будут опубликованы только при наличии подписчиков до начала трассировки. Подписки, добавленные после начала трассировки, не получат будущие события из этой трассировки, будут видны только будущие трассировки.
МОДУЛИ MJS
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);
МОДУЛИ CJS
const diagnostics_channel = require('node:diagnostics_channel');
const channels = diagnostics_channel.tracingChannel('my-channel');
channels.traceCallback((arg1, callback) => {
// Do something
callback(null, 'result');
}, {
some: 'thing',
}, thisArg, arg1, callback); Обратный вызов также будет выполняться с помощью channel.runStores(context, ...), что позволяет восстановить контекст в некоторых случаях.
МОДУЛИ MJS
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;
});
МОДУЛИ CJS
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
TracingChannel — это набор нескольких диагностических каналов, представляющих определённые точки в жизненном цикле выполнения одного отслеживаемого действия. Поведение разделено на пять диагностических каналов, состоящих из start, end, asyncStart, asyncEnd, и error. Одно отслеживаемое действие будет использовать один и тот же объект события между всеми событиями, это может быть полезно для управления корреляцией через слабую карту.
Эти объекты событий будут расширены значениями 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 представляет собой момент, когда функция возвращает значение. В случае асинхронной функции это происходит, когда возвращается промис, а не когда функция сама делает внутренний оператор возврата. В этот момент, если отслеживаемая функция была синхронной, поле 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, одно для синхронной ошибки, и одно для асинхронной ошибки.
Встроенные каналы
Хотя API диагностических каналов сейчас считается стабильным, встроенные каналы, которые сейчас доступны, не являются таковыми. Каждый канал должен быть самостоятельно объявлен стабильным.
HTTP
http.client.request.start
-
request<http.ClientRequest>
Вызывается, когда клиент начинает запрос.
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.finish
-
request<http.IncomingMessage> -
response<http.ServerResponse> -
socket<net.Socket> -
server<http.Server>
Выдаётся, когда сервер отправляет ответ.
СЕТЬ
net.client.socket
-
socket<net.Socket>
Выдаётся при создании нового сокета клиента 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
udp.socket
-
socket<dgram.Socket>
Выдаётся при создании нового сокета UDP.
Процесс
child_process
-
process<ChildProcess>
Выдаётся при создании нового процесса.
Поток Работы
worker_threads
-
workerWorker
Выдаётся при создании нового потока.
© 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/api/diagnostics_channel.html