Instrumentación
Si exportas una función llamada register
desde un archivo instrumentation.ts
(o .js
) en el directorio raíz de tu proyecto (o dentro de la carpeta src
si estás usando una), llamaremos a esa función cada vez que se inicie una nueva instancia del servidor Next.js.
Es bueno saber
- Esta característica es experimental. Para usarla, debes activarla explícitamente definiendo
experimental.instrumentationHook = true;
en tunext.config.js
.- El archivo
instrumentation
debe estar en la raíz de tu proyecto y no dentro de los directoriosapp
opages
. Si usas la carpetasrc
, coloca el archivo dentro desrc
junto apages
yapp
.- Si usas la opción de configuración
pageExtensions
para agregar un sufijo, también necesitarás actualizar el nombre del archivoinstrumentation
para que coincida.- Hemos creado un ejemplo básico with-opentelemetry que puedes usar.
Cuando tu función register
sea desplegada, será llamada en cada arranque en frío (pero exactamente una vez en cada entorno).
A veces puede ser útil importar un archivo en tu código debido a los efectos secundarios que causará. Por ejemplo, podrías importar un archivo que define un conjunto de variables globales, pero nunca usar explícitamente el archivo importado en tu código. Aún así tendrías acceso a las variables globales que el paquete ha declarado.
Puedes importar archivos con efectos secundarios en instrumentation.ts
, lo cual podrías querer usar en tu función register
como se muestra en el siguiente ejemplo:
import { init } from 'package-init'
export function register() {
init()
}
import { init } from 'package-init'
export function register() {
init()
}
Sin embargo, recomendamos importar archivos con efectos secundarios usando import
desde dentro de tu función register
. El siguiente ejemplo muestra un uso básico de import
en una función register
:
export async function register() {
await import('package-with-side-effect')
}
export async function register() {
await import('package-with-side-effect')
}
Al hacer esto, puedes colocar todos tus efectos secundarios en un solo lugar en tu código y evitar consecuencias no deseadas al importar archivos.
Llamamos a register
en todos los entornos, por lo que es necesario importar condicionalmente cualquier código que no sea compatible tanto con edge
como con nodejs
. Puedes usar la variable de entorno NEXT_RUNTIME
para obtener el entorno actual. Importar un código específico del entorno se vería así:
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')
}
}