インストルメンテーション
プロジェクトのルートディレクトリ(またはsrc
フォルダを使用している場合はその中)にinstrumentation.ts
(または.js
)ファイルを作成し、register
という名前の関数をエクスポートすると、新しいNext.jsサーバーインスタンスが起動するたびにその関数が呼び出されます。
知っておくとよいこと
- この機能は実験的です。使用するには、
next.config.js
でexperimental.instrumentationHook = true;
を明示的に定義する必要があります。instrumentation
ファイルはプロジェクトのルートに配置し、app
やpages
ディレクトリ内には置かないでください。src
フォルダを使用している場合は、pages
やapp
と同階層にファイルを配置します。pageExtensions
設定オプションを使用してサフィックスを追加する場合、instrumentation
ファイル名もそれに合わせて更新する必要があります。- 基本的なwith-opentelemetryの例を用意していますので、参考にしてください。
register
関数がデプロイされると、コールドブートのたびに(ただし各環境で正確に1回)呼び出されます。
コード内で副作用を引き起こすためにファイルをインポートすると便利な場合があります。例えば、グローバル変数のセットを定義するファイルをインポートしても、コード内で明示的にそのファイルを使用しない場合でも、パッケージが宣言したグローバル変数にアクセスできます。
instrumentation.ts
で副作用のあるファイルをインポートできます。以下の例に示すように、register
関数内で使用したい場合があります:
import { init } from 'package-init'
export function register() {
init()
}
import { init } from 'package-init'
export function register() {
init()
}
ただし、副作用のあるファイルはregister
関数内でimport
を使用してインポートすることを推奨します。以下の例はregister
関数内での基本的なimport
の使用方法を示しています:
export async function register() {
await import('package-with-side-effect')
}
export async function register() {
await import('package-with-side-effect')
}
この方法により、すべての副作用をコード内の1か所にまとめて配置でき、ファイルのインポートによる意図しない結果を回避できます。
register
はすべての環境で呼び出されるため、edge
とnodejs
の両方をサポートしていないコードは条件付きでインポートする必要があります。現在の環境を取得するには環境変数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')
}
}