github.com/lingyao2333/mo-zero@v1.4.1/core/trace/tracer.go (about) 1 package trace 2 3 import ( 4 "context" 5 6 "go.opentelemetry.io/otel/baggage" 7 "go.opentelemetry.io/otel/propagation" 8 sdktrace "go.opentelemetry.io/otel/trace" 9 "google.golang.org/grpc/metadata" 10 ) 11 12 // assert that metadataSupplier implements the TextMapCarrier interface 13 var _ propagation.TextMapCarrier = (*metadataSupplier)(nil) 14 15 type metadataSupplier struct { 16 metadata *metadata.MD 17 } 18 19 func (s *metadataSupplier) Get(key string) string { 20 values := s.metadata.Get(key) 21 if len(values) == 0 { 22 return "" 23 } 24 25 return values[0] 26 } 27 28 func (s *metadataSupplier) Set(key, value string) { 29 s.metadata.Set(key, value) 30 } 31 32 func (s *metadataSupplier) Keys() []string { 33 out := make([]string, 0, len(*s.metadata)) 34 for key := range *s.metadata { 35 out = append(out, key) 36 } 37 38 return out 39 } 40 41 // Inject injects cross-cutting concerns from the ctx into the metadata. 42 func Inject(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) { 43 p.Inject(ctx, &metadataSupplier{ 44 metadata: metadata, 45 }) 46 } 47 48 // Extract extracts the metadata from ctx. 49 func Extract(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) ( 50 baggage.Baggage, sdktrace.SpanContext) { 51 ctx = p.Extract(ctx, &metadataSupplier{ 52 metadata: metadata, 53 }) 54 55 return baggage.FromContext(ctx), sdktrace.SpanContextFromContext(ctx) 56 }