Instrumentation
Instrumentationは、アプリケーションに監視やログツールを統合するためのコードを使用するプロセスです。これにより、アプリケーションのパフォーマンスと動作を追跡し、本番環境で問題をデバッグできます。
規約
Instrumentationを設定するには、プロジェクトのルートディレクトリにinstrumentation.ts|js
ファイルを作成します(もしsrc
フォルダを使用している場合はその中に作成してください)。
次に、そのファイルでregister
関数をエクスポートします。この関数は、新しいNext.jsサーバーインスタンスが開始されるときに1回呼び出されます。
例えば、Next.jsをOpenTelemetryと@vercel/otelと一緒に使う場合:
- TypeScript
- JavaScript
import { registerOTel } from '@vercel/otel'
// Next.jsアプリのOpenTelemetryを登録する
export function register() {
registerOTel('next-app')
}
import { registerOTel } from '@vercel/otel'
// Next.jsアプリのOpenTelemetryを登録する
export function register() {
registerOTel('next-app')
}
完全な実装については、Next.js with OpenTelemetry exampleをご覧ください。
Good to know:
instrumentation
ファイルは、プロジェクトのrootに置く必要があり、app
またはpages
ディレクトリの中には入れないでください。src
フォルダを使用している場合は、pages
やapp
と並んでsrc
内にファイルを配置してください。pageExtensions
設定オプションを使用してサフィックスを追加する場合、instrumentation
ファイル名も更新して一致させる必要があります。
例
副作用を伴うファイルのインポート
場合によっては、副作用を引き起こすためにコード内でファイルをインポートすることが有用です。たとえば、一連のグローバル変数を定義するファイルをインポートするが、コード内で明示的にインポートされたファイルを使用しないことがあります。この場合でも、パッケージで宣言されたグローバル変数にアクセス可能となります。
JavaScriptのimport
構文を使用してregister
関数内でファイルをインポートすることをお勧めします。次の例は、register
関数での基本的なimport
使用法を示しています:
- TypeScript
- JavaScript
// 副作用があるパッケージのインポート
export async function register() {
await import('package-with-side-effect')
}
// 副作用があるパッケージのインポート
export async function register() {
await import('package-with-side-effect')
}
Good to know:
ファイルの先頭ではなく、
register
関数内からファイルをインポートすることをお勧めします。これにより、すべての副作用をコード内で1か所に集約でき、ファイルの先頭でグローバルにインポートすることによる予期せぬ影響を避けることができます。
ランタイム特有のコードのインポート
Next.jsはすべての環境でregister
を呼び出すため、特定のランタイムをサポートしないコードを条件付きでインポートすることが重要です(例:EdgeまたはNode.js)。現在の環境を取得するためにNEXT_RUNTIME
環境変数を使用できます:
- TypeScript
- JavaScript
// ランタイム特有のコードを条件付きでインポート
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')
}
}