@@ -47,11 +47,17 @@ type HTTPFormat struct{}
4747
4848// SpanContextFromRequest extracts a span context from incoming requests.
4949func (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 == "" {
5258 return trace.SpanContext {}, false
5359 }
54- sections := strings .Split (h , "-" )
60+ sections := strings .Split (tp , "-" )
5561 if len (sections ) < 4 {
5662 return trace.SpanContext {}, false
5763 }
@@ -101,7 +107,7 @@ func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanCon
101107 return trace.SpanContext {}, false
102108 }
103109
104- sc .Tracestate = tracestateFromRequest ( req )
110+ sc .Tracestate = tracestateFromHeader ( ts )
105111 return sc , true
106112}
107113
@@ -128,14 +134,13 @@ func getRequestHeader(req *http.Request, name string, commaSeparated bool) (hdr
128134// are resolved.
129135// https://github.com/w3c/distributed-tracing/issues/172
130136// 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 == "" {
134139 return nil
135140 }
136141
137142 var entries []tracestate.Entry
138- pairs := strings .Split (h , "," )
143+ pairs := strings .Split (ts , "," )
139144 hdrLenWithoutOWS := len (pairs ) - 1 // Number of commas
140145 for _ , pair := range pairs {
141146 matches := trimOWSRegExp .FindStringSubmatch (pair )
@@ -153,15 +158,15 @@ func tracestateFromRequest(req *http.Request) *tracestate.Tracestate {
153158 }
154159 entries = append (entries , tracestate.Entry {Key : kv [0 ], Value : kv [1 ]})
155160 }
156- ts , err := tracestate .New (nil , entries ... )
161+ tsParsed , err := tracestate .New (nil , entries ... )
157162 if err != nil {
158163 return nil
159164 }
160165
161- return ts
166+ return tsParsed
162167}
163168
164- func tracestateToRequest (sc trace.SpanContext , req * http. Request ) {
169+ func tracestateToHeader (sc trace.SpanContext ) string {
165170 var pairs = make ([]string , 0 , len (sc .Tracestate .Entries ()))
166171 if sc .Tracestate != nil {
167172 for _ , entry := range sc .Tracestate .Entries () {
@@ -170,18 +175,28 @@ func tracestateToRequest(sc trace.SpanContext, req *http.Request) {
170175 h := strings .Join (pairs , "," )
171176
172177 if h != "" && len (h ) <= maxTracestateLen {
173- req . Header . Set ( tracestateHeader , h )
178+ return h
174179 }
175180 }
181+ return ""
176182}
177183
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" ,
181187 []byte {supportedVersion },
182188 sc .TraceID [:],
183189 sc .SpanID [:],
184190 []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+ }
187202}
0 commit comments