Spec-Zone.ru › Node.js 22 LTS

Канал диагностики

История
Версия Изменения
v19.2.0, v18.13.0

diagnostics_channel теперь имеет статус Stable.

v15.1.0, v14.17.0

Добавлено в: v15.1.0, v14.17.0

Стабильность: 2 - Стабильный

Исходный код: 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)
Добавлено в: v15.1.0, v14.17.0
  • name <string> | <symbol> Имя канала
  • Возвращает: <boolean> Есть ли активные подписчики

Проверяет, есть ли у именованного канала активные подписчики. Это полезно, если подготовка сообщения, которое вы хотите отправить, может быть затратной.

Этот 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)
Добавлено в: v15.1.0, v14.17.0
  • name <string> | <symbol> Имя канала
  • Возвращает: <Channel> Объект указанного канала

Это основная точка входа для всех, кто хочет публиковать сообщения в именованный канал. Она создает объект канала, оптимизированный для максимально возможного снижения накладных расходов во время публикации.

Модули 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)
Добавлено в: v18.7.0, v16.17.0
  • name <string> | <symbol> Имя канала
  • onMessage <Function> Обработчик для получения сообщений канала
    • message <any> Данные сообщения
    • name <string> | <symbol> Имя канала

Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик сообщений будет выполняться синхронно при каждой публикации сообщения в канал. Любые ошибки, возникшие в обработчике сообщений, вызовут событие '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)
Добавлено в: v18.7.0, v16.17.0
  • 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)
Добавлено в: v19.9.0, v18.19.0
Стабильность: 1 — Экспериментальный
  • 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

Добавлено в: v15.1.0, v14.17.0

Класс Channel представляет отдельный именованный канал в конвейере данных. Он используется для отслеживания подписчиков и публикации сообщений при наличии подписчиков. Канал существует как отдельный объект, чтобы избежать поиска канала во время публикации, обеспечивая очень высокую скорость публикации и позволяя активно использовать его с минимальными затратами. Каналы создаются с помощью diagnostics_channel.channel(name); напрямую создавать канал с помощью new Channel(name) не поддерживается.

channel.hasSubscribers
Добавлено в: v15.1.0, v14.17.0
  • Возвращает: <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)
Добавлено в: v15.1.0, v14.17.0
  • 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)
История
Версия Изменения
v22.20.0

Пометка об устаревании отозвана.

v18.7.0, v16.17.0

Пометка об устаревании только в документации.

v15.1.0, v14.17.0

Добавлено в: v15.1.0, v14.17.0

  • onMessage <Function> Обработчик для получения сообщений канала
    • message <any> Данные сообщения
    • name <string> | <symbol> Имя канала

Регистрирует обработчик сообщений для подписки на этот канал. Этот обработчик сообщений будет выполняться синхронно при каждой публикации сообщения в канал. Любые ошибки, возникшие в обработчике сообщений, вызовут событие '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)
История
Версия Изменения
v22.20.0

Пометка об устаревании отозвана.

v18.7.0, v16.17.0

Пометка об устаревании только в документации.

v17.1.0, v16.14.0, v14.19.0

Добавлено возвращаемое значение. Добавлено для каналов без подписчиков.

v15.1.0, v14.17.0

Добавлено в: v15.1.0, v14.17.0

  • 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])
Добавлено в: v19.9.0, v18.19.0
Стабильность: 1 — Экспериментальный
  • 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)
Добавлено в: v19.9.0, v18.19.0
Стабильность: 1 — Экспериментальный
  • 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]])
Добавлено в: v19.9.0, v18.19.0
Стабильность: 1 — Экспериментальный
  • 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

Добавлено в: v19.9.0, v18.19.0
Стабильность: 1 — Экспериментальный

Класс TracingChannel представляет собой набор каналов TracingChannel, которые вместе описывают одно трассируемое действие. Он используется для формализации и упрощения создания событий, отслеживающих поток выполнения приложения. Для создания TracingChannel используется diagnostics_channel.tracingChannel(). Как и в случае с Channel, рекомендуется создавать и повторно использовать один TracingChannel на верхнем уровне файла, а не создавать их динамически.

tracingChannel.subscribe(subscribers)
Добавлено в: v19.9.0, v18.19.0
  • 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)
Добавлено в: v19.9.0, v18.19.0
  • 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]]])
Добавлено в: v19.9.0, v18.19.0
  • 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]]])
Добавлено в: v19.9.0, v18.19.0
  • fn <Function> Функция, возвращающая Promise, выполнение которой нужно обернуть трассировкой
  • context <Object> Общий объект для связывания событий трассировки
  • thisArg <any> Объект-получатель, используемый при вызове функции
  • ...args <any> Необязательные аргументы, передаваемые функции
  • Возвращает: <Promise> Цепочка, созданная на основе Promise, возвращенного заданной функцией

Трассирует вызов функции, возвращающей Promise. При этом вокруг синхронной части выполнения функции всегда создаются события start и end, а при продолжении выполнения Promise создаются события asyncStart и asyncEnd. Также может быть создано событие error, если заданная функция выбрасывает ошибку или возвращенный Promise отклоняется. Заданная функция будет выполнена с помощью 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]]]])
Добавлено в: v19.9.0, v18.19.0
  • 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
Добавлено в: v22.0.0
  • Возвращает: <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: одно для синхронной ошибки и одно для асинхронной.

Встроенные каналы

Консоль
Стабильность: 1 - Экспериментальный
Событие: '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
Стабильность: 1 - Экспериментальный
Событие: '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
Стабильность: 1 - Экспериментальный
Событие: '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.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.

Модули
Стабильность: 1 - Экспериментальный
Событие: '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.

Событие: 'module.import.asyncEnd'
  • event <Object> со следующими свойствами
    • id Аргумент, переданный в import(). Имя модуля.
    • parentURL Объект URL модуля, который попытался выполнить import(id).

Генерируется после завершения import(). См. событие asyncEnd.

Событие: 'module.import.error'
  • event <Object> со следующими свойствами
    • id Аргумент, переданный в import(). Имя модуля.
    • parentURL Объект URL модуля, который попытался выполнить import(id).
  • error <Error>

Генерируется, когда import() выбрасывает ошибку. См. событие error.

NET
Стабильность: 1 - Экспериментальный
Событие: '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
Стабильность: 1 - Экспериментальный
Событие: 'udp.socket'
  • socket <dgram.Socket>

Генерируется при создании нового сокета UDP.

Процесс
Стабильность: 1 - Экспериментальный
Добавлено в: v16.18.0
Событие: 'child_process'
  • process <ChildProcess>

Генерируется при создании нового процесса.

Событие: 'execve'
  • execPath <string>
  • args <string[]>
  • env <string[]>

Генерируется при вызове process.execve().

Поток Worker
Стабильность: 1 - Экспериментальный
Добавлено в: v16.18.0
Событие: 'worker_threads'
  • worker <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-v22.x/docs/api/diagnostics_channel.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API