Skip to content

Commit 223664c

Browse files
authored
Merge pull request #155 from openzipkin-contrib/fixes_extraction_for_text_map
fix(propagation): fixes propagation for opentracing.TextMap.
2 parents 2869220 + d462f4a commit 223664c

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

Diff for: propagation.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package zipkintracer
1616

1717
import (
1818
"net/http"
19+
"strings"
1920

2021
opentracing "github.com/opentracing/opentracing-go"
2122
"github.com/openzipkin/zipkin-go/model"
@@ -108,7 +109,10 @@ func (p *textMapPropagator) Extract(
108109
if carrier, ok := opaqueCarrier.(opentracing.TextMapReader); ok {
109110
m := make(b3.Map)
110111
carrier.ForeachKey(func(key string, val string) error {
111-
m[key] = val
112+
// no matter the format of the B3 headers, they will be retrieved
113+
// using the standard lowercase format e.g. x-b3-traceid. See
114+
// https://github.com/openzipkin/zipkin-go/blob/master/propagation/b3/shared.go
115+
m[strings.ToLower(key)] = val
112116
return nil
113117
})
114118
sc, err := m.Extract()

Diff for: propagation_test.go

+42-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package zipkintracer_test
1616

1717
import (
18+
"net/http"
1819
stdHTTP "net/http"
1920
"reflect"
2021
"testing"
@@ -249,6 +250,47 @@ func TestHTTPExtractInvalidParentIDError(t *testing.T) {
249250

250251
}
251252

253+
// httpHeadersCarrier implements opentracing.TextMapReader
254+
type httpHeadersCarrier http.Header
255+
256+
func (c httpHeadersCarrier) Set(key, val string) {
257+
h := http.Header(c)
258+
h.Set(key, val)
259+
}
260+
261+
func (c httpHeadersCarrier) ForeachKey(handler func(key, val string) error) error {
262+
for k, vals := range c {
263+
for _, v := range vals {
264+
if err := handler(k, v); err != nil {
265+
return err
266+
}
267+
}
268+
}
269+
return nil
270+
}
271+
272+
func TestTextMapReaderIsCaseInsensitive(t *testing.T) {
273+
tracer := zipkintracer.Wrap(nil)
274+
c := stdHTTP.Header{}
275+
c.Set("X-B3-Traceid", "1")
276+
c.Set("X-B3-Spanid", "2")
277+
278+
sc, err := tracer.Extract(opentracing.HTTPHeaders, httpHeadersCarrier(c))
279+
if err != nil {
280+
t.Errorf("unexpected error: %v", err)
281+
}
282+
283+
zsc, _ := sc.(zipkintracer.SpanContext)
284+
if want, have := "0000000000000001", zsc.TraceID.String(); want != have {
285+
t.Errorf("Extract Error want %+v, have %+v", want, have)
286+
}
287+
288+
if want, have := "0000000000000002", zsc.ID.String(); want != have {
289+
t.Errorf("Extract Error want %+v, have %+v", want, have)
290+
}
291+
292+
}
293+
252294
func TestHTTPInjectEmptyContextError(t *testing.T) {
253295
tracer := zipkintracer.Wrap(nil)
254296
err := tracer.Inject(zipkintracer.SpanContext{}, opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier{})
@@ -368,7 +410,6 @@ func TestTextMapCarrier(t *testing.T) {
368410
})
369411

370412
otSC, err := tracer.Extract(opentracing.TextMap, otMap)
371-
372413
if err != nil {
373414
t.Errorf("[%d] Unexpected Extract failure %v", injectOption, err)
374415
}

0 commit comments

Comments
 (0)