События трассировки
Исходный код: 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и специальное свойствоtriggerIdtriggerAsyncId. -
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' categoryCommonJS
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
Объект Tracing
Объект Tracing используется для включения или отключения трассировки наборов категорий. Экземпляры создаются с помощью метода trace_events.createTracing().
При создании объект Tracing отключен. Вызов метода tracing.enable() добавляет категории в набор включенных категорий событий трассировки. Вызов tracing.disable() удаляет категории из набора включенных категорий событий трассировки.
tracing.categories
- Тип: <string>
Список категорий событий трассировки, разделенных запятыми и охватываемых этим объектом Tracing.
tracing.disable()
Отключает этот объект 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()
Включает этот объект Tracing для набора категорий, охватываемых объектом Tracing.
tracing.enabled
- Тип: <boolean>
trueтолько в том случае, если объектTracingвключен.
trace_events.createTracing(options)
-
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()
- Возвращает: <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