Skip to content

Commit 31f3a9e

Browse files
committed
Configure opentelemetry-go's logger
This adds a little adapter from zap to opentelemetry-go's expected logger interface, so we can get opentelemetry logs.
1 parent 7518e29 commit 31f3a9e

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.22
44

55
require (
66
github.com/getsentry/sentry-go v0.27.0
7+
github.com/go-logr/logr v1.4.1
78
github.com/go-redis/redismock/v9 v9.2.0
89
github.com/golangci/golangci-lint v1.57.2
910
github.com/hashicorp/go-retryablehttp v0.7.5
@@ -79,7 +80,6 @@ require (
7980
github.com/fzipp/gocyclo v0.6.0 // indirect
8081
github.com/ghostiam/protogetter v0.3.5 // indirect
8182
github.com/go-critic/go-critic v0.11.2 // indirect
82-
github.com/go-logr/logr v1.4.1 // indirect
8383
github.com/go-logr/stdr v1.2.2 // indirect
8484
github.com/go-toolsmith/astcast v1.1.0 // indirect
8585
github.com/go-toolsmith/astcopy v1.1.0 // indirect

telemetry/logger.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package telemetry
2+
3+
import (
4+
"github.com/go-logr/logr"
5+
"go.uber.org/zap"
6+
"go.uber.org/zap/zapcore"
7+
)
8+
9+
type zapAdapter struct {
10+
logger *zap.Logger
11+
}
12+
13+
func (z *zapAdapter) Init(info logr.RuntimeInfo) {
14+
// +1 for this wrapper
15+
// +1 for opentelemetry-go's internal_logging.go
16+
skip := info.CallDepth + 2
17+
z.logger = z.logger.WithOptions(zap.AddCallerSkip(skip))
18+
}
19+
20+
func (z *zapAdapter) Enabled(level int) bool {
21+
return z.logger.Core().Enabled(mapLevel(level))
22+
}
23+
24+
func (z *zapAdapter) Info(level int, msg string, keysAndValues ...any) {
25+
z.logger.Sugar().Logw(mapLevel(level), msg, keysAndValues...)
26+
}
27+
28+
func (z *zapAdapter) Error(err error, msg string, keysAndValues ...any) {
29+
keysAndValues = append(keysAndValues, "error", err)
30+
z.logger.Sugar().Errorw(msg, keysAndValues...)
31+
}
32+
33+
func (z *zapAdapter) WithValues(keysAndValues ...any) logr.LogSink {
34+
return &zapAdapter{
35+
logger: z.logger.Sugar().With(keysAndValues...).Desugar(),
36+
}
37+
}
38+
39+
func (z *zapAdapter) WithName(name string) logr.LogSink {
40+
return &zapAdapter{
41+
logger: z.logger.Named(name),
42+
}
43+
}
44+
45+
// mapLevel maps the levels used by opentelemetry-go to zap levels.
46+
//
47+
// See:
48+
//
49+
// https://github.com/open-telemetry/opentelemetry-go/blob/1297d5f0/internal/global/internal_logging.go#L30-L32
50+
func mapLevel(level int) zapcore.Level {
51+
switch {
52+
case level <= 1:
53+
return zapcore.WarnLevel
54+
case level <= 4:
55+
return zapcore.InfoLevel
56+
default:
57+
return zapcore.DebugLevel
58+
}
59+
}

telemetry/telemetry.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
1717
"go.opentelemetry.io/otel/trace"
1818

19+
"github.com/go-logr/logr"
1920
"github.com/replicate/go/logging"
2021
"github.com/replicate/go/version"
2122
)
@@ -34,6 +35,7 @@ func Start(ctx context.Context) (*Telemetry, error) {
3435
return nil, err
3536
}
3637

38+
otel.SetLogger(logr.New(&zapAdapter{logger: logger}))
3739
otel.SetErrorHandler(ErrorHandler{})
3840
otel.SetTracerProvider(tp)
3941
otel.SetTextMapPropagator(

0 commit comments

Comments
 (0)