@@ -47,11 +47,17 @@ type HTTPFormat struct{}
47
47
48
48
// SpanContextFromRequest extracts a span context from incoming requests.
49
49
func (f * HTTPFormat ) SpanContextFromRequest (req * http.Request ) (sc trace.SpanContext , ok bool ) {
50
- h , ok := getRequestHeader (req , traceparentHeader , false )
51
- if ! ok {
50
+ tp , _ := getRequestHeader (req , traceparentHeader , false )
51
+ ts , _ := getRequestHeader (req , tracestateHeader , true )
52
+ return f .SpanContextFromHeaders (tp , ts )
53
+ }
54
+
55
+ // SpanContextFromHeaders extracts a span context from provided header values.
56
+ func (f * HTTPFormat ) SpanContextFromHeaders (tp string , ts string ) (sc trace.SpanContext , ok bool ) {
57
+ if tp == "" {
52
58
return trace.SpanContext {}, false
53
59
}
54
- sections := strings .Split (h , "-" )
60
+ sections := strings .Split (tp , "-" )
55
61
if len (sections ) < 4 {
56
62
return trace.SpanContext {}, false
57
63
}
@@ -101,7 +107,7 @@ func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanCon
101
107
return trace.SpanContext {}, false
102
108
}
103
109
104
- sc .Tracestate = tracestateFromRequest ( req )
110
+ sc .Tracestate = tracestateFromHeader ( ts )
105
111
return sc , true
106
112
}
107
113
@@ -128,14 +134,13 @@ func getRequestHeader(req *http.Request, name string, commaSeparated bool) (hdr
128
134
// are resolved.
129
135
// https://github.com/w3c/distributed-tracing/issues/172
130
136
// https://github.com/w3c/distributed-tracing/issues/175
131
- func tracestateFromRequest (req * http.Request ) * tracestate.Tracestate {
132
- h , _ := getRequestHeader (req , tracestateHeader , true )
133
- if h == "" {
137
+ func tracestateFromHeader (ts string ) * tracestate.Tracestate {
138
+ if ts == "" {
134
139
return nil
135
140
}
136
141
137
142
var entries []tracestate.Entry
138
- pairs := strings .Split (h , "," )
143
+ pairs := strings .Split (ts , "," )
139
144
hdrLenWithoutOWS := len (pairs ) - 1 // Number of commas
140
145
for _ , pair := range pairs {
141
146
matches := trimOWSRegExp .FindStringSubmatch (pair )
@@ -153,15 +158,15 @@ func tracestateFromRequest(req *http.Request) *tracestate.Tracestate {
153
158
}
154
159
entries = append (entries , tracestate.Entry {Key : kv [0 ], Value : kv [1 ]})
155
160
}
156
- ts , err := tracestate .New (nil , entries ... )
161
+ tsParsed , err := tracestate .New (nil , entries ... )
157
162
if err != nil {
158
163
return nil
159
164
}
160
165
161
- return ts
166
+ return tsParsed
162
167
}
163
168
164
- func tracestateToRequest (sc trace.SpanContext , req * http. Request ) {
169
+ func tracestateToHeader (sc trace.SpanContext ) string {
165
170
var pairs = make ([]string , 0 , len (sc .Tracestate .Entries ()))
166
171
if sc .Tracestate != nil {
167
172
for _ , entry := range sc .Tracestate .Entries () {
@@ -170,18 +175,28 @@ func tracestateToRequest(sc trace.SpanContext, req *http.Request) {
170
175
h := strings .Join (pairs , "," )
171
176
172
177
if h != "" && len (h ) <= maxTracestateLen {
173
- req . Header . Set ( tracestateHeader , h )
178
+ return h
174
179
}
175
180
}
181
+ return ""
176
182
}
177
183
178
- // SpanContextToRequest modifies the given request to include traceparent and tracestate headers.
179
- func (f * HTTPFormat ) SpanContextToRequest (sc trace.SpanContext , req * http. Request ) {
180
- h : = fmt .Sprintf ("%x-%x-%x-%x" ,
184
+ // SpanContextToHeaders serialize the SpanContext to traceparent and tracestate headers.
185
+ func (f * HTTPFormat ) SpanContextToHeaders (sc trace.SpanContext ) ( tp string , ts string ) {
186
+ tp = fmt .Sprintf ("%x-%x-%x-%x" ,
181
187
[]byte {supportedVersion },
182
188
sc .TraceID [:],
183
189
sc .SpanID [:],
184
190
[]byte {byte (sc .TraceOptions )})
185
- req .Header .Set (traceparentHeader , h )
186
- tracestateToRequest (sc , req )
191
+ ts = tracestateToHeader (sc )
192
+ return
193
+ }
194
+
195
+ // SpanContextToRequest modifies the given request to include traceparent and tracestate headers.
196
+ func (f * HTTPFormat ) SpanContextToRequest (sc trace.SpanContext , req * http.Request ) {
197
+ tp , ts := f .SpanContextToHeaders (sc )
198
+ req .Header .Set (traceparentHeader , tp )
199
+ if ts != "" {
200
+ req .Header .Set (tracestateHeader , ts )
201
+ }
187
202
}
0 commit comments