Skip to content

Commit

Permalink
Implemented logic for Opentracing baggage propagation (#1880)
Browse files Browse the repository at this point in the history
* Implemented logic for opentracing baggage propagation

* Linting

* Don't fail on bad baggage

* Update PR to construct a multi error

* Update propagators/ot/ot_propagator.go

Co-authored-by: Chester Cheung <cheung.zhy.csu@gmail.com>

Co-authored-by: Chester Cheung <cheung.zhy.csu@gmail.com>
Co-authored-by: Anthony Mirabella <a9@aneurysm9.com>
  • Loading branch information
3 people committed Mar 9, 2022
1 parent d1b7211 commit fcd5fb0
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 20 deletions.
1 change: 1 addition & 0 deletions propagators/ot/go.mod
Expand Up @@ -7,4 +7,5 @@ require (
github.com/stretchr/testify v1.7.0
go.opentelemetry.io/otel v1.4.1
go.opentelemetry.io/otel/trace v1.4.1
go.uber.org/multierr v1.8.0
)
11 changes: 9 additions & 2 deletions propagators/ot/go.sum
@@ -1,5 +1,6 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
Expand All @@ -9,15 +10,21 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
go.opentelemetry.io/otel v1.4.1 h1:QbINgGDDcoQUoMJa2mMaWno49lja9sHwp6aoa2n3a4g=
go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4=
go.opentelemetry.io/otel/trace v1.4.1 h1:O+16qcdTrT7zxv2J6GejTPFinSwA++cYerC5iSiF8EQ=
go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
75 changes: 67 additions & 8 deletions propagators/ot/ot_data_test.go
Expand Up @@ -15,6 +15,8 @@
package ot_test

import (
"strings"

"go.opentelemetry.io/otel/trace"
)

Expand All @@ -38,11 +40,13 @@ var (
traceID32 = trace.TraceID{0xa1, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36}
spanID = trace.SpanID{0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7}
emptyBaggage = map[string]string{}
// TODO: once baggage extraction is supported, re-enable this
// baggageSet = attribute.NewSet(
// attribute.String(baggageKey, baggageValue),
// attribute.String(baggageKey2, baggageValue2),
// )
baggageSet = map[string]string{
baggageKey: baggageValue,
}
baggageSet2 = map[string]string{
baggageKey: baggageValue,
baggageKey2: baggageValue2,
}
)

type extractTest struct {
Expand Down Expand Up @@ -85,9 +89,22 @@ var extractHeaders = []extractTest{
SpanID: spanID,
TraceFlags: trace.FlagsSampled,
},
emptyBaggage,
// TODO: once baggage extraction is supported, re-enable this
// &baggageSet,
baggageSet,
},
{
"baggage multiple values",
map[string]string{
traceIDHeader: traceID32Str,
spanIDHeader: spanIDStr,
sampledHeader: "0",
baggageHeader: baggageValue,
baggageHeader2: baggageValue2,
},
trace.SpanContextConfig{
TraceID: traceID32,
SpanID: spanID,
},
baggageSet2,
},
{
"left padding 64 bit trace ID",
Expand Down Expand Up @@ -168,6 +185,48 @@ var invalidExtractHeaders = []extractTest{
sampledHeader: "wired",
},
},
{
name: "invalid baggage key",
headers: map[string]string{
traceIDHeader: traceID32Str,
spanIDHeader: spanIDStr,
sampledHeader: "1",
"ot-baggage-d–76": "test",
},
expected: trace.SpanContextConfig{
TraceID: traceID32,
SpanID: spanID,
TraceFlags: trace.FlagsSampled,
},
},
{
name: "invalid baggage value",
headers: map[string]string{
traceIDHeader: traceID32Str,
spanIDHeader: spanIDStr,
sampledHeader: "1",
baggageHeader: "øtel",
},
expected: trace.SpanContextConfig{
TraceID: traceID32,
SpanID: spanID,
TraceFlags: trace.FlagsSampled,
},
},
{
name: "invalid baggage result (too large)",
headers: map[string]string{
traceIDHeader: traceID32Str,
spanIDHeader: spanIDStr,
sampledHeader: "1",
baggageHeader: strings.Repeat("s", 8188),
},
expected: trace.SpanContextConfig{
TraceID: traceID32,
SpanID: spanID,
TraceFlags: trace.FlagsSampled,
},
},
{
name: "missing headers",
headers: map[string]string{},
Expand Down
47 changes: 37 additions & 10 deletions propagators/ot/ot_propagator.go
Expand Up @@ -20,17 +20,19 @@ import (
"fmt"
"strings"

"go.opentelemetry.io/otel/baggage"
"go.uber.org/multierr"

"go.opentelemetry.io/otel/baggage"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
)

const (
// Default OT Header names.
traceIDHeader = "ot-tracer-traceid"
spanIDHeader = "ot-tracer-spanid"
sampledHeader = "ot-tracer-sampled"
traceIDHeader = "ot-tracer-traceid"
spanIDHeader = "ot-tracer-spanid"
sampledHeader = "ot-tracer-sampled"
baggageHeaderPrefix = "ot-baggage-"

otTraceIDPadding = "0000000000000000"

Expand Down Expand Up @@ -72,7 +74,7 @@ func (o OT) Inject(ctx context.Context, carrier propagation.TextMapCarrier) {
}

for _, m := range baggage.FromContext(ctx).Members() {
carrier.Set(fmt.Sprintf("ot-baggage-%s", m.Key()), m.Value())
carrier.Set(fmt.Sprintf("%s%s", baggageHeaderPrefix, m.Key()), m.Value())
}

}
Expand All @@ -93,18 +95,43 @@ func (o OT) Extract(ctx context.Context, carrier propagation.TextMapCarrier) con
if err != nil || !sc.IsValid() {
return ctx
}
// TODO: implement extracting baggage
//
// this currently is not achievable without an implementation of `keys`
// on the carrier, see:
// https://github.com/open-telemetry/opentelemetry-go/issues/1493

bags, err := extractBags(carrier)
if err != nil {
return trace.ContextWithRemoteSpanContext(ctx, sc)
}
ctx = baggage.ContextWithBaggage(ctx, bags)
return trace.ContextWithRemoteSpanContext(ctx, sc)
}

func (o OT) Fields() []string {
return []string{traceIDHeader, spanIDHeader, sampledHeader}
}

// extractBags extracts OpenTracing baggage information from carrier.
func extractBags(carrier propagation.TextMapCarrier) (baggage.Baggage, error) {
var err error
var members []baggage.Member
for _, key := range carrier.Keys() {
lowerKey := strings.ToLower(key)
if !strings.HasPrefix(lowerKey, baggageHeaderPrefix) {
continue
}
strippedKey := strings.TrimPrefix(lowerKey, baggageHeaderPrefix)
member, e := baggage.NewMember(strippedKey, carrier.Get(key))
if e != nil {
err = multierr.Append(err, e)
continue
}
members = append(members, member)
}
bags, e := baggage.New(members...)
if err != nil {
return bags, multierr.Append(err, e)
}
return bags, err
}

// extract reconstructs a SpanContext from header values based on OT
// headers.
func extract(traceID, spanID, sampled string) (trace.SpanContext, error) {
Expand Down

0 comments on commit fcd5fb0

Please sign in to comment.