tracer.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package opentelemetry
  2. import (
  3. "context"
  4. "go.opentelemetry.io/otel/baggage"
  5. "go.opentelemetry.io/otel/propagation"
  6. "go.opentelemetry.io/otel/trace"
  7. "google.golang.org/grpc/metadata"
  8. )
  9. type metadataSupplier struct {
  10. metadata *metadata.MD
  11. }
  12. // assert that metadataSupplier implements the TextMapCarrier interface
  13. var _ propagation.TextMapCarrier = &metadataSupplier{}
  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 the metadata into ctx.
  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) (baggage.Baggage, trace.SpanContext) {
  39. ctx = p.Extract(ctx, &metadataSupplier{
  40. metadata: metadata,
  41. })
  42. return baggage.FromContext(ctx), trace.SpanContextFromContext(ctx)
  43. }