埋点是一种使用代码将监控和日志工具集成到应用程序中的过程。它使您能够跟踪应用程序的性能和行为,并调试生产环境中的问题。
要设置埋点,请在项目的根目录中(如果使用 src 文件夹,则在该文件夹内)创建 instrumentation.ts|js 文件。
然后,在该文件中导出一个 register 函数。当一个新的 Next.js 服务器实例启动时,这个函数将只被调用一次。
例如,要将 Next.js 与 OpenTelemetry 和 @vercel/otel 结合使用:
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel('next-app')
}import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel('next-app')
}请参阅 Next.js 结合 OpenTelemetry 的示例 以获取完整的实现。
须知:
instrumentation文件应该位于项目的根目录,而不是app或pages目录中。如果您正在使用src文件夹,则应将该文件放在src文件夹内,与pages和app文件夹并列。- 如果您使用
pageExtensions配置选项 来添加后缀,您还需要更新instrumentation的文件名以匹配。
有时,在代码中导入文件可能很有用,因为它会产生副作用。例如,您可能导入一个定义了一组全局变量的文件,但从未在代码中显式使用导入的文件。您仍然可以访问该包声明的全局变量。
我们建议在您的 register 函数中使用 JavaScript import 语法导入文件。以下示例演示了 import 在 register 函数中的基本用法:
export async function register() {
await import('package-with-side-effect')
}export async function register() {
await import('package-with-side-effect')
}须知:
我们建议在
register函数内部导入文件,而不是在文件的顶部导入。这样做,您可以将所有的副作用集中在代码中的一个位置,并避免在文件顶部全局导入可能导致的任何意外后果。
Next.js 在所有环境中都会调用 register,因此有条件地导入任何不支持特定运行时(例如 Edge 或 Node.js)的代码非常重要。您可以使用 NEXT_RUNTIME 环境变量来获取当前环境:
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation-node')
}
if (process.env.NEXT_RUNTIME === 'edge') {
await import('./instrumentation-edge')
}
}export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation-node')
}
if (process.env.NEXT_RUNTIME === 'edge') {
await import('./instrumentation-edge')
}
}