Distributed Tracing Basics
Taqsimlangan kuzatuv (tracing) asoslari
Pochta jo'natmasini kuzatish raqamini tasavvur qiling: u bir nechta shahar, bir nechta tashish vositasidan o'tsa ham, siz shu BITTA raqam orqali uning butun yo'lini, boshidan oxirigacha kuzatib borishingiz mumkin. Distributed tracing (taqsimlangan kuzatuv) — mikroservislar dunyosida aynan shu g'oya: bitta foydalanuvchi so'rovi bir nechta servisdan o'tsa ham, uni BITTA "trace ID" orqali oxirigacha kuzatish.
package main
import (
"context"
"fmt"
)
type ctxKey string
const traceIDKey ctxKey = "trace_id"
// Gateway (yoki birinchi servis) trace ID'ni YARATADI
func handleRequest(traceID string) {
ctx := context.WithValue(context.Background(), traceIDKey, traceID)
orderService(ctx)
}
// Har bir keyingi servis trace ID'ni FAQAT UZATADI, o'zgartirmaydi
func orderService(ctx context.Context) {
fmt.Println("OrderService, trace:", ctx.Value(traceIDKey))
paymentService(ctx)
}
func paymentService(ctx context.Context) {
fmt.Println("PaymentService, trace:", ctx.Value(traceIDKey))
}
func main() {
handleRequest("trace-abc-123")
}"Structured Logging for Cloud" darsida ko'rgan context.WithValue naqshining aynan shu yerda, ammo bir nechta servis bo'ylab ishlatilishini ko'rasiz: handleRequest (masalan API Gateway) so'rov kirib kelganda BIR MARTA trace ID yaratadi, va bu context keyingi har bir funksiya chaqiruviga (yoki haqiqiy loyihada — har bir HTTP so'roviga, maxsus sarlavha orqali) "qo'lma-qo'l" o'tkaziladi.
Haqiqiy production tizimlarda bu g'oya OpenTelemetry kabi standart vositalar orqali amalga oshiriladi, va natija maxsus "trace vizualizatsiya" vositalarida (Jaeger, Zipkin) daraxt ko'rinishida ko'rsatiladi — "so'rov Gateway'da 2ms, OrderService'da 15ms, PaymentService'da 200ms sarfladi" kabi. Bu — sekin ishlayotgan aniq servisni TOPISH uchun eng samarali vosita, ayniqsa o'nlab mikroservisdan iborat katta tizimlarda.
>_ Exercise
Uchinchi bosqichni (InventoryService) zanjirga qo'shing.
- •inventoryService(ctx context.Context) funksiyasini yozing: "InventoryService, trace:" va trace ID'ni chop etsin
- •paymentService ichida, o'z chiqishidan keyin inventoryService(ctx)ni chaqiring
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Distributed tracing — bitta trace ID'ni so'rov bo'ylab barcha servislarga uzatib, taqsimlangan tizimda bitta so'rovning to'liq "yo'lini" kuzatish imkonini beradi.
$ go run main.go
Kodingizni ishga tushiring