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
instrumentationdebe estar en la raíz de tu proyecto y no dentro de los directoriosappopages. Si usas la carpetasrc, coloca el archivo dentro desrcjunto apagesyapp.- Si usas la opción de configuración
pageExtensionspara agregar un sufijo, también necesitarás actualizar el nombre del archivoinstrumentationpara 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')
}
}