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  }