CodeBlanks Logo Icon CodeBlanks

Özet - Observability

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

slog ve metrikleri birleştirerek bir gözlem katmanı yazarsın.

Gözlemlenebilirlik özeti

Üç sütun: loglar (ne oldu? — slog), metrikler (ne kadar, ne sıklıkla? — counter/gauge/histogram), izler (nerede yavaşladı? — span'ler). OpenTelemetry üçünü tek standartta birleştirir. Bunlara ek olarak /livez ve /readyz orkestratörün servisi doğru yönetmesini sağlar.

Logları trace kimliğiyle ilişkilendirmek (log satırına trace_id eklemek) üç sütun arasında gezinmeyi kolaylaştırır.

İstek kimliği middleware'i

Her isteğe bir kimlik verip hem yanıt başlığına hem loglara koymak, bir kullanıcının bildirdiği hatayı bulmayı kolaylaştırır:

func istekID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := r.Header.Get("X-Request-ID")
        if id == "" { id = yeniID() }
        w.Header().Set("X-Request-ID", id)
        log := slog.With("istek_id", id)
        log.Info("istek", "yol", r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

Uygulama İstek kimliği

istekID(next http.Handler) http.Handler yaz: gelen X-Request-ID başlığını yanıt başlığına kopyalasın, boşsa "yeni" kullansın. Başlıksız bir istek gönderip yanıttaki X-Request-ID değerini yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func istekID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := r.Header.Get("X-Request-ID")
        if id == "" {
            id = "yeni"
        }
        w.Header().Set("X-Request-ID", id)
        next.ServeHTTP(w, r)
    })
}

func main() {
    h := istekID(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
    rec := httptest.NewRecorder()
    h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
    fmt.Println(rec.Header().Get("X-Request-ID"))
}

Beklenen çıktı

yeni

Soru ve cevaplar

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

1 "Son bir saatte hata oranı arttı mı?" sorusuna en hızlı hangisi yanıt verir?

  • Metrikler Doğru cevap
  • Tek bir trace
  • pprof
  • Kaynak kod

Açıklama: Oranlar ve eğilimler metriklerin işidir; neden arttığını bulmak için sonra ilgili trace ve loglara inilir.

2 Yapılandırılmış log

Soru
slog.____("ödeme başarısız", "hata", err, "tutar", 120)
Cevap
slog.Error("ödeme başarısız", "hata", err, "tutar", 120)

Açıklama: slog.Error hata seviyesinde, alanlarıyla birlikte kayıt yazar.

3 Sütun ve soru

Kavram Anlamı
Log Ne oldu?
Metrik Ne kadar?
Trace Nerede yavaş?
/readyz Trafik alabilir mi?

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