tracer.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package trace
  2. import (
  3. "context"
  4. "go.opentelemetry.io/otel/baggage"
  5. "go.opentelemetry.io/otel/propagation"
  6. sdktrace "go.opentelemetry.io/otel/trace"
  7. "google.golang.org/grpc/metadata"
  8. )
  9. // assert that metadataSupplier implements the TextMapCarrier interface
  10. var _ propagation.TextMapCarrier = (*metadataSupplier)(nil)
  11. type metadataSupplier struct {
  12. metadata *metadata.MD
  13. }
  14. func (s *metadataSupplier) Get(key string) string {
  15. values := s.metadata.Get(key)
  16. if len(values) == 0 {
  17. return ""
  18. }
  19. return values[0]
  20. }
  21. func (s *metadataSupplier) Set(key, value string) {
  22. s.metadata.Set(key, value)
  23. }
  24. func (s *metadataSupplier) Keys() []string {
  25. out := make([]string, 0, len(*s.metadata))
  26. for key := range *s.metadata {
  27. out = append(out, key)
  28. }
  29. return out
  30. }
  31. // Inject injects cross-cutting concerns from the ctx into the metadata.
  32. func Inject(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) {
  33. p.Inject(ctx, &metadataSupplier{
  34. metadata: metadata,
  35. })
  36. }
  37. // Extract extracts the metadata from ctx.
  38. func Extract(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) (
  39. baggage.Baggage, sdktrace.SpanContext) {
  40. ctx = p.Extract(ctx, &metadataSupplier{
  41. metadata: metadata,
  42. })
  43. return baggage.FromContext(ctx), sdktrace.SpanContextFromContext(ctx)
  44. }