Trace, dağıtık bir sistem üzerinden istek akışını gözlemleme yöntemidir; burada her işlem adımı, zaman damgalı ayrı bir olay olarak kaydedilir. OpenTelemetry, 2025'e göre, bir trace, giriş noktasından nihai yanıta kadar isteğin tam yolunu, tüm mikro hizmetler ve harici çağrılar üzerinden geçerek birleştirir. Bu, geliştiricilerin karmaşık mobil arka uç mimarilerindeki darboğazları, gecikmeleri ve arızaları belirlemesini sağlar.
Önemli Noktalar
Trace, her gelen isteğin sistemin tüm hizmetleri ve bileşenleri üzerinden izlendiği dağıtık gözlem yöntemidir. Toplu değerler gösteren metriklerin (ortalama yanıt süresi, hata sayısı) aksine, trace tek bir belirli isteğin tam bağlamını korur.
Her işlem adımı — veritabanı çağrısı, başka bir mikro hizmete HTTP isteği, arka plan görevinin yürütülmesi — zaman damgası, durum ve niteliklerle ayrı bir birim olarak kaydedilir. Google Dapper'a (2010 orijinal yayını) göre, trace, dağıtık sistemlerdeki gecikmeleri tek bir çağrı hassasiyetiyle belirlemeyi sağlar.
Trace, arka ucun düzinelerce mikro hizmettten oluştuğu mobil uygulamalar için özellikle önemlidir. Bir kullanıcı eylemi — hesaba giriş yapmak gibi — API Gateway, kimlik doğrulama hizmeti, veritabanı ve Push hizmeti üzerinden geçebilir. Trace olmadan, hangi bileşenin yanıtı yavaşlattığını belirlemek neredeyse imkansızdır.
Trace'in temel birimi span'dir. Her span, mantıksal bir işlemi temsil eder: bir HTTP isteği, SQL sorgusu, gRPC çağrısı, JSON serileştirme. Bir span, benzersiz bir tanımlayıcı, üst tanımlayıcı, işlem adı, başlangıç zamanı, süre, durum ve bir dizi nitelik içerir.
Aynı kök istekle ilgili tüm span'ler bir trace altında gruplanır. Kök span, giriş noktasını temsil eder — mobil istemciden API'ye bir HTTP isteği. Alt span'ler bir ağaç oluşturur ve her span, parent_span_id alanı aracılığıyla üst span'ine referans verir.
Bir trace'in süresi, tüm span'lerin benzersiz zaman dilimlerinin sürelerinin toplamına eşittir. İki alt span paralel olarak yürütülürse, süreleri toplanmaz — bu, paralel mikro hizmet çağrılarının neden olduğu gecikmeleri doğru şekilde analiz etmek için kritiktir.
Her span, nitelikler (meta bilgi içeren anahtar-değer çiftleri: istek URL'si, kullanıcı ID'si, API sürümü, ana bilgisayar adı) içerebilir. Nitelikler, trace'leri filtrelemek ve gruplamak için kullanılır. Niteliklerin yanı sıra, span'ler olayları (metin açıklamalı zaman damgaları, örneğin "önbellek hatası" veya "bağlantı yeniden denemesi") destekler.
Dağıtık izleme, farklı süreçlerde ve farklı makinelerde oluşturulan span'leri birleştirme sorununu çözer. Mekanizma, bağlam aktarımına dayanır: A hizmeti B hizmetini çağırdığında, giden isteğe geçerli trace ID'si ve üst span ID'sini içeren bir başlık eklenir.
Standart bağlam aktarım protokolleri W3C Trace Context (traceparent ve tracestate başlıkları) ve Zipkin B3'tür (X-B3-TraceId, X-B3-SpanId başlıkları). W3C Trace Context, 2021 yılında W3C konsorsiyumu tarafından standart olarak kabul edilmiş ve tüm büyük telemetri sağlayıcıları tarafından desteklenmektedir.
İsteği alan B hizmeti, başlıktan trace_id'yi çıkarır ve bu trace_id ile bir alt span oluşturur. Böylece istek tamamlandıktan sonra, farklı hizmetlerdeki tüm span'ler toplayıcı tarafında tek bir trace'te birleştirilir. Bu, her hizmetin aynı izleme kitaplığıyla enstrümente edilmesini gerektirir.
Mobil geliştirmede, bağlam aktarımı yalnızca arka ucu değil, aynı zamanda istemci-sunucu etkileşimini de kapsar. Bir mobil uygulama, her API isteğinin başlığında bir trace_id gönderebilir ve böylece istemci eylemini sunucu tarafı işleme bağlayabilir. iOS ve Android için OpenTelemetry SDK'sı, HTTP istemcileri aracılığıyla otomatik trace bağlamı oluşturma ve aktarımını destekler.
import io.opentelemetry.api.trace.Span
import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.context.Context
class TracingInterceptor : Interceptor {
private val tracer: Tracer = OpenTelemetry.getTracer("mobile-app")
override fun intercept(chain: Interceptor.Chain): Response {
val span = tracer.spanBuilder("HTTP POST /api/login")
.setParent(Context.current())
.startSpan()
return chain.proceed(chain.request())
.also { span.end() }
}
}
Sunulan Kotlin interceptor'ı, sunucuya yapılan her HTTP isteği için bir span oluşturur. Üst bağlam, Context.current() aracılığıyla çağıran koddan aktarılır ve istemci tarafı izlemeyi sunucu tarafı izlemeye bağlamaya olanak tanır.
OpenTelemetry, trace verisi toplama için fiili standarttır. Span oluşturmak için birleşik bir API, popüler kitaplıkların otomatik enstrümantasyonu ve verileri çeşitli arka uçlara (Jaeger, Zipkin, Grafana Tempo, Datadog, New Relic) aktarmak için esnek bir mekanizma sağlar.
OpenTelemetry, popüler çerçeveler (Spring Boot, Ktor, Flask, Express, gRPC) için otomatik span oluşturmayı destekler. Geliştiricinin yalnızca projeye bir bağımlılık eklemesi yeterlidir ve kitaplık otomatik olarak gelen ve giden istekleri yakalar. Java için otomatik enstrümantasyon, kaynak kodunu değiştirmeden bayt kodunu anında değiştiren bir javaagent kullanır.
Mobil platformlar için OpenTelemetry, Swift SDK ve Kotlin SDK sağlar. Bunlar, ağ istekleri (URLSession, OkHttp), veritabanı işlemleri (CoreData, Room) ve arka plan görevleri için otomatik olarak span oluşturur. Geliştirici, iş mantığı için özel span'ler ekleyebilir.
Toplanan span'ler, OTLP (OpenTelemetry Protocol) protokolü aracılığıyla bir toplayıcıya gönderilir. Toplayıcı, verileri arabelleğe alabilir, filtreleyebilir ve bir veya daha fazla depolama sistemine yönlendirebilir. OpenTelemetry dokümantasyonuna göre, gRPC aktarımı kullanıldığında bir span'in oluşturulmasından bir panoda görüntülenmesine kadar geçen tipik gecikme 2-5 saniyedir.
import OpenTelemetryApi
import OpenTelemetrySdk
import URLSessionInstrumentation
let instrumentation = URLSessionInstrumentation()
instrumentation.enable()
let tracer = OpenTelemetry.instance.tracerFactory
.get("mobile-monitoring")
let span = tracer.spanBuilder("fetch-user-profile")
.setAttribute(key: "user.id", value: userId)
.startSpan()
span.end()
Swift kodu, ağ katmanının otomatik enstrümantasyonunu etkinleştirir ve kullanıcı profili alma işlemi için özel bir span oluşturur. user.id niteliği, daha sonra trace'leri belirli bir kullanıcıya göre filtrelemeye olanak tanır.
Yüksek yük sistemlerinde her isteği izlemek imkansızdır — bu, depolama ve ağ üzerinde kabul edilemez bir yük oluşturur. Örnekleme, trace'lerin yalnızca bir kısmını kaydederek bu sorunu çözer. Strateji seçimi, veri bütünlüğünü ve altyapı maliyetini doğrudan etkiler.
Bir trace'i kaydetme kararı, oluşturulduğu anda — kök span'de — alınır. En basit ve en yaygın yaklaşım: isteklerin sabit bir yüzdesi (örneğin %5) kaydedilir, geri kalanı atılır. Dezavantajı, nadir hataların yakalanacağının garanti edilememesidir. OpenTelemetry'deki Probability sampler, 0,0 ile 1,0 arasında olasılık ayarını destekler.
Karar, trace'in tüm span'leri tamamlanana kadar ertelenir. Bir analizör, trace'in hata, zaman aşımı veya ilginç nitelikler içerip içermediğini değerlendirir ve yalnızca o zaman kaydeder. Bu yaklaşım, toplayıcıda tüm span'lerin arabelleğe alınmasını gerektirir, bu da bellek tüketimini artırır. Grafana Labs'e göre, nadir ancak kritik hataların olduğu sistemlerde kuyruk tabanlı örnekleme, "faydalı veri başına maliyet" açısından %40-60 daha verimlidir.
| Strateji | Avantajlar | Dezavantajlar |
|---|---|---|
| Sabit olasılık | Basitlik, öngörülebilir yük | Nadir olayları kaçırır |
| Hız sınırlama | Garantili veri hacmi | Dengesiz kapsama |
| Kuyruk tabanlı | Tüm hataları yakalar | Yüksek bellek tüketimi |
| Uyarlamalı | Maliyet ve kapsama dengesi | Karmaşık yapılandırma |
Günlük (log), önem düzeyleriyle (bilgi, uyarı, hata) bireysel olayları kaydeder ancak bunları tek bir isteğin bağlamında birleştirmez. Trace ise tam tersine, uçtan uca bir isteğe ait işlemlerin yapılandırılmış bir ağacını oluşturur. Pratikte, bu iki yaklaşım birbirini dışlamaz, tamamlar.
Günlükler, belirli bir hatanın ayrıntılı analizi için etkilidir: geliştirici tam mesajı, yığın izini ve değişken değerlerini görür. Trace, "istek neden 5 saniye sürüyor" sorusuna yanıt verir — hangi mikro hizmetin veya çağrının en çok zaman aldığını gösterir. Honeycomb (2024)'e göre, trace'i günlükle birlikte kullanan ekipler, olayların temel nedenini 2,3 kat daha hızlı bulur.
Modern yaklaşım — gözlemlenebilirlik — trace, metrik ve günlükleri tek bir sistemde birleştirir. OpenTelemetry bu üç sinyal arasındaki korelasyonu destekler: her span, ilgili günlüklere bağlantılar içerebilir ve metrikler, belirli trace'lere inmek için trace_id ile etiketlenebilir.
Sıkça Sorulan Sorular
İzleme, sistemin toplu metriklerini gösterir — ortalama yanıt süresi, dakikadaki hata sayısı, CPU yükü. Trace, tek bir belirli isteğin tüm bileşenler üzerinden yolunu gösterir. İzleme "ne oluyor" sorusunu yanıtlar, trace "neden oluyor" sorusunu yanıtlar.
Üretim sistemleri için başlık tabanlı örnekleme ile isteklerin %1-5'i yeterlidir. Sistem nadiren hata üretiyorsa, tüm hata trace'lerini yakalamaya odaklı kuyruk tabanlı örnekleme önerilir. Staging ortamları için kısıtlama olmaksızın %100 isteği izlemek kabul edilebilir.
Başlıca araçlar: Jaeger (Uber çözümü, açık kaynak), Grafana Tempo (ölçeklenebilir trace deposu), Datadog APM, New Relic Distributed Tracing, AWS X-Ray ve Honeycomb. Hepsi, veri alımı için OpenTelemetry standardını destekler.
Evet, yerel izleme tek bir süreç içinde çalışır. iOS ve Android için OpenTelemetry SDK'sı, yerel işlemler için span oluşturur: veritabanı okuma, görüntü işleme, ağ istekleri. Bu trace'ler dağıtık değildir ancak istemci tarafı performansını teşhis etmek için faydalıdır.
Modern izleme kitaplıkları, başlık tabanlı örnekleme ile %1'den az ek yük ekler. OpenTelemetry, ana iş parçacığını engellemeyen eşzamansız veri aktarımı kullanır. Mobil cihazlar için, span oluşturma sıklığının sınırlandırılması ve uyarlamalı örnekleme stratejisi kullanılması önerilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun