· kaynak dev.to (home feed)
Next.js 16, instrumentation.ts'yi stabilize ederek wrapper'sız OpenTelemetry ve Sentry entegrasyonunu mümkün kılıyor
Next.js 16, instrumentation.ts dosyasını stabilize edilmiş ve garanti edilen bir init hook'una dönüştürdü; middleware, route ve component'lerden önce çalışarak ekiplerin OpenTelemetry ve Sentry kurulumunu özel wrapper'lar olmadan yapmasına olanak tanıyor.
Gözlemlenebilirlik için garanti edilen bir giriş noktası
Next.js'teki gözlemlenebilirlik sorunlarının çoğu initialization zamanlamasına dayanır. Platformda yayınlanan bir dev.to makalesine göre, Sentry'yi veya bir OpenTelemetry collector'ı _app.tsx veya middleware içinde import eden ekipler, ilk istek gelmeden önce hiç tamamlanmamış bir SDK ile karşılaşabiliyor ve ortaya çıkan telemetry boşlukları, tam da production'ın görünürlüğe ihtiyaç duyduğu anda ortaya çıkıyor.
Next.js 16 buna yanıt olarak instrumentation.ts dosyasını stabilize ediyor. Dosya, framework'ün her runtime ortamında tam olarak bir kez çağırdığı tek bir register fonksiyonunu export ediyor; bu çağrı middleware, route handler'ları veya React component'leri yüklenmeden önce gerçekleşiyor. dev.to yazısı bu değişimi, gözlemlenebilirliği bir runtime kaygısından build-time bir sözleşmeye dönüştürmek olarak tanımlıyor: wrapper fonksiyonları ve "bunu önce import et" yorumları yerine, framework'ün kendisi deterministik bir boot sırası sağlıyor.
register gerçekten neyi garanti ediyor
Çalıştırma modeli, stability etiketi kadar önemli:
- Serverless dağıtımlarda
registerher cold start'ta bir kez çalışır; uzun ömürlü Node.js sunucularında ise process boot sırasında bir kez çalışır. Request başına çalışan bir hook değildir. - React Server Component kapsamı içinde çalışmaz ve middleware'in çalıştırma bağlamını paylaşmaz.
- Dosya sistemine, environment değişkenlerine ve network I/O'ya erişimi olan bir Node.js bağlamında çalışır; SDK initialization'ın tipik olarak ihtiyaç duyduğu şeyler bunlardır.
- Fonksiyon senkron veya asenkron olabilir. Asenkron ise Next.js, HTTP sunucusunu başlatmadan veya middleware'i çağırmadan önce promise'in çözülmesini bekler.
Dosya src/ dizininin kökünde ya da proje kökündeki next.config.js dosyasının yanında yer alır ve framework onu otomatik olarak keşfeder — herhangi bir configuration flag'i veya deneysel toggle gerekmez.
O beklenen boot işleminin bir maliyeti var ve makale buna açıklıkla değiniyor: yavaş initialization tüm başlatma sırasını bloke eder. Ingest endpoint'ine ulaşması üç saniye süren bir SDK, cold start süresine üç saniye ekler; bu yüzden cold start'ların doğrudan P99 gecikmesine yansıdığı serverless platformlarındaki ekiplerin, kapsamlı kurulum ile başlatma hızı arasında denge kurması gerekir.
@vercel/otel ile OpenTelemetry
Dağıtık tracing için makale, Vercel'in zero-config OpenTelemetry paketi olan @vercel/otel'e işaret ediyor. Registration yolu instrumentation.ts için tasarlanmış:
ts export async function register() { if (process.env.NEXT_RUNTIME === "nodejs") { await import("@vercel/otel/register"); } }
Bu birkaç satırla paket, HTTP, fetch, veritabanı ve framework sınırlarını otomatik olarak instrumente ediyor — route handler'ları, middleware, Server Component'ler ve API route'larının her biri span alıyor, dışa giden fetch çağrıları trace context propagation header'larını taşıyor ve Prisma veya Drizzle gibi kütüphaneler üzerinden yapılan veritabanı sorguları aktif request trace'i altında child span olarak görünüyor. NEXT_RUNTIME kontrolü, Node'a özel SDK kodunu Edge Runtime dışında tutuyor ve dinamik import, SDK'yı gerekmediği yerlerde yüklemeyi engelliyor.
Otomatik instrumentation'ın çıkaramayacağı veriler için standart OpenTelemetry API doğrudan kullanılabilir. Makale, trace.getTracer ile bir validate-payment span'i başlatan bir API route örneği gösteriyor: sipariş tutarı ve para birimi gibi attribute'lar ayarlanıyor, exception'lar kaydediliyor, OK veya ERROR durumu belirleniyor ve span bir finally bloğunda sonlandırılıyor — böylece iş mantığına özgü alanlar, gözlemlenebilirlik platformlarının sorgulayabileceği trace zaman çizelgesine yerleştirilmiş oluyor.
Config dağınıklığı olmadan Sentry
Sentry'nin geleneksel Next.js kurulumu, _app.tsx ve route dosyalarının en üstünde import edilen ayrı sentry.client.config.ts ve sentry.server.config.ts dosyalarını gerektiriyordu; makale bu deseni parçalı ve zamanlamaya duyarlı olarak tanımlıyor. instrumentation.ts ile tek bir Sentry.init çağrısı register içinde initialization'ı karşılıyor; NEXT_RUNTIME kontrolü ile Node.js ve Edge ortamları farklı şekilde yapılandırılabiliyor. HTTP tracing ve Prisma instrumentation gibi entegrasyonlar aynı yerden eklenebiliyor ve makale, SDK ilk component render edilmeden devrede olduğu için React Server Component'lerle error-boundary davranışının kutudan çıktığı gibi çalıştığını belirtiyor.
Neden önemli
Stabil instrumentation.ts, Next.js dağıtımlarından sessiz hata sınıfının tamamını ortadan kaldırıyor: framework kodu ile gözlemlenebilirlik SDK'ları arasındaki yarış. Ekipler, tracing, hata takibi ve logging pipeline'larını başlatmak için iyi tanımlanmış tek bir yer ediniyor; yürütme sırasını geliştiricilerin import sıralamasıyla taklit etmeye çalıştığı değil, framework'ün garanti ettiği bir sıra. Ödünleşme açık — initialization artık boot kritik yolunda — ancak bu görünürlük, sessizce hiç başlamamış bir telemetry'den tercih edilir. Sentry, Datadog veya OpenTelemetry backend'leriyle Next.js'i production'da çalıştıran herkes için, init mantığını taşıması gereken hook işte bu.
- #next-js
- #opentelemetry
- #sentry
- #observability
- #javascript