跳到主要内容

如何设置监控

监控是使用代码将监控和日志记录工具集成到您的应用程序中的过程。这允许您跟踪应用程序的性能和行为,并在生产环境中调试问题。

约定

要设置监控,在项目的根目录中创建 instrumentation.ts|js 文件(或如果使用 src 文件夹,则在其中创建)。

然后,在文件中导出 register 函数。当新的 Next.js 服务器实例启动时,此函数将被调用一次

例如,要将 Next.js 与 OpenTelemetry@vercel/otel 一起使用:

instrumentation.ts
import { registerOTel } from '@vercel/otel'

export function register() {
registerOTel('next-app')
}

查看 Next.js with OpenTelemetry 示例 了解完整实现。

提示

  • instrumentation 文件应该在项目的根目录中,而不是在 apppages 目录内。如果您使用 src 文件夹,则将文件放在 src 中,与 pagesapp 并列。
  • 如果您使用 pageExtensions 配置选项 添加后缀,您还需要更新 instrumentation 文件名以匹配。

示例

导入具有副作用的文件

有时,由于文件会产生副作用,在代码中导入文件可能很有用。例如,您可能导入一个定义了一组全局变量的文件,但从未在代码中明确使用导入的文件。您仍然可以访问包已声明的全局变量。

我们建议在 register 函数内使用 JavaScript import 语法导入文件。以下示例演示了在 register 函数中使用 import 的基本用法:

instrumentation.ts
export async function register() {
await import('package-with-side-effect')
}

提示:

我们建议从 register 函数内导入文件,而不是在文件顶部导入。通过这样做,您可以将所有副作用代码集中在一个地方,并避免在文件顶部全局导入时产生任何意外后果。

导入运行时特定代码

Next.js 在所有环境中调用 register,因此有条件地导入不支持特定运行时(例如 Edge 或 Node.js)的任何代码很重要。您可以使用 NEXT_RUNTIME 环境变量获取当前环境:

instrumentation.ts
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation-node')
}

if (process.env.NEXT_RUNTIME === 'edge') {
await import('./instrumentation-edge')
}
}