From 77f989a478b63c4ef61d642a0f407801647508a2 Mon Sep 17 00:00:00 2001 From: Samuel Berthe Date: Fri, 26 Apr 2024 01:57:27 +0200 Subject: [PATCH] feat: load attributes from context --- README.md | 37 +++++++++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- handler.go | 9 ++++++++- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 593b299..5d909ee 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,8 @@ type Option struct { // optional: customize Kafka event builder Converter Converter + // optional: fetch attributes from context + AttrFromContext []func(ctx context.Context) []slog.Attr // optional: see slog.HandlerOptions AddSource bool @@ -216,6 +218,41 @@ Kafka message: } ``` +### Tracing + +Import the samber/slog-otel library. + +```go +import ( + slogkafka "github.com/samber/slog-kafka" + slogotel "github.com/samber/slog-otel" + "go.opentelemetry.io/otel/sdk/trace" +) + +func main() { + tp := trace.NewTracerProvider( + trace.WithSampler(trace.AlwaysSample()), + ) + tracer := tp.Tracer("hello/world") + + ctx, span := tracer.Start(context.Background(), "foo") + defer span.End() + + span.AddEvent("bar") + + logger := slog.New( + slogkafka.Option{ + // ... + AttrFromContext: []func(ctx context.Context) []slog.Attr{ + slogotel.ExtractOtelAttrFromContext([]string{"tracing"}, "trace_id", "span_id"), + }, + }.NewKafkaHandler(), + ) + + logger.ErrorContext(ctx, "a message") +} +``` + ## 🤝 Contributing - Ping me on twitter [@samuelberthe](https://twitter.com/samuelberthe) (DMs, mentions, whatever :)) diff --git a/go.mod b/go.mod index ba0ad01..52e4d87 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/samber/slog-kafka/v2 go 1.21 require ( - github.com/samber/slog-common v0.15.2 + github.com/samber/slog-common v0.16.0 github.com/segmentio/kafka-go v0.4.39 go.uber.org/goleak v1.2.1 ) diff --git a/go.sum b/go.sum index 5c7cf56..b88409e 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/samber/slog-common v0.15.2 h1:jQQK2MzJ1kfEsUyxI/mpwkqB2xI0qCo9Ne1D1yziuP0= -github.com/samber/slog-common v0.15.2/go.mod h1:Qjrfhwk79XiCIhBj8+jTq1Cr0u9rlWbjawh3dWXzaHk= +github.com/samber/slog-common v0.16.0 h1:2/t1EcFd1Ru77mh2ab+8B6NBHnEXsBBHtOJc7PSH0aI= +github.com/samber/slog-common v0.16.0/go.mod h1:Qjrfhwk79XiCIhBj8+jTq1Cr0u9rlWbjawh3dWXzaHk= github.com/segmentio/kafka-go v0.4.39 h1:75smaomhvkYRwtuOwqLsdhgCG30B82NsbdkdDfFbvrw= github.com/segmentio/kafka-go v0.4.39/go.mod h1:T0MLgygYvmqmBvC+s8aCcbVNfJN4znVne5j0Pzowp/Q= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/handler.go b/handler.go index 9bfa3fe..9a18660 100644 --- a/handler.go +++ b/handler.go @@ -21,6 +21,8 @@ type Option struct { // optional: customize Kafka event builder Converter Converter + // optional: fetch attributes from context + AttrFromContext []func(ctx context.Context) []slog.Attr // optional: see slog.HandlerOptions AddSource bool @@ -44,6 +46,10 @@ func (o Option) NewKafkaHandler() slog.Handler { o.Converter = DefaultConverter } + if o.AttrFromContext == nil { + o.AttrFromContext = []func(ctx context.Context) []slog.Attr{} + } + return &KafkaHandler{ option: o, attrs: []slog.Attr{}, @@ -64,7 +70,8 @@ func (h *KafkaHandler) Enabled(_ context.Context, level slog.Level) bool { } func (h *KafkaHandler) Handle(ctx context.Context, record slog.Record) error { - payload := h.option.Converter(h.option.AddSource, h.option.ReplaceAttr, h.attrs, h.groups, &record) + fromContext := slogcommon.ContextExtractor(ctx, h.option.AttrFromContext) + payload := h.option.Converter(h.option.AddSource, h.option.ReplaceAttr, append(h.attrs, fromContext...), h.groups, &record) return h.publish(record.Time, payload) }