tracer.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. func Inject(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) {
  32. p.Inject(ctx, &metadataSupplier{
  33. metadata: metadata,
  34. })
  35. }
  36. func Extract(ctx context.Context, p propagation.TextMapPropagator, metadata *metadata.MD) (baggage.Baggage, trace.SpanContext) {
  37. ctx = p.Extract(ctx, &metadataSupplier{
  38. metadata: metadata,
  39. })
  40. return baggage.FromContext(ctx), trace.SpanContextFromContext(ctx)
  41. }