...

Source file src/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go

Documentation: go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc

     1  // Copyright The OpenTelemetry Authors
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
     5  
     6  import (
     7  	"context"
     8  
     9  	"google.golang.org/grpc/metadata"
    10  
    11  	"go.opentelemetry.io/otel/baggage"
    12  	"go.opentelemetry.io/otel/propagation"
    13  	"go.opentelemetry.io/otel/trace"
    14  )
    15  
    16  type metadataSupplier struct {
    17  	metadata *metadata.MD
    18  }
    19  
    20  // assert that metadataSupplier implements the TextMapCarrier interface.
    21  var _ propagation.TextMapCarrier = &metadataSupplier{}
    22  
    23  func (s *metadataSupplier) Get(key string) string {
    24  	values := s.metadata.Get(key)
    25  	if len(values) == 0 {
    26  		return ""
    27  	}
    28  	return values[0]
    29  }
    30  
    31  func (s *metadataSupplier) Set(key string, value string) {
    32  	s.metadata.Set(key, value)
    33  }
    34  
    35  func (s *metadataSupplier) Keys() []string {
    36  	out := make([]string, 0, len(*s.metadata))
    37  	for key := range *s.metadata {
    38  		out = append(out, key)
    39  	}
    40  	return out
    41  }
    42  
    43  // Inject injects correlation context and span context into the gRPC
    44  // metadata object. This function is meant to be used on outgoing
    45  // requests.
    46  // Deprecated: Unnecessary public func.
    47  func Inject(ctx context.Context, md *metadata.MD, opts ...Option) {
    48  	c := newConfig(opts, "")
    49  	c.Propagators.Inject(ctx, &metadataSupplier{
    50  		metadata: md,
    51  	})
    52  }
    53  
    54  func inject(ctx context.Context, propagators propagation.TextMapPropagator) context.Context {
    55  	md, ok := metadata.FromOutgoingContext(ctx)
    56  	if !ok {
    57  		md = metadata.MD{}
    58  	}
    59  	propagators.Inject(ctx, &metadataSupplier{
    60  		metadata: &md,
    61  	})
    62  	return metadata.NewOutgoingContext(ctx, md)
    63  }
    64  
    65  // Extract returns the correlation context and span context that
    66  // another service encoded in the gRPC metadata object with Inject.
    67  // This function is meant to be used on incoming requests.
    68  // Deprecated: Unnecessary public func.
    69  func Extract(ctx context.Context, md *metadata.MD, opts ...Option) (baggage.Baggage, trace.SpanContext) {
    70  	c := newConfig(opts, "")
    71  	ctx = c.Propagators.Extract(ctx, &metadataSupplier{
    72  		metadata: md,
    73  	})
    74  
    75  	return baggage.FromContext(ctx), trace.SpanContextFromContext(ctx)
    76  }
    77  
    78  func extract(ctx context.Context, propagators propagation.TextMapPropagator) context.Context {
    79  	md, ok := metadata.FromIncomingContext(ctx)
    80  	if !ok {
    81  		md = metadata.MD{}
    82  	}
    83  
    84  	return propagators.Extract(ctx, &metadataSupplier{
    85  		metadata: &md,
    86  	})
    87  }
    88  

View as plain text