Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented logic for Opentracing baggage propagation #1880

Merged
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
46 changes: 37 additions & 9 deletions propagators/ot/ot_propagator.go
Expand Up @@ -20,6 +20,8 @@ import (
"fmt"
"strings"

"go.uber.org/multierr"

"go.opentelemetry.io/otel/baggage"

"go.opentelemetry.io/otel/propagation"
Aneurysm9 marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -28,9 +30,10 @@ import (

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 +75,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 +96,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