10
10
// way:
11
11
//
12
12
// - Message is set as the Body using a [log.StringValue].
13
- // - TODO: Level
13
+ // - Level is transformed and set as the Severity. The SeverityText is not
14
+ // set.
14
15
// - KeyAndValues are transformed and set as Attributes.
15
16
// - The [context.Context] value in KeyAndValues is propagated to OpenTelemetry
16
17
// log record. All non-nested [context.Context] values are ignored and not
17
18
// added as attributes. If there are multiple [context.Context] the last one
18
19
// is used.
19
20
//
21
+ // The Level is transformed by using the [WithLevelSeverity] option. If this is
22
+ // not provided it would default to a function that adds an offset to the logr
23
+ // such that [logr.Info] is transformed to [log.SeverityInfo]. For example:
24
+ //
25
+ // - [logr.Info] is transformed to [log.SeverityInfo].
26
+ // - [logr.V(0)] is transformed to [log.SeverityInfo].
27
+ // - [logr.V(1)] is transformed to [log.SeverityInfo2].
28
+ // - [logr.V(2)] is transformed to [log.SeverityInfo3].
29
+ // - ...
30
+ // - [logr.V(15)] is transformed to [log.SeverityFatal4].
31
+ // - [logr.Error] is transformed to [log.SeverityError].
32
+ //
20
33
// KeysAndValues values are transformed based on their type. The following types are
21
34
// supported:
22
35
//
@@ -56,6 +69,8 @@ type config struct {
56
69
provider log.LoggerProvider
57
70
version string
58
71
schemaURL string
72
+
73
+ levelSeverity func (int ) log.Severity
59
74
}
60
75
61
76
func newConfig (options []Option ) config {
@@ -68,6 +83,13 @@ func newConfig(options []Option) config {
68
83
c .provider = global .GetLoggerProvider ()
69
84
}
70
85
86
+ if c .levelSeverity == nil {
87
+ c .levelSeverity = func (level int ) log.Severity {
88
+ const sevOffset = int (log .SeverityInfo )
89
+ return log .Severity (level + sevOffset )
90
+ }
91
+ }
92
+
71
93
return c
72
94
}
73
95
@@ -112,6 +134,20 @@ func WithLoggerProvider(provider log.LoggerProvider) Option {
112
134
})
113
135
}
114
136
137
+ // WithLevelSeverity returns an [Option] that configures the function used to
138
+ // convert logr levels to OpenTelemetry log severities.
139
+ //
140
+ // By default if this Option is not provided, the LogSink will use a default
141
+ // conversion function which adds an offset to the logr level to get the
142
+ // OpenTelemetry severity. The offset is such that logr.Info("message")
143
+ // converts to OpenTelemetry [log.SeverityInfo].
144
+ func WithLevelSeverity (f func (int ) log.Severity ) Option {
145
+ return optFunc (func (c config ) config {
146
+ c .levelSeverity = f
147
+ return c
148
+ })
149
+ }
150
+
115
151
// NewLogSink returns a new [LogSink] to be used as a [logr.LogSink].
116
152
//
117
153
// If [WithLoggerProvider] is not provided, the returned [LogSink] will use the
@@ -128,10 +164,11 @@ func NewLogSink(name string, options ...Option) *LogSink {
128
164
}
129
165
130
166
return & LogSink {
131
- name : name ,
132
- provider : c .provider ,
133
- logger : c .provider .Logger (name , opts ... ),
134
- opts : opts ,
167
+ name : name ,
168
+ provider : c .provider ,
169
+ logger : c .provider .Logger (name , opts ... ),
170
+ levelSeverity : c .levelSeverity ,
171
+ opts : opts ,
135
172
}
136
173
}
137
174
@@ -141,12 +178,13 @@ type LogSink struct {
141
178
// Ensure forward compatibility by explicitly making this not comparable.
142
179
noCmp [0 ]func () //nolint: unused // This is indeed used.
143
180
144
- name string
145
- provider log.LoggerProvider
146
- logger log.Logger
147
- opts []log.LoggerOption
148
- attr []log.KeyValue
149
- ctx context.Context
181
+ name string
182
+ provider log.LoggerProvider
183
+ logger log.Logger
184
+ levelSeverity func (int ) log.Severity
185
+ opts []log.LoggerOption
186
+ attr []log.KeyValue
187
+ ctx context.Context
150
188
}
151
189
152
190
// Compile-time check *Handler implements logr.LogSink.
@@ -156,8 +194,10 @@ var _ logr.LogSink = (*LogSink)(nil)
156
194
// For example, commandline flags might be used to set the logging
157
195
// verbosity and disable some info logs.
158
196
func (l * LogSink ) Enabled (level int ) bool {
159
- // TODO
160
- return true
197
+ var param log.EnabledParameters
198
+ param .SetSeverity (l .levelSeverity (level ))
199
+ ctx := context .Background ()
200
+ return l .logger .Enabled (ctx , param )
161
201
}
162
202
163
203
// Error logs an error, with the given message and key/value pairs.
@@ -169,7 +209,7 @@ func (l *LogSink) Error(err error, msg string, keysAndValues ...any) {
169
209
func (l * LogSink ) Info (level int , msg string , keysAndValues ... any ) {
170
210
var record log.Record
171
211
record .SetBody (log .StringValue (msg ))
172
- record .SetSeverity (log . SeverityInfo ) // TODO: level
212
+ record .SetSeverity (l . levelSeverity ( level ))
173
213
174
214
record .AddAttributes (l .attr ... )
175
215
0 commit comments