GoDasturchi
Structured Logging for Cloud

Structured Logging for Cloud

Bulut uchun strukturaviy loglash

"Logging with slog" kursida strukturaviy loglashning asosini ko'rgan edingiz. Bulut muhitida bitta qo'shimcha talab bor: sizning bitta so'rovingiz ko'pincha bir nechta mikroservisdan o'tishi mumkin, va agar biror joyda xato yuz bersa, uni butun zanjir bo'ylab kuzatib borish kerak bo'ladi.

example.go
package main

import (
	"context"
	"log/slog"
	"os"
)

type ctxKey string

const traceIDKey ctxKey = "trace_id"

func withTraceID(ctx context.Context, id string) context.Context {
	return context.WithValue(ctx, traceIDKey, id)
}

func logWithTrace(ctx context.Context, logger *slog.Logger, msg string) {
	traceID, _ := ctx.Value(traceIDKey).(string)
	logger.Info(msg, "trace_id", traceID)
}

func main() {
	opts := &slog.HandlerOptions{
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey {
				return slog.Attr{}
			}
			return a
		},
	}
	logger := slog.New(slog.NewJSONHandler(os.Stdout, opts))

	ctx := withTraceID(context.Background(), "req-abc-123")
	logWithTrace(ctx, logger, "so'rov qabul qilindi")
}

context.WithValue — "Context Package" darsida ko'rgan context.WithTimeout/WithCancelga o'xshash, lekin bu safar vaqt chegarasi emas, ma'lumot (trace_id) tashiydi. Bu "trace ID" — bitta foydalanuvchi so'rovi tizim bo'ylab qanday yo'l bosib o'tganini kuzatish uchun unikal identifikator: u so'rov kirib kelganda yaratiladi va so'rov qaysi funksiyaga, qaysi servisga o'tsa ham, context orqali birga "olib yuriladi".

Natijada, agar keyinroq "req-abc-123" bilan bog'liq barcha loglarni ko'rmoqchi bo'lsangiz (masalan xato tergovi uchun), log aggregator tizimida ("Build a Log Aggregator" loyihasida quradigan turdagi tizim) shu trace_id bo'yicha qidirish kifoya — butun so'rovning "hayoti"ni, hatto u bir necha mikroservisdan o'tgan bo'lsa ham, bitta joyda ko'rish mumkin bo'ladi. Bu — "Distributed Tracing Basics" darsida (Microservices kursida) chuqurroq ko'radigan g'oyaning asosi.

>_ Exercise

Ikkita turli trace_id bilan log yozib, ularni solishtiring.

  • "req-1" va "req-2" trace ID'lari bilan ikkita context yarating
  • har biriga logWithTrace bilan "ishlov berildi" xabarini yozing

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

context.WithValue orqali trace ID'ni so'rov bo'ylab "olib yurish" va har bir log yozuviga qo'shish — taqsimlangan tizimlarda bitta so'rovning to'liq "hayotini" kuzatish imkonini beradi.

NEXT UP

Metrics & Observability: Concepts (Part 1)

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Structured Logging for Cloud

Bulut uchun strukturaviy loglash

"Logging with slog" kursida strukturaviy loglashning asosini ko'rgan edingiz. Bulut muhitida bitta qo'shimcha talab bor: sizning bitta so'rovingiz ko'pincha bir nechta mikroservisdan o'tishi mumkin, va agar biror joyda xato yuz bersa, uni butun zanjir bo'ylab kuzatib borish kerak bo'ladi.

example.go
package main

import (
	"context"
	"log/slog"
	"os"
)

type ctxKey string

const traceIDKey ctxKey = "trace_id"

func withTraceID(ctx context.Context, id string) context.Context {
	return context.WithValue(ctx, traceIDKey, id)
}

func logWithTrace(ctx context.Context, logger *slog.Logger, msg string) {
	traceID, _ := ctx.Value(traceIDKey).(string)
	logger.Info(msg, "trace_id", traceID)
}

func main() {
	opts := &slog.HandlerOptions{
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey {
				return slog.Attr{}
			}
			return a
		},
	}
	logger := slog.New(slog.NewJSONHandler(os.Stdout, opts))

	ctx := withTraceID(context.Background(), "req-abc-123")
	logWithTrace(ctx, logger, "so'rov qabul qilindi")
}

context.WithValue — "Context Package" darsida ko'rgan context.WithTimeout/WithCancelga o'xshash, lekin bu safar vaqt chegarasi emas, ma'lumot (trace_id) tashiydi. Bu "trace ID" — bitta foydalanuvchi so'rovi tizim bo'ylab qanday yo'l bosib o'tganini kuzatish uchun unikal identifikator: u so'rov kirib kelganda yaratiladi va so'rov qaysi funksiyaga, qaysi servisga o'tsa ham, context orqali birga "olib yuriladi".

Natijada, agar keyinroq "req-abc-123" bilan bog'liq barcha loglarni ko'rmoqchi bo'lsangiz (masalan xato tergovi uchun), log aggregator tizimida ("Build a Log Aggregator" loyihasida quradigan turdagi tizim) shu trace_id bo'yicha qidirish kifoya — butun so'rovning "hayoti"ni, hatto u bir necha mikroservisdan o'tgan bo'lsa ham, bitta joyda ko'rish mumkin bo'ladi. Bu — "Distributed Tracing Basics" darsida (Microservices kursida) chuqurroq ko'radigan g'oyaning asosi.

>_ Exercise

Ikkita turli trace_id bilan log yozib, ularni solishtiring.

  • "req-1" va "req-2" trace ID'lari bilan ikkita context yarating
  • har biriga logWithTrace bilan "ishlov berildi" xabarini yozing

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

context.WithValue orqali trace ID'ni so'rov bo'ylab "olib yurish" va har bir log yozuviga qo'shish — taqsimlangan tizimlarda bitta so'rovning to'liq "hayotini" kuzatish imkonini beradi.

NEXT UP

Metrics & Observability: Concepts (Part 1)