package opentelemetry import ( "context" "go.opentelemetry.io/otel/baggage" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" "google.golang.org/grpc/metadata" ) type metadataSupplier struct { metadata *metadata.MD } // assert that metadataSupplier implements the TextMapCarrier interface var _ propagation.TextMapCarrier = &metadataSupplier{} func (s *metadataSupplier) Get(key string) string { values := s.metadata.Get(key) if len(values) == 0 { return "" } return values[0] } func (s *metadataSupplier) Set(key, value string) { s.metadata.Set(key, value) } func (s *metadataSupplier) Keys() []string { out := make([]string, 0, len(*s.metadata)) for key := range *s.metadata { out = append(out, key) } return out } // Inject injects the metadata into ctx. func Inject(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) { p.Inject(ctx, &metadataSupplier{ metadata: metadata, }) } // Extract extracts the metadata from ctx. func Extract(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) (baggage.Baggage, trace.SpanContext) { ctx = p.Extract(ctx, &metadataSupplier{ metadata: metadata, }) return baggage.FromContext(ctx), trace.SpanContextFromContext(ctx) }