コンテンツにスキップ

計測

計測とは、監視・ロギングツールをアプリケーションに統合するためにコードを使用するプロセスです。これにより、アプリケーションのパフォーマンスと動作を追跡し、本番環境での問題をデバッグできます。

規約

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

次に、ファイル内で `register` 関数をエクスポートします。この関数は、新しいNext.jsサーバーインスタンスが初期化されるときに**一度だけ**呼び出されます。

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

instrumentation.ts
import { registerOTel } from '@vercel/otel'
 
export function register() {
  registerOTel('next-app')
}

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

知っておくと良いこと:

  • `instrumentation` ファイルはプロジェクトのルートに配置し、`app` や `pages` ディレクトリ内には配置しないでください。`src` フォルダを使用している場合は、`src` の中に `pages` および `app` と並べてファイルを配置してください。
  • `pageExtensions` 設定オプションを使用してサフィックスを追加する場合、`instrumentation` ファイル名もそれに合わせて更新する必要があります。

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

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

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

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

知っておくと良いこと

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

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

Next.jsはすべての環境で `register` を呼び出すため、特定のランタイム(例: EdgeまたはNode.js)をサポートしないコードは条件付きでインポートすることが重要です。現在の環境を取得するには、`NEXT_RUNTIME` 環境変数を使用できます。

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