計装 (Instrumentation) の設定方法

計装 (Instrumentation) とは、コードを使用してアプリケーションにモニタリングやロギングツールを統合するプロセスです。これにより、アプリケーションのパフォーマンスや動作を追跡し、本番環境での問題をデバッグできます。

規約

計装を設定するには、プロジェクトのルートディレクトリ(またはsrcフォルダを使用している場合はその中)にinstrumentation.ts|jsファイルを作成します。

次に、このファイルからregister関数をエクスポートします。この関数は、新しいNext.jsサーバーインスタンスが起動する際に1回呼び出されます。

例えば、Next.jsをOpenTelemetry@vercel/otelで使用する場合:

import { registerOTel } from '@vercel/otel'

export function register() {
  registerOTel('next-app')
}

完全な実装についてはNext.js with OpenTelemetryの例を参照してください。

知っておくと良いこと:

  • instrumentationファイルはプロジェクトのルートに配置し、apppagesディレクトリ内には配置しないでください。srcフォルダを使用している場合は、pagesappと同階層のsrc内にファイルを配置します。
  • pageExtensions設定オプションを使用して接尾辞を追加する場合、instrumentationのファイル名もそれに合わせて更新する必要があります。

副作用のあるファイルのインポート

時々、コード内で副作用を引き起こすためにファイルをインポートすることが有用な場合があります。例えば、グローバル変数のセットを定義するファイルをインポートしても、コード内で明示的にそのインポートファイルを使用しない場合があります。それでも、パッケージが宣言したグローバル変数にアクセスできます。

register関数内でJavaScriptのimport構文を使用してファイルをインポートすることを推奨します。以下の例は、register関数内でのimportの基本的な使用方法を示しています:

export async function register() {
  await import('package-with-side-effect')
}

知っておくと良いこと:

ファイルの先頭でグローバルにインポートするのではなく、register関数内からインポートすることを推奨します。これにより、コード内の副作用を1か所にまとめ、ファイルの先頭でグローバルにインポートすることによる意図しない影響を避けることができます。

ランタイム固有のコードのインポート

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')
  }
}

On this page