Ö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
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func main() {
// buraya yaz
}Örnek çözüm
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
slog.____("ödeme başarısız", "hata", err, "tutar", 120)
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? |