@@ -18,6 +18,7 @@ import DequeModule
18
18
import Logging
19
19
import NIOCore
20
20
import NIOHPACK
21
+ import Tracing
21
22
22
23
@available ( macOS 10 . 15 , iOS 13 , tvOS 13 , watchOS 6 , * )
23
24
public struct GRPCAsyncServerHandler <
@@ -193,8 +194,13 @@ internal final class AsyncServerHandler<
193
194
@usableFromInline
194
195
internal var logger : Logger
195
196
197
+ /// Contextual baggage which can be used to start tracing spans,
198
+ // or carry additional contextual information through the handler.
196
199
@usableFromInline
197
- internal let traceIDExtractor : Server . Configuration . TraceIDExtractor ?
200
+ internal var baggage : Baggage
201
+
202
+ @usableFromInline
203
+ internal let tracer : Tracing . Tracer ? // FIXME: tri state "don't trace" / "global" / "configured"
198
204
199
205
/// A reference to the user info. This is shared with the interceptor pipeline and may be accessed
200
206
/// from the async call context. `UserInfo` is _not_ `Sendable` and must always be accessed from
@@ -270,7 +276,8 @@ internal final class AsyncServerHandler<
270
276
self . compressionEnabledOnRPC = context. encoding. isEnabled
271
277
self . compressResponsesIfPossible = true
272
278
self . logger = context. logger
273
- self . traceIDExtractor = context. traceIDExtractor
279
+ self . baggage = . topLevel // TODO: or carry from context?
280
+ self . tracer = context. tracer
274
281
275
282
self . userInfoRef = Ref ( UserInfo ( ) )
276
283
self . handlerStateMachine = . init( )
@@ -299,9 +306,17 @@ internal final class AsyncServerHandler<
299
306
internal func receiveMetadata( _ headers: HPACKHeaders ) {
300
307
switch self . interceptorStateMachine. interceptRequestMetadata ( ) {
301
308
case . intercept:
302
- if let extractor = self . traceIDExtractor, let id = extractor. extract ( from: headers) {
303
- self . logger [ metadataKey: extractor. loggerKey] = " \( id) "
304
- self . interceptors? . logger [ metadataKey: extractor. loggerKey] = " \( id) "
309
+ if let tracer = self . tracer {
310
+ tracer. extract ( headers, into: & baggage, using: HPACKHeadersExtractor ( ) )
311
+
312
+ if let metadata: Logger . Metadata = self . logger. metadataProvider? . metadata ( baggage) { // FIXME: function naming a bit ugly here
313
+ for (k, v) in metadata {
314
+ self . logger [ metadataKey: k] = v
315
+ self . interceptors? . logger [ metadataKey: k] = v
316
+ // self.logger[metadataKey: extractor.loggerKey] = "\(id)"
317
+ // self.interceptors?.logger[metadataKey: extractor.loggerKey] = "\(id)"
318
+ }
319
+ }
305
320
}
306
321
self . interceptors? . receive ( . metadata( headers) )
307
322
case . cancel:
@@ -323,7 +338,7 @@ internal final class AsyncServerHandler<
323
338
324
339
switch self . interceptorStateMachine. interceptRequestMessage ( ) {
325
340
case . intercept:
326
- self . interceptors? . receive ( . message( request) )
341
+ self . interceptors? . receive ( . message( request) ) // TODO: if we wrapped this in a withSpan, would that be correct?
327
342
case . cancel:
328
343
self . cancel ( error: nil )
329
344
case . drop:
0 commit comments