...
1
2
3
4 package otelgrpc
5
6 import (
7 "context"
8
9 "google.golang.org/grpc/metadata"
10
11 "go.opentelemetry.io/otel/baggage"
12 "go.opentelemetry.io/otel/propagation"
13 "go.opentelemetry.io/otel/trace"
14 )
15
16 type metadataSupplier struct {
17 metadata *metadata.MD
18 }
19
20
21 var _ propagation.TextMapCarrier = &metadataSupplier{}
22
23 func (s *metadataSupplier) Get(key string) string {
24 values := s.metadata.Get(key)
25 if len(values) == 0 {
26 return ""
27 }
28 return values[0]
29 }
30
31 func (s *metadataSupplier) Set(key string, value string) {
32 s.metadata.Set(key, value)
33 }
34
35 func (s *metadataSupplier) Keys() []string {
36 out := make([]string, 0, len(*s.metadata))
37 for key := range *s.metadata {
38 out = append(out, key)
39 }
40 return out
41 }
42
43
44
45
46
47 func Inject(ctx context.Context, md *metadata.MD, opts ...Option) {
48 c := newConfig(opts, "")
49 c.Propagators.Inject(ctx, &metadataSupplier{
50 metadata: md,
51 })
52 }
53
54 func inject(ctx context.Context, propagators propagation.TextMapPropagator) context.Context {
55 md, ok := metadata.FromOutgoingContext(ctx)
56 if !ok {
57 md = metadata.MD{}
58 }
59 propagators.Inject(ctx, &metadataSupplier{
60 metadata: &md,
61 })
62 return metadata.NewOutgoingContext(ctx, md)
63 }
64
65
66
67
68
69 func Extract(ctx context.Context, md *metadata.MD, opts ...Option) (baggage.Baggage, trace.SpanContext) {
70 c := newConfig(opts, "")
71 ctx = c.Propagators.Extract(ctx, &metadataSupplier{
72 metadata: md,
73 })
74
75 return baggage.FromContext(ctx), trace.SpanContextFromContext(ctx)
76 }
77
78 func extract(ctx context.Context, propagators propagation.TextMapPropagator) context.Context {
79 md, ok := metadata.FromIncomingContext(ctx)
80 if !ok {
81 md = metadata.MD{}
82 }
83
84 return propagators.Extract(ctx, &metadataSupplier{
85 metadata: &md,
86 })
87 }
88
View as plain text