Spec-Zone.ru › Node.js 22 LTS

События трассировки

Стабильность: 1 — Экспериментальный

Исходный код: lib/trace_events.js

Модуль node:trace_events предоставляет механизм для централизованного сбора информации трассировки, генерируемой V8, ядром Node.js и пользовательским кодом.

Трассировку можно включить с помощью флага командной строки --trace-event-categories или используя модуль node:trace_events. Флаг --trace-event-categories принимает список имен категорий, разделенных запятыми.

Доступны следующие категории:

  • node: Пустой заполнитель.
  • node.async_hooks: Включает сбор подробных данных трассировки async_hooks. События async_hooks имеют уникальный asyncId и специальное свойство triggerId triggerAsyncId.
  • node.bootstrap: Включает сбор данных о ключевых этапах запуска Node.js.
  • node.console: Включает сбор вывода console.time() и console.count().
  • node.threadpoolwork.sync: Включает сбор данных трассировки для синхронных операций пула потоков, таких как blob, zlib, crypto и node_api.
  • node.threadpoolwork.async: Включает сбор данных трассировки для асинхронных операций пула потоков, таких как blob, zlib, crypto и node_api.
  • node.dns.native: Включает сбор данных трассировки для DNS-запросов.
  • node.net.native: Включает сбор данных трассировки для сети.
  • node.environment: Включает сбор данных о ключевых этапах среды Node.js.
  • node.fs.sync: Включает сбор данных трассировки для синхронных методов файловой системы.
  • node.fs_dir.sync: Включает сбор данных трассировки для синхронных методов работы с каталогами файловой системы.
  • node.fs.async: Включает сбор данных трассировки для асинхронных методов файловой системы.
  • node.fs_dir.async: Включает сбор данных трассировки для асинхронных методов работы с каталогами файловой системы.
  • node.perf: Включает сбор измерений API производительности.
    • node.perf.usertiming: Включает сбор только меток и измерений User Timing API производительности.
    • node.perf.timerify: Включает сбор только измерений timerify API производительности.
  • node.promises.rejections: Включает сбор данных трассировки, отслеживающих количество необработанных отклонений Promise и отклонений, обработанных после отклонения.
  • node.vm.script: Включает сбор данных трассировки для методов runInNewContext(), runInContext() и runInThisContext() модуля node:vm.
  • v8: События V8 связаны со сборкой мусора, компиляцией и выполнением.
  • node.http: Включает сбор данных трассировки для HTTP-запросов и ответов.
  • node.module_timer: Включает сбор данных трассировки для загрузки модулей CJS.

По умолчанию включены категории node, node.async_hooks и v8.

node --trace-event-categories v8,node,node.async_hooks server.js copy

В предыдущих версиях Node.js для включения событий трассировки требовалось использовать флаг --trace-events-enabled. Это требование было отменено. Однако флаг --trace-events-enabled можно по-прежнему использовать; он включает по умолчанию категории событий трассировки node, node.async_hooks и v8.

node --trace-events-enabled

# is equivalent to

node --trace-event-categories v8,node,node.async_hooks copy

Кроме того, события трассировки можно включить с помощью модуля node:trace_events:

Модули JavaScript
import { createTracing } from 'node:trace_events';
const tracing = createTracing({ categories: ['node.perf'] });
tracing.enable();  // Enable trace event capture for the 'node.perf' category

// do work

tracing.disable();  // Disable trace event capture for the 'node.perf' category
CommonJS
const { createTracing } = require('node:trace_events');
const tracing = createTracing({ categories: ['node.perf'] });
tracing.enable();  // Enable trace event capture for the 'node.perf' category

// do work

tracing.disable();  // Disable trace event capture for the 'node.perf' category

При запуске Node.js с включенной трассировкой создаются файлы журналов, которые можно открыть на вкладке chrome://tracing в Chrome.

По умолчанию файл журнала называется node_trace.${rotation}.log, где ${rotation} — это идентификатор ротации журнала, который увеличивается с каждым файлом. Шаблон пути к файлу можно задать с помощью --trace-event-file-pattern, принимающего строковый шаблон с поддержкой ${rotation} и ${pid}:

node --trace-event-categories v8 --trace-event-file-pattern '${pid}-${rotation}.log' server.js copy

Чтобы гарантировать корректное создание файла журнала после таких событий сигналов, как SIGINT, SIGTERM или SIGBREAK, предусмотрите в коде соответствующие обработчики, например:

process.on('SIGINT', function onSigint() {
  console.info('Received SIGINT.');
  process.exit(130);  // Or applicable exit code depending on OS and signal
}); copy

Система трассировки использует тот же источник времени, что и process.hrtime(). Однако временные метки событий трассировки выражаются в микросекундах, в отличие от process.hrtime(), возвращающего наносекунды.

Функции этого модуля недоступны в потоках Worker.

Модуль node:trace_events

Добавлено в: v10.0.0

Объект Tracing

Добавлено в: v10.0.0

Объект Tracing используется для включения или отключения трассировки наборов категорий. Экземпляры создаются с помощью метода trace_events.createTracing().

При создании объект Tracing отключен. Вызов метода tracing.enable() добавляет категории в набор включенных категорий событий трассировки. Вызов tracing.disable() удаляет категории из набора включенных категорий событий трассировки.

tracing.categories
Добавлено в: v10.0.0
  • Тип: <string>

Список категорий событий трассировки, разделенных запятыми и охватываемых этим объектом Tracing.

tracing.disable()
Добавлено в: v10.0.0

Отключает этот объект Tracing.

Будут отключены только те категории событий трассировки, которые не охватываются другими включенными объектами Tracing и не указаны флагом --trace-event-categories.

Модули JavaScript
import { createTracing, getEnabledCategories } from 'node:trace_events';
const t1 = createTracing({ categories: ['node', 'v8'] });
const t2 = createTracing({ categories: ['node.perf', 'node'] });
t1.enable();
t2.enable();

// Prints 'node,node.perf,v8'
console.log(getEnabledCategories());

t2.disable(); // Will only disable emission of the 'node.perf' category

// Prints 'node,v8'
console.log(getEnabledCategories());
CommonJS
const { createTracing, getEnabledCategories } = require('node:trace_events');
const t1 = createTracing({ categories: ['node', 'v8'] });
const t2 = createTracing({ categories: ['node.perf', 'node'] });
t1.enable();
t2.enable();

// Prints 'node,node.perf,v8'
console.log(getEnabledCategories());

t2.disable(); // Will only disable emission of the 'node.perf' category

// Prints 'node,v8'
console.log(getEnabledCategories());
tracing.enable()
Добавлено в: v10.0.0

Включает этот объект Tracing для набора категорий, охватываемых объектом Tracing.

tracing.enabled
Добавлено в: v10.0.0
  • Тип: <boolean> true только в том случае, если объект Tracing включен.

trace_events.createTracing(options)

Добавлено в: v10.0.0
  • options <Object>
    • categories <string[]> Массив имен категорий трассировки. Значения в массиве при возможности преобразуются в строку. Если значение невозможно преобразовать, будет выброшена ошибка.
  • Возвращает: <Tracing>.

Создает и возвращает объект Tracing для заданного набора categories.

Модули JavaScript
import { createTracing } from 'node:trace_events';
const categories = ['node.perf', 'node.async_hooks'];
const tracing = createTracing({ categories });
tracing.enable();
// do stuff
tracing.disable();
CommonJS
const { createTracing } = require('node:trace_events');
const categories = ['node.perf', 'node.async_hooks'];
const tracing = createTracing({ categories });
tracing.enable();
// do stuff
tracing.disable();

trace_events.getEnabledCategories()

Добавлено в: v10.0.0
  • Возвращает: <string>

Возвращает список всех включенных в данный момент категорий событий трассировки, разделенных запятыми. Текущий набор включенных категорий событий трассировки определяется объединением всех включенных в данный момент объектов Tracing и любых категорий, включенных с помощью флага --trace-event-categories.

Для приведенного ниже файла test.js команда node --trace-event-categories node.perf test.js выведет в консоль 'node.async_hooks,node.perf'.

Модули JavaScript
import { createTracing, getEnabledCategories } from 'node:trace_events';
const t1 = createTracing({ categories: ['node.async_hooks'] });
const t2 = createTracing({ categories: ['node.perf'] });
const t3 = createTracing({ categories: ['v8'] });

t1.enable();
t2.enable();

console.log(getEnabledCategories());
CommonJS
const { createTracing, getEnabledCategories } = require('node:trace_events');
const t1 = createTracing({ categories: ['node.async_hooks'] });
const t2 = createTracing({ categories: ['node.perf'] });
const t3 = createTracing({ categories: ['v8'] });

t1.enable();
t2.enable();

console.log(getEnabledCategories());

Примеры

Сбор данных о событиях трассировки с помощью инспектора

Модули JavaScript
import { Session } from 'node:inspector';
const session = new Session();
session.connect();

function post(message, data) {
  return new Promise((resolve, reject) => {
    session.post(message, data, (err, result) => {
      if (err)
        reject(new Error(JSON.stringify(err)));
      else
        resolve(result);
    });
  });
}

async function collect() {
  const data = [];
  session.on('NodeTracing.dataCollected', (chunk) => data.push(chunk));
  session.on('NodeTracing.tracingComplete', () => {
    // done
  });
  const traceConfig = { includedCategories: ['v8'] };
  await post('NodeTracing.start', { traceConfig });
  // do something
  setTimeout(() => {
    post('NodeTracing.stop').then(() => {
      session.disconnect();
      console.log(data);
    });
  }, 1000);
}

collect();
CommonJS
'use strict';

const { Session } = require('node:inspector');
const session = new Session();
session.connect();

function post(message, data) {
  return new Promise((resolve, reject) => {
    session.post(message, data, (err, result) => {
      if (err)
        reject(new Error(JSON.stringify(err)));
      else
        resolve(result);
    });
  });
}

async function collect() {
  const data = [];
  session.on('NodeTracing.dataCollected', (chunk) => data.push(chunk));
  session.on('NodeTracing.tracingComplete', () => {
    // done
  });
  const traceConfig = { includedCategories: ['v8'] };
  await post('NodeTracing.start', { traceConfig });
  // do something
  setTimeout(() => {
    post('NodeTracing.stop').then(() => {
      session.disconnect();
      console.log(data);
    });
  }, 1000);
}

collect();

© 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/tracing.html

Spec-Zone.ru

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