Skip to content

Latest commit

 

History

History
94 lines (70 loc) · 4.42 KB

File metadata and controls

94 lines (70 loc) · 4.42 KB
title description
Instrumentation
Learn how to use instrumentation to run code at server startup in your Next.js app

{/* The content of this doc is shared between the app and pages router. You can use the <PagesOnly>Content</PagesOnly> component to add content that is specific to the Pages Router. Any shared content should not be wrapped in a component. */}

If you export a function named register from a instrumentation.ts (or .js) file in the root directory of your project (or inside the src folder if using one), we will call that function whenever a new Next.js server instance is bootstrapped.

Good to know

  • This feature is experimental. To use it, you must explicitly opt in by defining experimental.instrumentationHook = true; in your next.config.js.
  • The instrumentation file should be in the root of your project and not inside the app or pages directory. If you're using the src folder, then place the file inside src alongside pages and app.
  • If you use the pagesExtension config option to add a suffix, you will also need to update the instrumentation filename to match.
  • We have created a basic with-opentelemetry example that you can use.

Good to know

  • This feature is experimental. To use it, you must explicitly opt in by defining experimental.instrumentationHook = true; in your next.config.js.
  • The instrumentation file should be in the root of your project and not inside the app or pages directory. If you're using the src folder, then place the file inside src alongside pages and app.
  • If you use the pagesExtension config option to add a suffix, you will also need to update the instrumentation filename to match.
  • We have created a basic with-opentelemetry example that you can use.

When your register function is deployed, it will be called on each cold boot (but exactly once in each environment).

Sometimes, it may be useful to import a file in your code because of the side effects it will cause. For example, you might import a file that defines a set of global variables, but never explicitly use the imported file in your code. You would still have access to the global variables the package has declared.

You can import files with side effects in instrumentation.ts, which you might want to use in your register function as demonstrated in the following example:

import { init } from 'package-init'

export function register() {
  init()
}
import { init } from 'package-init'

export function register() {
  init()
}

However, we recommend importing files with side effects using import from within your register function instead. The following example demonstrates a basic usage of import in a register function:

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

By doing this, you can colocate all of your side effects in one place in your code, and avoid any unintended consequences from importing files.

We call register in all environments, so it's necessary to conditionally import any code that doesn't support both edge and nodejs. You can use the environment variable NEXT_RUNTIME to get the current environment. Importing an environment-specific code would look like this:

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')
  }
}