Skip to content

Commit 97e65bf

Browse files
authored
fix: add correct context propagation for logs (#1118)
1 parent c982e6f commit 97e65bf

File tree

3 files changed

+97
-7
lines changed

3 files changed

+97
-7
lines changed

log.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"time"
1111

1212
"github.com/getsentry/sentry-go/attribute"
13-
debuglog "github.com/getsentry/sentry-go/internal/debuglog"
13+
"github.com/getsentry/sentry-go/internal/debuglog"
1414
)
1515

1616
type LogLevel string
@@ -90,20 +90,30 @@ func (l *sentryLogger) log(ctx context.Context, level LogLevel, severity int, me
9090
if message == "" {
9191
return
9292
}
93-
hub := GetHubFromContext(ctx)
94-
if hub == nil {
95-
hub = CurrentHub()
96-
}
97-
9893
var traceID TraceID
9994
var spanID SpanID
10095
var span *Span
10196
var user User
10297

98+
span = SpanFromContext(ctx)
99+
if span == nil {
100+
span = SpanFromContext(l.ctx)
101+
}
102+
hub := GetHubFromContext(ctx)
103+
if hub == nil {
104+
hub = GetHubFromContext(l.ctx)
105+
}
106+
if hub == nil {
107+
hub = CurrentHub()
108+
}
109+
103110
scope := hub.Scope()
104111
if scope != nil {
105112
scope.mu.Lock()
106-
span = scope.span
113+
// Use span from hub only as last resort
114+
if span == nil {
115+
span = scope.span
116+
}
107117
if span != nil {
108118
traceID = span.TraceID
109119
spanID = span.SpanID

log_context_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package sentry
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/getsentry/sentry-go/internal/testutils"
8+
)
9+
10+
func TestSentryLogger_ShouldLinkToCorrectSpan(t *testing.T) {
11+
transport := &MockTransport{}
12+
err := Init(ClientOptions{
13+
Dsn: testDsn,
14+
EnableTracing: true,
15+
TracesSampleRate: 1.0,
16+
EnableLogs: true,
17+
Transport: transport,
18+
})
19+
if err != nil {
20+
t.Fatal(err)
21+
}
22+
defer Flush(testutils.FlushTimeout())
23+
24+
hub := CurrentHub().Clone()
25+
ctx1 := SetHubOnContext(context.Background(), hub)
26+
span1 := StartTransaction(ctx1, "request-1")
27+
ctx1 = span1.Context()
28+
traceID1 := span1.TraceID
29+
30+
logger := NewLogger(ctx1)
31+
32+
logger.Info().Emit("Log in request-1")
33+
span1.Finish()
34+
35+
ctx2 := SetHubOnContext(context.Background(), hub)
36+
span2 := StartTransaction(ctx2, "request-2")
37+
ctx2 = span2.Context()
38+
traceID2 := span2.TraceID
39+
40+
logger.Info().Emit("Log from request-1 logger during request-2")
41+
logger.Info().WithCtx(ctx2).Emit("Explicit override to request-2")
42+
span2.Finish()
43+
44+
Flush(testutils.FlushTimeout())
45+
events := transport.Events()
46+
var logs []struct {
47+
message string
48+
traceID TraceID
49+
}
50+
51+
for _, event := range events {
52+
for _, log := range event.Logs {
53+
logs = append(logs, struct {
54+
message string
55+
traceID TraceID
56+
}{
57+
message: log.Body,
58+
traceID: log.TraceID,
59+
})
60+
}
61+
}
62+
63+
if len(logs) != 3 {
64+
t.Fatalf("Expected 3 logs, got %d", len(logs))
65+
}
66+
67+
if logs[0].traceID != traceID1 {
68+
t.Errorf("Log 1: expected TraceID %s (request-1), got %s", traceID1, logs[0].traceID)
69+
}
70+
if logs[1].traceID != traceID1 {
71+
t.Errorf("Log 2: expected TraceID %s (request-1), got %s", traceID1, logs[1].traceID)
72+
}
73+
if logs[2].traceID != traceID2 {
74+
t.Errorf("Log 3: expected TraceID %s (request-2), got %s", traceID2, logs[2].traceID)
75+
}
76+
}

slog/sentryslog.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ func (h *logHandler) Enabled(_ context.Context, level slog.Level) bool {
238238
}
239239

240240
func (h *logHandler) Handle(ctx context.Context, record slog.Record) error {
241+
// when logging without context, slog passes `context.Background`. Check for span existence to not overwrite the root context.
242+
if sentry.GetHubFromContext(ctx) == nil {
243+
ctx = h.logger.GetCtx()
244+
}
241245
// aggregate all attributes
242246
attrs := appendRecordAttrsToAttrs(h.attrs, h.groups, &record)
243247
if h.option.AddSource {

0 commit comments

Comments
 (0)