Spec-Zone.ru › Node.js 20 LTS

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

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

diagnostics_channel теперь Стабилен.

v15.1.0, v14.17.0

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

Устойчивость: 2 - Стабилен

Исходный код: 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)
Добавлен в: v15.1.0, v14.17.0
  • 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)
Добавлен в: v15.1.0, v14.17.0
  • 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)
Добавлен в: v18.7.0, v16.17.0
  • 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)
Добавлен в: v18.7.0, v16.17.0
  • 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)
Добавлен в: v19.9.0
Уровень стабильности: 1 - Экспериментальный
  • 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

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

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

channel.hasSubscribers
Добавлен в: v15.1.0, v14.17.0
  • Возвращает: <логическое значение> Есть ли активные подписчики

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

Этот 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)
Добавлен в: v15.1.0, v14.17.0
  • 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)
Добавлен в: v15.1.0, v14.17.0Устарел с: v18.7.0, v16.17.0
Уровень стабильности: 0 - Устарел: используйте 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)
История
Версия Изменения
v18.7.0, v16.17.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

Уровень стабильности: 0 - Устарел: используйте 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])
Добавлен в: v19.9.0
Уровень стабильности: 1 - Экспериментальный
  • 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)
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • 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]])
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • 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

Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная

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

tracingChannel.subscribe(subscribers)
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • subscribers <Объект> Набор подписчиков каналов TracingChannel
    • start <Функция> Подписчик на событие start
    • end <Функция> Подписчик на событие end
    • asyncStart <Функция> Подписчик на событие asyncStart
    • asyncEnd <Функция> Подписчик на событие asyncEnd
    • error <Функция> Подписчик на событие 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)
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • subscribers <Объект> Набор подписчиков каналов TracingChannel
    • start <Функция> Подписчик на событие start
    • end <Функция> Подписчик на событие end
    • asyncStart <Функция> Подписчик на событие asyncStart
    • asyncEnd <Функция> Подписчик на событие asyncEnd
    • error <Функция> Подписчик на событие 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]]])
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • 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]]])
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • 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)
Добавлена в: v19.9.0
Устойчивость: 1 - Экспериментальная
  • 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, одно для синхронной ошибки и одно для асинхронной.

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

Устойчивость: 1 - Экспериментальная

Хотя 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
Added in: v16.18.0

child_process

  • process <ChildProcess>

Выдаётся, когда создается новый процесс.

Worker Thread
Added in: 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-v20.x/docs/api/diagnostics_channel.html

Spec-Zone.ru

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