Настройка инструментирования
Инструментирование — это процесс использования кода для интеграции инструментов мониторинга и логирования в ваше приложение. Это позволяет отслеживать производительность и поведение приложения, а также находить ошибки в рабочей среде.
Конвенция
Для настройки инструментирования создайте файл instrumentation.ts|js
в корневой директории вашего проекта (или внутри папки src
, если она используется).
Затем экспортируйте функцию register
в этом файле. Эта функция будет вызвана один раз при инициализации нового экземпляра сервера Next.js.
Например, для использования Next.js с OpenTelemetry и @vercel/otel:
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel('next-app')
}
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel('next-app')
}
Полную реализацию смотрите в примере Next.js с OpenTelemetry.
Полезно знать:
- Файл
instrumentation
должен находиться в корне проекта, а не внутри директорийapp
илиpages
. Если вы используете папкуsrc
, разместите файл внутриsrc
рядом сpages
иapp
.- Если вы используете опцию конфигурации
pageExtensions
для добавления суффикса, вам также потребуется обновить имя файлаinstrumentation
, чтобы оно соответствовало.
Примеры
Импорт файлов с побочными эффектами
Иногда может быть полезно импортировать файл в ваш код из-за побочных эффектов, которые он вызывает. Например, вы можете импортировать файл, который определяет набор глобальных переменных, но никогда явно не использовать импортированный файл в вашем коде. У вас всё равно будет доступ к глобальным переменным, объявленным в пакете.
Мы рекомендуем импортировать файлы с использованием синтаксиса JavaScript import
внутри вашей функции register
. Следующий пример демонстрирует базовое использование import
в функции register
:
export async function register() {
await import('package-with-side-effect')
}
export async function register() {
await import('package-with-side-effect')
}
Полезно знать:
Мы рекомендуем импортировать файл изнутри функции
register
, а не в верхней части файла. Это позволяет собрать все побочные эффекты в одном месте вашего кода и избежать непредвиденных последствий от глобального импорта в начале файла.
Импорт кода для конкретной среды выполнения
Next.js вызывает функцию register
во всех средах, поэтому важно условно импортировать любой код, который не поддерживает определённые среды выполнения (например, Edge или Node.js). Вы можете использовать переменную окружения NEXT_RUNTIME
для определения текущей среды:
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')
}
}