You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.3 KiB
56 lines
1.3 KiB
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) |
|
}
|
|
|