@@ -5,6 +5,7 @@ package exporterhelper // import "go.opentelemetry.io/collector/exporter/exporte
5
5
6
6
import (
7
7
"context"
8
+ "encoding/hex"
8
9
"encoding/json"
9
10
"errors"
10
11
@@ -46,55 +47,6 @@ func NewTracesQueueBatchSettings() QueueBatchSettings {
46
47
}
47
48
}
48
49
49
- type SerializableLink struct {
50
- TraceID [16 ]byte `json:"trace_id"`
51
- SpanID [8 ]byte `json:"span_id"`
52
- TraceFlags byte `json:"trace_flags"`
53
- TraceState trace.TraceState `json:"trace_state"`
54
- }
55
-
56
- func (sl * SerializableLink ) UnmarshalJSON (data []byte ) error {
57
- type Alias SerializableLink // Prevent recursion
58
- aux := & struct {
59
- TraceState string `json:"trace_state"`
60
- * Alias
61
- }{
62
- Alias : (* Alias )(sl ),
63
- }
64
- if err := json .Unmarshal (data , & aux ); err != nil {
65
- return err
66
- }
67
- if aux .TraceState != "" {
68
- ts , err := trace .ParseTraceState (aux .TraceState )
69
- if err != nil {
70
- return err
71
- }
72
- sl .TraceState = ts
73
- }
74
- return nil
75
- }
76
-
77
- func linkToSerializable (l trace.Link ) SerializableLink {
78
- return SerializableLink {
79
- TraceID : l .SpanContext .TraceID (),
80
- SpanID : l .SpanContext .SpanID (),
81
- TraceFlags : byte (l .SpanContext .TraceFlags ()),
82
- TraceState : l .SpanContext .TraceState (),
83
- }
84
- }
85
-
86
- func serializableToLink (sl SerializableLink ) trace.Link {
87
- sc := trace .NewSpanContext (trace.SpanContextConfig {
88
- TraceID : sl .TraceID ,
89
- SpanID : sl .SpanID ,
90
- TraceFlags : trace .TraceFlags (sl .TraceFlags ),
91
- TraceState : sl .TraceState ,
92
- })
93
- return trace.Link {
94
- SpanContext : sc ,
95
- }
96
- }
97
-
98
50
type tracesRequest struct {
99
51
td ptrace.Traces
100
52
links []trace.Link
@@ -112,22 +64,72 @@ func newTracesRequest(td ptrace.Traces, links []trace.Link) Request {
112
64
type tracesEncoding struct {}
113
65
114
66
type tracesWithSpanContexts struct {
115
- Traces []byte `json:"traces"`
116
- Links []SerializableLink `json:"links"`
67
+ Traces []byte `json:"traces"`
68
+ SpanContext []trace.SpanContext `json:"span_context"`
69
+ }
70
+
71
+ // Helper for JSON unmarshaling of SpanContextConfig
72
+
73
+ type spanContextConfigJSON struct {
74
+ TraceID string
75
+ SpanID string
76
+ TraceFlags string
77
+ TraceState string
78
+ Remote bool
79
+ }
80
+
81
+ func unmarshalSpanContextConfig (data []byte ) (trace.SpanContextConfig , error ) {
82
+ var aux spanContextConfigJSON
83
+ if err := json .Unmarshal (data , & aux ); err != nil {
84
+ return trace.SpanContextConfig {}, err
85
+ }
86
+ tid , err := trace .TraceIDFromHex (aux .TraceID )
87
+ if err != nil {
88
+ return trace.SpanContextConfig {}, err
89
+ }
90
+ sid , err := trace .SpanIDFromHex (aux .SpanID )
91
+ if err != nil {
92
+ return trace.SpanContextConfig {}, err
93
+ }
94
+ ts , err := trace .ParseTraceState (aux .TraceState )
95
+ if err != nil {
96
+ return trace.SpanContextConfig {}, err
97
+ }
98
+ tf , err := hex .DecodeString (aux .TraceFlags )
99
+ if err != nil {
100
+ return trace.SpanContextConfig {}, err
101
+ }
102
+ if len (tf ) != 1 {
103
+ return trace.SpanContextConfig {}, errors .New ("invalid trace flags" )
104
+ }
105
+ return trace.SpanContextConfig {
106
+ TraceID : tid ,
107
+ SpanID : sid ,
108
+ TraceFlags : trace .TraceFlags (tf [0 ]),
109
+ TraceState : ts ,
110
+ Remote : aux .Remote ,
111
+ }, nil
117
112
}
118
113
119
114
func (tracesEncoding ) Unmarshal (bytes []byte ) (Request , error ) {
120
- var twl tracesWithSpanContexts
115
+ var twl struct {
116
+ Traces []byte `json:"traces"`
117
+ SpanContext []json.RawMessage `json:"span_context"`
118
+ }
121
119
if err := json .Unmarshal (bytes , & twl ); err != nil {
122
120
return nil , err
123
121
}
124
122
traces , err := tracesUnmarshaler .UnmarshalTraces (twl .Traces )
125
123
if err != nil {
126
124
return nil , err
127
125
}
128
- links := make ([]trace.Link , len (twl .Links ))
129
- for i , sl := range twl .Links {
130
- links [i ] = serializableToLink (sl )
126
+ links := make ([]trace.Link , len (twl .SpanContext ))
127
+ for i , raw := range twl .SpanContext {
128
+ cfg , err := unmarshalSpanContextConfig (raw )
129
+ if err != nil {
130
+ return nil , err
131
+ }
132
+ links [i ] = trace.Link {SpanContext : trace .NewSpanContext (cfg )}
131
133
}
132
134
return newTracesRequest (traces , links ), nil
133
135
}
@@ -138,13 +140,13 @@ func (tracesEncoding) Marshal(req Request) ([]byte, error) {
138
140
if err != nil {
139
141
return nil , err
140
142
}
141
- serializableLinks := make ([]SerializableLink , len (tr .links ))
143
+ spanContexts := make ([]trace. SpanContext , len (tr .links ))
142
144
for i , l := range tr .links {
143
- serializableLinks [i ] = linkToSerializable ( l )
145
+ spanContexts [i ] = l . SpanContext
144
146
}
145
147
twl := tracesWithSpanContexts {
146
- Traces : tracesBytes ,
147
- Links : serializableLinks ,
148
+ Traces : tracesBytes ,
149
+ SpanContext : spanContexts ,
148
150
}
149
151
return json .Marshal (twl )
150
152
}
0 commit comments