跳至内容
API 参考文件约定instrumentation.js

instrumentation.js

instrumentation.js|ts 文件用于将可观测性工具集成到您的应用程序中,使您能够跟踪性能和行为,并在生产环境中调试问题。

要使用它,请将文件放置在应用程序的**根目录**中,或者如果使用,则放置在src 文件夹内。

导出

register(可选)

该文件导出一个register函数,当新的 Next.js 服务器实例启动时,该函数会被调用**一次**。register 可以是异步函数。

instrumentation.ts
import { registerOTel } from '@vercel/otel'
 
export function register() {
  registerOTel('next-app')
}

onRequestError(可选)

此 API 在 Next.js canary 中可用。

您可以选择导出一个onRequestError函数来跟踪任何自定义可观测性提供程序的**服务器**错误。

  • 如果在onRequestError中运行任何异步任务,请确保已对其进行等待。当 Next.js 服务器捕获错误时,将触发onRequestError
  • error实例可能不是抛出的原始错误实例,因为如果在服务器组件渲染期间遇到错误,它可能会由 React 处理。如果发生这种情况,您可以使用错误上的digest属性来识别实际的错误类型。
instrumentation.ts
import { type Instrumentation } from 'next'
 
export const onRequestError: Instrumentation.onRequestError = async (
  err,
  request,
  context
) => {
  await fetch('https://.../report-error', {
    method: 'POST',
    body: JSON.stringify({
      message: err.message,
      request,
      context,
    }),
    headers: {
      'Content-Type': 'application/json',
    },
  })
}

参数

该函数接受三个参数:errorrequestcontext

类型
export function onRequestError(
  error: { digest: string } & Error,
  request: {
    path: string // resource path, e.g. /blog?name=foo
    method: string // request method. e.g. GET, POST, etc
    headers: { [key: string]: string }
  },
  context: {
    routerKind: 'Pages Router' | 'App Router' // the router type
    routePath: string // the route file path, e.g. /app/blog/[dynamic]
    routeType: 'render' | 'route' | 'action' | 'middleware' // the context in which the error occurred
    renderSource:
      | 'react-server-components'
      | 'react-server-components-payload'
      | 'server-rendering'
    revalidateReason: 'on-demand' | 'stale' | undefined // undefined is a normal request without revalidation
    renderType: 'dynamic' | 'dynamic-resume' // 'dynamic-resume' for PPR
  }
): void | Promise<void>
  • error:捕获的错误本身(类型始终为Error),以及一个digest属性,它是错误的唯一 ID。
  • request:与错误关联的只读请求信息。
  • context:发生错误的上下文。这可以是路由器类型(App 或 Pages 路由器),以及/或(服务器组件('render')、路由处理程序('route')、服务器操作('action')或中间件('middleware'))。

指定运行时

instrumentation.js 文件在 Node.js 和 Edge 运行时中均有效,但是,您可以使用process.env.NEXT_RUNTIME 来定位特定的运行时。

instrumentation.js
export function register() {
  if (process.env.NEXT_RUNTIME === 'edge') {
    return require('./register.edge')
  } else {
    return require('./register.node')
  }
}
 
export function onRequestError() {
  if (process.env.NEXT_RUNTIME === 'edge') {
    return require('./on-request-error.edge')
  } else {
    return require('./on-request-error.node')
  }
}

版本历史

版本更改
v15.0.0-RC引入onRequestErrorinstrumentation稳定
v14.0.4Turbopack 对instrumentation的支持
v13.2.0instrumentation作为实验性功能引入