Capítulo 47 de 456
Use o arquivo instrumentation.ts|js para rodar código uma única vez no startup do servidor Next.js, tipicamente para integrar ferramentas de monitoramento/logging (ex.: OpenTelemetry) antes que a aplicação passe a atender requisições.
instrumentation.ts|js: arquivo na raiz do projeto (ou dentro de src/ se usado); convenção reservada para setup de observabilidade.register(): função exportada, chamada uma única vez quando uma nova instância do servidor Next.js é iniciada; deve completar antes do servidor aceitar requisições.NEXT_RUNTIME: variável de ambiente ('nodejs' ou 'edge') para importar condicionalmente código específico de runtime dentro de register(), já que register é chamado em todos os ambientes.// instrumentation.ts
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel('next-app')
}
@vercel/otel.// instrumentation.ts
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation-node')
}
if (process.env.NEXT_RUNTIME === 'edge') {
await import('./instrumentation-edge')
}
}
register(), evitando carregar código incompatível com Edge.instrumentation.ts: prefira import() dinâmico dentro de register(), para colocar todos os side effects num único lugar e evitar consequências não intencionais de import global.instrumentation.ts dentro de app/ ou pages/: deve ficar na raiz do projeto (ou em src/ junto de pages/app), nunca dentro dessas pastas.pageExtensions: se o projeto usa a config pageExtensions para adicionar sufixo, o nome do arquivo instrumentation também precisa ser atualizado para casar.register() roda uma única vez por instância de servidor e bloqueia o servidor até completar.NEXT_RUNTIME é a forma correta de segregar código Node.js de código Edge dentro de register().import() dinâmico dentro da função a import estático no topo do arquivo, para colocar side effects num só lugar.