package trace import ( "context" "go.opentelemetry.io/otel/baggage" "go.opentelemetry.io/otel/propagation" sdktrace "go.opentelemetry.io/otel/trace" "google.golang.org/grpc/metadata" ) // assert that metadataSupplier implements the TextMapCarrier interface var _ propagation.TextMapCarrier = (*metadataSupplier)(nil) type metadataSupplier struct { metadata *metadata.MD } 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 cross-cutting concerns from the ctx into the metadata. 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, sdktrace.SpanContext) { ctx = p.Extract(ctx, &metadataSupplier{ metadata: metadata, }) return baggage.FromContext(ctx), sdktrace.SpanContextFromContext(ctx) }