GoDasturchi
Distributed Tracing Basics

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.

example.go
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.

Hints (0/3)

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.

Finish
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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.