@apm-js-collab/tracing-hooks

中文文档
0.14.0发布于 2026/10/23Apache-2.0CommonJS构建来源已验证近 30 天下载 4167.1万

CJS and ESM hooks for orchestrion

原始使用文档
文档目录3 节
  1. Usage
  2. Debugging
  3. Diagnostics Hook

Tracing Hooks

This repository contains a ESM loader for injecting tracing channel hooks into Node.js modules. It also has a patch for Module to be used to patch CJS modules.

Usage

Note: the module loading hooks API in Node.js has changed as of v26. To support all active Node.js versions with forward-compatibility, create a combined loader as an ESM module.

This can be done for any CommonJS or ES Module application, but the loader itself must use ESM.

// loader.mjs
import Module from 'node:module'

// the synchronous hooks for newer node versions
import { initialize, resolve, load } from '@apm-js-collab/tracing-hooks/hook-sync.mjs'
import ModulePatch from '@apm-js-collab/tracing-hooks'

// the instrumentations we want to apply
const instrumentations = [
  {
    channelName: 'channel1',
    module: { name: 'pkg1', verisonRange: '>=1.0.0', filePath: 'index.js' },
    functionQuery: {
      className: 'Class1',
      methodName: 'method1',
      kind: 'Async'
    }
  },
  {
    channelName: 'channel2',
    module: { name: 'pkg2', verisonRange: '>=1.0.0', filePath: 'index.js' },
    functionQuery: {
      className: 'Class2,
      methodName: 'method2',
      kind: 'Sync'
    }
  }
]

// detection to decide module loader hooks to use
// registerHooks was present but not stable until 24.13 and 25.1
const version = (process.versions.node ?? '0.0.0')
  .split('.')
  .map(n => parseInt(n, 10))
const stableSyncHooks = version[0] > 25 ||
  version[0] === 25 && version[1] >= 1 ||
  version[0] === 24 && version[1] >= 13

if (typeof Module.registerHooks === 'function' && stableSyncHooks) {
  initialize({ instrumentations })
  Module.registerHooks({ resolve, load })
} else if (typeof Module.register === 'function') {
  Module.register('@apm-js-collab/tracing-hooks/hook.mjs', import.meta.url, {
    data: { instrumentations }
  });

  // ALSO patch `Module.prototype._compile`. This is REQUIRED, not an
  // optimisation: on this path CommonJS is instrumented entirely by
  // the patch, never by the async `load` hook.
  // Two reasons. When an ESM file `import`s a CJS package, Node
  // resolves the package's INTERNAL `require()` calls through the CJS
  // machinery, so they never reach the ESM resolve hook. And handing
  // `source` back for a CommonJS module from the async `load` hook
  // makes Node evaluate it on the synchronous require(esm) bridge,
  // which throws ERR_VM_MODULE_LINK_FAILURE on Node < 24.12 whenever
  // that module's top-level require() chain reaches an ES module
  // (https://github.com/nodejs/node/issues/59666).
  // Neither applies in the registerHooks case, because Node applies
  // those hooks to all CJS and ESM modules.
  new ModulePatch({ instrumentations }).patch();
} else {
  throw new Error('No available API to apply module load hooks')
}

To run your application with these instrumentations applied, pass it to the --import argument:

node --import=loader.mjs ./my-app.js

Debugging

The debug module is used to provide insight into the patching process. Set DEBUG='@apm-js-collab*' to view these logs.

Additionally, any patched files can be written out by enabling dump mode. This is done by setting the environment variable TRACING_DUMP to any value. By default, it will write out file to the system's temporary directory as the parent directory. The target parent directory can be configured by setting the TRACING_DUMP_DIR environment variable to an absolute path. In either case, the resolved filename of the module being patched is appended. For example, if we are patching lib/index.js in the foo package, and we set a base directory of /tmp/dump/, then the patched code will be written to /tmp/dump/foo/lib/index.js.

Diagnostics Hook

A diagnostics hook can be set which is called every time a module is transformed or transformation fails.

import { setDiagnosticsHook } from '@apm-js-collab/tracing-hooks/hook-sync.mjs'

setDiagnosticsHook(({ url, moduleName, error }) => {
  if(error) {
    // injection failed
  } else {
    // injection succeeded
  }
})

With the synchronous registerHooks (and the _compile patch) this is all that is needed. The older async register runs its hooks on a separate thread where the hook set above is not visible, so pass a MessagePort created with createDiagnosticsPort() for the loader thread to post its diagnostics back:

import { setDiagnosticsHook, createDiagnosticsPort } from '@apm-js-collab/tracing-hooks/hook-sync.mjs'

setDiagnosticsHook(({ url, moduleName, error }) => { /* ... */ })

const diagnosticsPort = createDiagnosticsPort()
Module.register('@apm-js-collab/tracing-hooks/hook.mjs', import.meta.url, {
  data: { instrumentations, diagnosticsPort },
  transferList: [diagnosticsPort]
})

On this path, diagnostics for ES modules are posted from the loader thread and therefore arrive asynchronously, some time after the module was transformed; diagnostics for CommonJS modules come from the _compile patch and are emitted synchronously as before. The port does not keep the process alive, so diagnostics still in flight when the process exits are dropped.

版本与发布记录

@apm-js-collab/tracing-hooks 共发布 22 个版本,首次发布于 2025/08/20;过去 12 个月发布了 16 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.14.0latest2026/10/2315 天前
0.13.32026/09/241 个月前
0.13.22026/09/171 个月前
0.13.12026/09/151 个月前
0.13.02026/07/153 个月前
0.12.02026/07/143 个月前

关于 @apm-js-collab/tracing-hooks 的常见问题

@apm-js-collab/tracing-hooks 是什么?

CJS and ESM hooks for orchestrion

如何安装 @apm-js-collab/tracing-hooks?

在项目目录运行 npm install @apm-js-collab/tracing-hooks,或使用 pnpm add / yarn add / bun add。

@apm-js-collab/tracing-hooks 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/apm-js-collab__tracing-hooks 是否存在。

@apm-js-collab/tracing-hooks 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@apm-js-collab/tracing-hooks 可以商用吗?

@apm-js-collab/tracing-hooks 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@apm-js-collab/tracing-hooks 的下载量有多少?

根据 npm 官方下载统计,@apm-js-collab/tracing-hooks 在 2026/10/07 – 2026/11/05 这 30 天内被下载 41,670,660 次,日均约 1,389,022 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@apm-js-collab/tracing-hooks 还在维护吗?

最新版本 0.14.0 发布于 2026/10/23(15 天前);至今共发布 22 个版本,其中过去 12 个月发布了 16 个;首次发布于 2025/08/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。