CodeBlanks Logo Icon CodeBlanks

Tracing

  • Go kursu
  • İleri seviye
  • Ders 61/68
  • 4 dk

Dağıtık izleme (tracing) kavramını öğrenirsin.

Dağıtık izleme

Bir istek birden çok servisten geçtiğinde log ve metrikler nerede yavaşladığını tam söylemez. İzlemede (tracing) her iş bir span'dır; span'ler iç içe geçerek bir trace oluşturur:

trace a1b2 ─ GET /siparis       120 ms
           ├─ stok-servisi      30 ms
           └─ odeme-servisi     80 ms
              └─ SQL INSERT     65 ms

Bu görünüm, gecikmenin ödeme servisindeki SQL sorgusundan geldiğini hemen gösterir.

context ile yayılım

Go'da aktif span context.Context içinde taşınır. Bu yüzden izlenen her fonksiyon ilk parametre olarak ctx alır ve aldığı ctx'i aşağı iletir:

func odemeAl(ctx context.Context, tutar int) error {
    ctx, span := tracer.Start(ctx, "odemeAl")
    defer span.End()
    return repo.Kaydet(ctx, tutar)  // çocuk span burada açılır
}

context.Background() ile yeni zincir başlatmak izi koparır.

Uygulama Basit span

Kendi mini span türünü yaz: start(ad string) func() başlangıç zamanını alsın ve çağrıldığında ad + " bitti" yazdıran bir fonksiyon döndürsün. defer start("islem")() ile bir fonksiyonda kullan.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "time"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "time"
)

func start(ad string) func() {
    bas := time.Now()
    return func() {
        _ = time.Since(bas)
        fmt.Println(ad + " bitti")
    }
}

func islem() {
    defer start("islem")()
    fmt.Println("çalışıyor")
}

func main() {
    islem()
}

Beklenen çıktı

çalışıyor
islem bitti

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir servisten diğerine trace kimliği nasıl taşınır?

  • Veritabanına yazarak
  • Log dosyasıyla
  • Taşınmaz, her servis yenisini üretir
  • İstek başlığıyla (ör. traceparent) Doğru cevap

Açıklama: W3C Trace Context standardı traceparent başlığını tanımlar; alan servis bu başlıktan üst span'i bulur ve çocuk span açar.

2 Span'i kapat

Soru
ctx, span := tracer.Start(ctx, "kaydet")
____ span.End()
Cevap
ctx, span := tracer.Start(ctx, "kaydet")
defer span.End()

Açıklama: defer span.End() fonksiyon bitince span'in süresini kapatır.

3 İzleme kavramları

Kavram Anlamı
Trace Bir isteğin tüm yolculuğu
Span Tek bir iş birimi
traceparent Servisler arası başlık
ctx Span'i fonksiyonlara taşır

İleri seviye bölümündeki tüm dersler