46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
// 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(),
|
|
}
|
|
}
|