代码插桩 (Instrumentation)
代码插桩 (Instrumentation) 是通过代码将监控和日志工具集成到应用程序中的过程。这使您能够追踪应用的性能和行为,并在生产环境中调试问题。
约定
要设置代码插桩,请在项目的根目录下创建 instrumentation.ts|js
文件(如果使用了 src
文件夹,则放在该文件夹内)。
然后在文件中导出一个 register
函数。该函数将在新的 Next.js 服务器实例初始化时被调用一次。
例如,要在 Next.js 中使用 OpenTelemetry 和 @vercel/otel:
完整实现请参考 Next.js with OpenTelemetry 示例。
须知
- 此功能为实验性。要使用它,您必须在
next.config.js
中明确启用experimental.instrumentationHook = true;
instrumentation
文件应位于项目根目录,而非app
或pages
目录内。如果使用src
文件夹,则将文件放在src
内与pages
和app
同级的位置- 如果使用
pageExtensions
配置选项 添加后缀,也需要相应更新instrumentation
文件名
示例
导入具有副作用的文件
有时,由于文件导入会产生的副作用,在代码中导入文件可能很有用。例如,您可以导入一个定义了全局变量的文件,但从不显式使用该导入文件。您仍然可以访问该包声明的全局变量。
我们建议在 register
函数中使用 JavaScript import
语法导入文件。以下示例演示了在 register
函数中使用 import
的基本用法:
须知:
我们建议从
register
函数内部导入文件,而不是在文件顶部导入。这样做可以将所有副作用代码集中在一处,避免在文件顶部全局导入导致的意外后果。
导入运行时特定代码
Next.js 会在所有环境中调用 register
函数,因此需要条件导入不支持特定运行时的代码(例如 Edge 或 Node.js)。您可以使用 NEXT_RUNTIME
环境变量获取当前环境: