Канал диагностики
Исходный код: 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)
-
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<строка> | <символ> Имя канала -
onMessage<Функция> Обработчик для получения сообщений канала-
message<любой тип> Данные сообщения -
name<строка> | <символ> Имя канала
-
Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик будет выполняться синхронно всякий раз, когда в канал публикуется сообщение. Любые ошибки, выброшенные обработчиком сообщений, приведут к срабатыванию события '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<строка> | <символ> Имя канала -
onMessage<Функция> Предыдущий обработчик подписки для удаления - Возвращает: <логическое значение>
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<строка> | <Канал отслеживания> Имя канала или объект, содержащий все каналы отслеживания - Возвращает: <Канал отслеживания> Коллекция каналов для отслеживания
Создает обертку TracingChannel для заданного каналов отслеживания. Если задано имя, соответствующие каналы отслеживания будут созданы в виде tracing:${name}:${eventType}, где eventType соответствует типам каналов отслеживания.
Модули 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
- Возвращает: <логическое значение> Есть ли активные подписчики
Проверяет, есть ли активные подписчики на этот канал. Это полезно, если сообщение, которое вы хотите отправить, может быть ресурсоёмким.
Этот 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<любой тип> Сообщение для отправки подписчикам канала
Публикует сообщение всем подписчикам канала. Это запустит обработчики сообщений синхронно, поэтому они будут выполнены в одном контексте.
Модули 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<Функция> Обработчик для получения сообщений канала-
message<любой тип> Данные сообщения -
name<строка> | <символ> Имя канала
-
Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик будет выполняться синхронно всякий раз, когда в канал публикуется сообщение. Любые ошибки, выброшенные обработчиком сообщений, приведут к срабатыванию события '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<Функция> Предыдущий обработчик подписки для удаления - Возвращает: <логическое значение>
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<Функция> Преобразование данных контекста перед установкой контекста хранилища
Когда вызывается 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<любое> Сообщение для отправки подписчикам и привязки к хранилищам -
fn<Функция> Обработчик для выполнения в заданном контексте хранилища -
thisArg<любое> Получатель, который будет использоваться для вызова функции. -
...args<любое> Необязательные аргументы для передачи функции.
Применяет заданные данные к любым экземплярам 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, которые вместе выражают одно отслеживаемое действие. Он используется для формализации и упрощения процесса создания событий для отслеживания потока приложения. diagnostics_channel.tracingChannel() используется для построения TracingChannel. Как и в случае с Channel, рекомендуется создавать и повторно использовать один TracingChannel в верхней части файла, а не создавать их динамически.
tracingChannel.subscribe(subscribers)
-
subscribers<Объект> Набор подписчиков каналов TracingChannel
Помощник для подписки набора функций на соответствующие каналы. Это то же самое, что вызов 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<Объект> Набор подписчиков каналов TracingChannel - Возвращает: <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<Функция> Функция для обертывания трассировки вокруг -
context<Объект> Общий объект для корреляции событий -
thisArg<любое> Получатель, который будет использоваться для вызова функции -
...args<любое> Необязательные аргументы для передачи функции - Возвращает: <любое> Значение возврата заданной функции
Отслеживает вызов синхронной функции. Это всегда генерирует событие 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<Функция> Функция, возвращающая промис для обертывания отслеживания -
context<Объект> Общий объект для корреляции событий отслеживания -
thisArg<любой> Получатель, используемый для вызова функции -
...args<любой> Дополнительные аргументы для передачи функции - Возвращает: <Промис> Цепочка из промиса, возвращённого заданной функцией
Отследить вызов функции, возвращающей промис. Это всегда создаёт событие 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<Функция> обратный вызов, используемый для обертывания отслеживания -
position<число> Номер аргумента обратного вызова (с индексом 0) (по умолчанию последний аргумент, еслиundefinedпередан) -
context<Объект> Общий объект для корреляции событий отслеживания (по умолчанию{}, еслиundefinedпередан) -
thisArg<любой> Получатель, используемый для вызова функции -
...args<любой> аргументы для передачи функции (должен включать обратный вызов) - Возвращает: <любой> Возвращаемое значение заданной функции
Отследить вызов функции с обратным вызовом. Ожидается, что обратный вызов будет следовать соглашению об ошибке как первом аргументе, обычно используемому. Это всегда создаёт событие 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 — это набор нескольких диагностических каналов, представляющих определённые моменты в цикле выполнения одного отслеживаемого действия. Поведение разбито на пять диагностических каналов, состоящих из 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 представляет момент возвращения значения функцией. В случае асинхронной функции это происходит, когда возвращается промис, а не когда функция делает возврат внутри. В этот момент, если отслеживаемая функция была синхронной, поле 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 `diagnostics_channel` сейчас считается стабильным, встроенные каналы, доступные в настоящее время, таковыми не являются. Каждый канал должен быть объявлен стабильным независимо.
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
net.client.socket
-
socket<net.Socket>
Выдаётся, когда создается новый сокет клиента TCP или канала.
net.server.socket
-
socket<net.Socket>
Выдаётся, когда получено новое TCP или канальное подключение.
UDP
udp.socket
-
socket<dgram.Socket>
Выдаётся, когда создается новый сокет UDP.
Process
child_process
-
process<ChildProcess>
Выдаётся, когда создается новый процесс.
Worker Thread
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/dist/latest-v20.x/docs/api/diagnostics_channel.html