トレースイベント#

安定性: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.consoleconsole.time()console.count() 出力のキャプチャを有効にします。
  • node.threadpoolwork.syncblobzlibcryptonode_api などのスレッドプール同期操作のトレースデータのキャプチャを有効にします。
  • node.threadpoolwork.asyncblobzlibcryptonode_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:パフォーマンスAPI timerify 測定値のみのキャプチャを有効にします。
  • node.promises.rejections:未処理のPromise拒否と拒否後の処理の数のトレースデータ追跡を有効にします。
  • node.vm.scriptnode:vm モジュールのrunInNewContext()runInContext()runInThisContext() メソッドのトレースデータのキャプチャを有効にします。
  • v8V8 イベントは、GC、コンパイル、および実行関連です。
  • node.http:http リクエスト/レスポンスのトレースデータのキャプチャを有効にします。

デフォルトでは、nodenode.async_hooksv8 カテゴリが有効になっています。

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

以前のバージョンのNode.jsでは、トレースイベントを有効にするために--trace-events-enabledフラグを使用する必要がありました。この要件は削除されました。ただし、--trace-events-enabledフラグは使用できます。デフォルトでnodenode.async_hooksv8トレースイベントカテゴリを有効にします。

node --trace-events-enabled

# is equivalent to

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

または、node:trace_events モジュールを使用してトレースイベントを有効にすることができます。

const trace_events = require('node:trace_events');
const tracing = trace_events.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のchrome://tracingタブで開くことができるログファイルが生成されます。

ログファイルはデフォルトでnode_trace.${rotation}.logと呼ばれ、${rotation}はインクリメントされるログローテーションIDです。ファイルパスパターンは、${rotation}${pid}をサポートするテンプレート文字列を受け入れる--trace-event-file-patternで指定できます。

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

SIGINTSIGTERMSIGBREAKなどのシグナルイベントの後でもログファイルが正しく生成されるようにするには、次のような適切なハンドラーをコードに用意してください。

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

トレースシステムは、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フラグで指定されていないカテゴリのみが無効になります。

const trace_events = require('node:trace_events');
const t1 = trace_events.createTracing({ categories: ['node', 'v8'] });
const t2 = trace_events.createTracing({ categories: ['node.perf', 'node'] });
t1.enable();
t2.enable();

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

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

// Prints 'node,v8'
console.log(trace_events.getEnabledCategories()); 
tracing.enable()#

Tracing オブジェクトが対象とするカテゴリのセットに対して、このTracing オブジェクトを有効にします。

tracing.enabled#
  • <ブール値> Tracing オブジェクトが有効になっている場合のみtrue

trace_events.createTracing(options)#

  • options <オブジェクト>
    • categories <文字列[]> トレースカテゴリ名の配列。配列に含まれる値は、可能な限り文字列に変換されます。値を変換できない場合はエラーがスローされます。
  • 戻り値:<Tracing>

指定されたcategoriesのセットに対してTracingオブジェクトを作成して返します。

const trace_events = require('node:trace_events');
const categories = ['node.perf', 'node.async_hooks'];
const tracing = trace_events.createTracing({ categories });
tracing.enable();
// do stuff
tracing.disable(); 

trace_events.getEnabledCategories()#

現在有効になっているすべてのトレースイベントカテゴリのコンマ区切りのリストを返します。現在有効になっているトレースイベントカテゴリのセットは、現在有効になっているすべてのTracingオブジェクトと、--trace-event-categoriesフラグを使用して有効になっているカテゴリの和集合によって決定されます。

以下のtest.jsファイルとコマンドnode --trace-event-categories node.perf test.jsを例とすると、コンソールに'node.async_hooks,node.perf'が出力されます。

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

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

console.log(trace_events.getEnabledCategories()); 

#

インスペクタによるトレースイベントデータの収集#

'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();