События трассировки
Исходный код: 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: включает сбор только пользовательских измерений и отметок времени 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
Список категорий событий трассировки, разделённых запятыми, которые охватывает этот объект 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('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-v20.x/docs/api/tracing.html