@@ -5,6 +5,7 @@ package request // import "go.opentelemetry.io/collector/pdata/xpdata/request"
5
5
6
6
import (
7
7
"context"
8
+ "net"
8
9
9
10
"go.opentelemetry.io/otel/trace"
10
11
@@ -19,20 +20,21 @@ var readOnlyState = pdataint.StateReadOnly
19
20
20
21
// encodeContext encodes the context into a map of strings.
21
22
func encodeContext (ctx context.Context ) internal.RequestContext {
22
- return internal.RequestContext {
23
- SpanContext : encodeSpanContext (ctx ),
24
- ClientMetadata : encodeClientMetadata (ctx ),
25
- }
23
+ rc := internal.RequestContext {}
24
+ encodeSpanContext (ctx , & rc )
25
+ encodeClientMetadata (ctx , & rc )
26
+ encodeClientAddress (ctx , & rc )
27
+ return rc
26
28
}
27
29
28
- func encodeSpanContext (ctx context.Context ) * internal.SpanContext {
30
+ func encodeSpanContext (ctx context.Context , rc * internal.RequestContext ) {
29
31
spanCtx := trace .SpanContextFromContext (ctx )
30
32
if ! spanCtx .IsValid () {
31
- return nil
33
+ return
32
34
}
33
35
traceID := spanCtx .TraceID ()
34
36
spanID := spanCtx .SpanID ()
35
- return & internal.SpanContext {
37
+ rc . SpanContext = & internal.SpanContext {
36
38
TraceId : traceID [:],
37
39
SpanId : spanID [:],
38
40
TraceFlags : uint32 (spanCtx .TraceFlags ()),
@@ -41,7 +43,7 @@ func encodeSpanContext(ctx context.Context) *internal.SpanContext {
41
43
}
42
44
}
43
45
44
- func encodeClientMetadata (ctx context.Context ) []protocommon. KeyValue {
46
+ func encodeClientMetadata (ctx context.Context , rc * internal. RequestContext ) {
45
47
clientMetadata := client .FromContext (ctx ).Metadata
46
48
metadataMap , metadataFound := pcommon.Map {}, false
47
49
for k := range clientMetadata .Keys () {
@@ -54,9 +56,35 @@ func encodeClientMetadata(ctx context.Context) []protocommon.KeyValue {
54
56
}
55
57
}
56
58
if metadataFound {
57
- return * pdataint .GetOrigMap (pdataint .Map (metadataMap ))
59
+ rc .ClientMetadata = * pdataint .GetOrigMap (pdataint .Map (metadataMap ))
60
+ }
61
+ }
62
+
63
+ func encodeClientAddress (ctx context.Context , rc * internal.RequestContext ) {
64
+ switch a := client .FromContext (ctx ).Addr .(type ) {
65
+ case * net.IPAddr :
66
+ rc .ClientAddress = & internal.RequestContext_Ip {Ip : & internal.IPAddr {
67
+ Ip : a .IP ,
68
+ Zone : a .Zone ,
69
+ }}
70
+ case * net.TCPAddr :
71
+ rc .ClientAddress = & internal.RequestContext_Tcp {Tcp : & internal.TCPAddr {
72
+ Ip : a .IP ,
73
+ Port : int32 (a .Port ), //nolint:gosec // G115
74
+ Zone : a .Zone ,
75
+ }}
76
+ case * net.UDPAddr :
77
+ rc .ClientAddress = & internal.RequestContext_Udp {Udp : & internal.UDPAddr {
78
+ Ip : a .IP ,
79
+ Port : int32 (a .Port ), //nolint:gosec // G115
80
+ Zone : a .Zone ,
81
+ }}
82
+ case * net.UnixAddr :
83
+ rc .ClientAddress = & internal.RequestContext_Unix {Unix : & internal.UnixAddr {
84
+ Name : a .Name ,
85
+ Net : a .Net ,
86
+ }}
58
87
}
59
- return nil
60
88
}
61
89
62
90
// decodeContext decodes the context from the bytes map.
@@ -65,7 +93,15 @@ func decodeContext(ctx context.Context, rc *internal.RequestContext) context.Con
65
93
return ctx
66
94
}
67
95
ctx = decodeSpanContext (ctx , rc .SpanContext )
68
- return decodeClientMetadata (ctx , rc .ClientMetadata )
96
+ metadataMap := decodeClientMetadata (rc .ClientMetadata )
97
+ clientAddress := decodeClientAddress (rc )
98
+ if len (metadataMap ) > 0 || clientAddress != nil {
99
+ ctx = client .NewContext (ctx , client.Info {
100
+ Metadata : client .NewMetadata (metadataMap ),
101
+ Addr : clientAddress ,
102
+ })
103
+ }
104
+ return ctx
69
105
}
70
106
71
107
func decodeSpanContext (ctx context.Context , sc * internal.SpanContext ) context.Context {
@@ -86,9 +122,9 @@ func decodeSpanContext(ctx context.Context, sc *internal.SpanContext) context.Co
86
122
}))
87
123
}
88
124
89
- func decodeClientMetadata (ctx context. Context , clientMetadata []protocommon.KeyValue ) context. Context {
125
+ func decodeClientMetadata (clientMetadata []protocommon.KeyValue ) map [ string ][] string {
90
126
if len (clientMetadata ) == 0 {
91
- return ctx
127
+ return nil
92
128
}
93
129
metadataMap := make (map [string ][]string , len (clientMetadata ))
94
130
for k , vals := range pcommon .Map (pdataint .NewMap (& clientMetadata , & readOnlyState )).All () {
@@ -97,5 +133,33 @@ func decodeClientMetadata(ctx context.Context, clientMetadata []protocommon.KeyV
97
133
metadataMap [k ][i ] = v .Str ()
98
134
}
99
135
}
100
- return client .NewContext (ctx , client.Info {Metadata : client .NewMetadata (metadataMap )})
136
+ return metadataMap
137
+ }
138
+
139
+ func decodeClientAddress (rc * internal.RequestContext ) net.Addr {
140
+ switch a := rc .ClientAddress .(type ) {
141
+ case * internal.RequestContext_Ip :
142
+ return & net.IPAddr {
143
+ IP : a .Ip .Ip ,
144
+ Zone : a .Ip .Zone ,
145
+ }
146
+ case * internal.RequestContext_Tcp :
147
+ return & net.TCPAddr {
148
+ IP : a .Tcp .Ip ,
149
+ Port : int (a .Tcp .Port ),
150
+ Zone : a .Tcp .Zone ,
151
+ }
152
+ case * internal.RequestContext_Udp :
153
+ return & net.UDPAddr {
154
+ IP : a .Udp .Ip ,
155
+ Port : int (a .Udp .Port ),
156
+ Zone : a .Udp .Zone ,
157
+ }
158
+ case * internal.RequestContext_Unix :
159
+ return & net.UnixAddr {
160
+ Name : a .Unix .Name ,
161
+ Net : a .Unix .Net ,
162
+ }
163
+ }
164
+ return nil
101
165
}
0 commit comments