首页
/ Next.js 应用性能监控指南:instrumentation.js 文件详解

Next.js 应用性能监控指南:instrumentation.js 文件详解

2025-07-05 01:04:05作者:钟日瑜

什么是 instrumentation.js 文件?

在 Next.js 应用中,instrumentation.js(或 instrumentation.ts)是一个特殊的配置文件,它允许开发者集成各种可观测性工具到应用中。通过这个文件,你可以监控应用的性能表现、追踪用户行为,并在生产环境中调试问题。

为什么需要 instrumentation?

现代 Web 应用开发中,仅仅保证功能正常是不够的。我们需要:

  1. 实时了解应用在生产环境中的表现
  2. 快速定位和解决性能瓶颈
  3. 收集错误信息以便及时修复
  4. 分析用户行为优化体验

instrumentation.js 正是 Next.js 为这些需求提供的解决方案。

启用 instrumentation 功能

目前这是一个实验性功能,需要在 next.config.js 中明确启用:

// next.config.js
module.exports = {
  experimental: {
    instrumentationHook: true,
  }
}

核心配置项

1. register 函数(必需)

这是 instrumentation.js 文件必须导出的函数,它会在 Next.js 服务器实例启动时被调用一次。

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

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

这个函数通常用于:

  • 初始化性能监控工具
  • 设置全局性能分析器
  • 配置日志收集系统

2. onRequestError 函数(可选)

这个可选函数用于捕获和处理服务器端请求错误:

// instrumentation.js
export function onRequestError(err, request, context) {
  // 将错误信息发送到监控系统
  console.error('Server error:', {
    message: err.message,
    url: request.url,
    route: context.routePath
  });
}

参数详解

onRequestError 接收三个重要参数:

  1. error 对象

    • 包含标准的 Error 属性(message, stack 等)
    • 特有的 digest 属性:错误的唯一标识符
  2. request 对象

    • url:完整的请求 URL
    • method:HTTP 方法(GET/POST 等)
    • headers:请求头信息
  3. context 对象

    • routerKind:使用的路由类型('Pages Router' 或 'App Router')
    • routePath:路由文件路径(如 '/app/blog/[dynamic]')
    • routeType:错误发生的上下文('render'、'route'、'action' 或 'middleware')
    • 其他渲染相关的元数据

实际应用场景

场景1:集成 OpenTelemetry

import { NodeSDK } from '@opentelemetry/sdk-node'
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'

export function register() {
  const sdk = new NodeSDK({
    traceExporter: new ConsoleSpanExporter(),
    instrumentations: [getNodeAutoInstrumentations()]
  })
  
  sdk.start()
}

场景2:错误监控

export function onRequestError(error, request, context) {
  Sentry.captureException(error, {
    tags: {
      route: context.routePath,
      router: context.routerKind
    },
    extra: {
      requestUrl: request.url,
      headers: request.headers
    }
  })
}

最佳实践

  1. 生产环境专用:只在生产环境启用完整的 instrumentation,开发环境可以使用简化配置
  2. 性能考量:避免在 instrumentation 中添加过多同步操作,以免影响应用性能
  3. 错误处理:确保 instrumentation 代码本身有完善的错误处理,避免因监控系统问题导致应用崩溃
  4. 数据采样:对于高流量应用,考虑对数据进行采样,避免产生过多监控数据

版本兼容性

版本 重要变更
v15.0.0 引入 onRequestError 功能
v14.0.4 增加对 Turbopack 的支持
v13.2.0 首次作为实验性功能引入

通过合理配置 instrumentation.js 文件,你可以为 Next.js 应用构建强大的可观测性体系,帮助团队更快地发现和解决问题,提升应用质量和用户体验。