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 msBu 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
package main
import (
"fmt"
"time"
)
func main() {
// buraya yaz
}Örnek çözüm
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
ctx, span := tracer.Start(ctx, "kaydet")
____ span.End()
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 |