// Package logging configures the Game Lobby Service process logger and // provides context-aware helpers for trace fields. package logging import ( "context" "fmt" "log/slog" "os" "strings" "go.opentelemetry.io/otel/trace" ) // New constructs the process-wide JSON logger from level. func New(level string) (*slog.Logger, error) { var slogLevel slog.Level if err := slogLevel.UnmarshalText([]byte(strings.TrimSpace(level))); err != nil { return nil, fmt.Errorf("build logger: %w", err) } return slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: slogLevel, })), nil } // TraceAttrsFromContext returns slog key-value pairs for the active // OpenTelemetry span when ctx carries a valid span context. The keys match // the frozen `lobby/README.md` §Observability log fields `trace_id` and // `span_id`. func TraceAttrsFromContext(ctx context.Context) []any { if ctx == nil { return nil } spanContext := trace.SpanContextFromContext(ctx) if !spanContext.IsValid() { return nil } return []any{ "trace_id", spanContext.TraceID().String(), "span_id", spanContext.SpanID().String(), } }