Go
Özet - Observability
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.
Örnek çözümü göster
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"))
}
Kendini test et
-
"Son bir saatte hata oranı arttı mı?" sorusuna en hızlı hangisi yanıt verir?
- Metrikler
- Tek bir trace
- pprof
- Kaynak kod
Cevabı göster
Metrikler — Oranlar ve eğilimler metriklerin işidir; neden arttığını bulmak için sonra ilgili trace ve loglara inilir.
-
Yapılandırılmış log
slog.____("ödeme başarısız", "hata", err, "tutar", 120)
Cevabı göster
slog.Error("ödeme başarısız", "hata", err, "tutar", 120)
-
Sütun ve soru
- Log
- Ne oldu?
- Metrik
- Ne kadar?
- Trace
- Nerede yavaş?
- /readyz
- Trafik alabilir mi?
Sıradaki ders: Meydan okuma 1 - Reflection