OpenTelemetry
観測可能性は、Next.jsアプリの動作とパフォーマンスを理解し最適化するために重要です。
アプリケーションがより複雑になるにつれ、問題を特定し診断することがますます困難になってきます。ログやメトリクスなどの観測可能性ツールを活用することで、開発者はアプリケーションの動作に関する洞察を得て、最 適化すべき領域を特定できます。観測可能性を持つことで、大きな問題になる前に問題を積極的に処理し、より良いユーザー体験を提供することができます。したがって、Next.jsアプリケーションでは観測可能性を利用してパフォーマンスを向上させ、リソースを最適化し、ユーザー体験を向上させることが強く推奨されます。
アプリを計測するには、OpenTelemetryの利用をお勧めします。プラットフォームに依存しない方法でアプリを計測でき、コードを変更することなく観測可能性プロバイダを変更できます。OpenTelemetryおよびその動作に関する詳細は、公式OpenTelemetryドキュメントを参照してください。
このドキュメントでは、Span、Trace、Exporterなどの用語が使用されています。これらはすべてOpenTelemetryの観測の基礎で確認できます。
Next.jsは標準でOpenTelemetry計測をサポートしており、Next.js自体はすでに計測されています。OpenTelemetryを有効にすると、すべてのコード(例えばgetStaticProps
)が役立つ属性を持つspansで自動的にラッピングされます。
はじめに
OpenTelemetryは拡張可能ですが、正しく設定するには冗長になることがあります。そこで、素早く開始できるように@vercel/otel
というパッケージを用意しました。
@vercel/otel
の使用
始めるには、以下のパッケージをインストールします:
npm install @vercel/otel @opentelemetry/sdk-logs @opentelemetry/api-logs @opentelemetry/instrumentation
次に、プロジェクトのルートディレクトリにカスタムinstrumentation.ts
(または.js
)ファイルを作成します(src
フォルダを使う場合はそこに)。
- TypeScript
- JavaScript
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel({ serviceName: 'next-app' })
}
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel({ serviceName: 'next-app' })
}
追加の設定オプションについては、@vercel/otel
ドキュメントを参照してください。
Good to know:
instrumentation
ファイルは、プロジェクトのルートに配置し、app
やpages
ディレクトリの中に配置しないでください。src
フォルダを使っている場合は、src
内にpages
とapp
と一緒に配置しますpageExtensions
の設定オプションを使用してサフィックスを追加した場合、instrumentation
のファイル名も一致させる必要があります- 使用できる基本的な例としてwith-opentelemetryを作成しました
OpenTelemetry の手動設定
@vercel/otel
パッケージは多くの設定オプションを提供しており、一般的なユースケースのほとんどに対応しています。ただし、それでは不足する場合、OpenTelemetry を手動で設定できます。
まず、OpenTelemetryパッケージをインストールする必要があります:
npm install @opentelemetry/sdk-node @opentelemetry/resources @opentelemetry/semantic-conventions @opentelemetry/sdk-trace-node @opentelemetry/exporter-trace-otlp-http
これでinstrumentation.ts
でNodeSDK
を初期化できます。@vercel/otel
とは異なり、NodeSDK
はedge runtimeと互換性がないため、process.env.NEXT_RUNTIME === 'nodejs'
のときにのみインポートするように注意してください。instrumentation.node.ts
という新しいファイルを作成し、nodeを使用すると きにのみ条件付きでインポートすることをお勧めします:
- TypeScript
- JavaScript
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation.node.ts')
}
}
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation.node.js')
}
}
- TypeScript
- JavaScript
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
import { Resource } from '@opentelemetry/resources'
import { NodeSDK } from '@opentelemetry/sdk-node'
import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'
const sdk = new NodeSDK({
resource: new Resource({
[ATTR_SERVICE_NAME]: 'next-app',
}),
spanProcessor: new SimpleSpanProcessor(new OTLPTraceExporter()),
})
sdk.start()
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
import { Resource } from '@opentelemetry/resources'
import { NodeSDK } from '@opentelemetry/sdk-node'
import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'
const sdk = new NodeSDK({
resource: new Resource({
[ATTR_SERVICE_NAME]: 'next-app',
}),
spanProcessor: new SimpleSpanProcessor(new OTLPTraceExporter()),
})
sdk.start()
これを実行することで@vercel/otel
を使用した場合と同等になりますが、@vercel/otel
で公開されていないいくつかの機能を修正したり拡張したりできます。edge runtimeのサポートが必要な場合は、@vercel/otel
を使用する必要があります。