Skip to content

추적 이벤트

[안정성: 1 - 실험적]

안정성: 1 안정성: 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, cryptonode_api와 같은 스레드 풀 동기 작업에 대한 추적 데이터 캡처를 활성화합니다.

  • node.threadpoolwork.async: blob, zlib, cryptonode_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: Performance API 측정 캡처를 활성화합니다.

    • node.perf.usertiming: Performance API 사용자 타이밍 측정 및 마크만 캡처를 활성화합니다.
    • node.perf.timerify: Performance API 타이머화 측정만 캡처를 활성화합니다.
  • node.promises.rejections: 처리되지 않은 Promise 거부 및 처리 후 거부 횟수를 추적하는 추적 데이터 캡처를 활성화합니다.

  • node.vm.script: node:vm 모듈의 runInNewContext(), runInContext()runInThisContext() 메서드에 대한 추적 데이터 캡처를 활성화합니다.

  • v8: V8 이벤트는 GC, 컴파일 및 실행 관련입니다.

  • node.http: http 요청/응답에 대한 추적 데이터 캡처를 활성화합니다.

  • node.module_timer: CJS 모듈 로딩에 대한 추적 데이터 캡처를 활성화합니다.

기본적으로 node, node.async_hooksv8 카테고리가 활성화됩니다.

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

이전 버전의 Node.js에서는 추적 이벤트를 활성화하려면 --trace-events-enabled 플래그를 사용해야 했습니다. 이 요구 사항은 제거되었습니다. 그러나 --trace-events-enabled 플래그는 여전히 사용될 수 있으며 기본적으로 node, node.async_hooksv8 추적 이벤트 카테고리를 활성화합니다.

bash
node --trace-events-enabled

# 다음과 동일합니다. {#is-equivalent-to}

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

또는 node:trace_events 모듈을 사용하여 추적 이벤트를 활성화할 수 있습니다.

js
const trace_events = require('node:trace_events')
const tracing = trace_events.createTracing({ categories: ['node.perf'] })
tracing.enable() // 'node.perf' 카테고리에 대한 추적 이벤트 캡처를 활성화합니다.

// 작업 수행

tracing.disable() // 'node.perf' 카테고리에 대한 추적 이벤트 캡처를 비활성화합니다.

추적을 활성화하여 Node.js를 실행하면 Chrome의 chrome://tracing 탭에서 열 수 있는 로그 파일이 생성됩니다.

로그 파일은 기본적으로 node_trace.${rotation}.log라고 하며, 여기서 ${rotation}은 증가하는 로그 회전 ID입니다. 파일 경로 패턴은 ${rotation}${pid}를 지원하는 템플릿 문자열을 허용하는 --trace-event-file-pattern으로 지정할 수 있습니다.

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

SIGINT, SIGTERM 또는 SIGBREAK와 같은 신호 이벤트 후에 로그 파일이 올바르게 생성되도록 하려면 다음과 같이 코드에 적절한 핸들러가 있는지 확인하십시오.

js
process.on('SIGINT', function onSigint() {
  console.info('SIGINT를 수신했습니다.')
  process.exit(130) // 또는 OS 및 신호에 따라 해당 종료 코드
})

추적 시스템은 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

Tracing 객체에서 다루는 추적 이벤트 카테고리의 쉼표로 구분된 목록입니다.

tracing.disable()

추가된 버전: v10.0.0

Tracing 객체를 비활성화합니다.

다른 활성화된 Tracing 객체에서 다루지 않고 --trace-event-categories 플래그로 지정되지 않은 추적 이벤트 카테고리만 비활성화됩니다.

js
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()

// 'node,node.perf,v8' 출력
console.log(trace_events.getEnabledCategories())

t2.disable() // 'node.perf' 카테고리의 방출만 비활성화합니다.

// 'node,v8' 출력
console.log(trace_events.getEnabledCategories())

tracing.enable()

추가된 버전: v10.0.0

Tracing 객체가 다루는 카테고리 집합에 대해 이 Tracing 객체를 활성화합니다.

tracing.enabled

추가된 버전: v10.0.0

  • <boolean> Tracing 객체가 활성화된 경우에만 true입니다.

trace_events.createTracing(options)

추가된 버전: v10.0.0

  • options <Object>

    • categories <string[]> 추적 카테고리 이름의 배열입니다. 배열에 포함된 값은 가능한 경우 문자열로 강제 변환됩니다. 값을 강제 변환할 수 없으면 오류가 발생합니다.
  • 반환값: <Tracing>.

지정된 categories 집합에 대한 Tracing 객체를 생성하고 반환합니다.

js
const trace_events = require('node:trace_events')
const categories = ['node.perf', 'node.async_hooks']
const tracing = trace_events.createTracing({ categories })
tracing.enable()
// 작업 수행
tracing.disable()

trace_events.getEnabledCategories()

추가된 버전: v10.0.0

현재 활성화된 모든 추적 이벤트 카테고리를 쉼표로 구분된 목록으로 반환합니다. 현재 활성화된 추적 이벤트 카테고리 집합은 현재 활성화된 모든 Tracing 객체의 합집합--trace-event-categories 플래그를 사용하여 활성화된 모든 카테고리에 의해 결정됩니다.

아래의 test.js 파일이 주어졌을 때, node --trace-event-categories node.perf test.js 명령어는 'node.async_hooks,node.perf'를 콘솔에 출력합니다.

js
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())

예시

인스펙터로 추적 이벤트 데이터 수집하기

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