Skip to content

Commit

Permalink
feat(carrier): add URL carrier
Browse files Browse the repository at this point in the history
  • Loading branch information
aereal committed Jan 1, 2024
1 parent 88a8088 commit 7ef113d
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 0 deletions.
7 changes: 7 additions & 0 deletions carrier/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module github.com/aereal/otel-propagators/carrier

go 1.21.5

require go.opentelemetry.io/otel v1.21.0

require go.opentelemetry.io/otel/trace v1.21.0
20 changes: 20 additions & 0 deletions carrier/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
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.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
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/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
43 changes: 43 additions & 0 deletions carrier/url_carrier.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package carrier

import (
"net/url"
"sync"

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

// NewURLCarrier returns a carrier adapts url.URL to satisfy the propagation.TextMapCarrier interface.
func NewURLCarrier(u *url.URL) propagation.TextMapCarrier {
return &urlCarrier{URL: u}
}

type urlCarrier struct {
*url.URL
sync.RWMutex
}

func (uc *urlCarrier) Get(key string) string {
uc.RLock()
defer uc.RUnlock()
return uc.Query().Get(key)
}

func (uc *urlCarrier) Set(key, value string) {
uc.Lock()
defer uc.Unlock()
qs := uc.Query()
qs.Set(key, value)
uc.RawQuery = qs.Encode()
}

func (uc *urlCarrier) Keys() []string {
uc.RLock()
defer uc.RUnlock()
qs := uc.Query()
keys := make([]string, 0, len(qs))
for k := range qs {
keys = append(keys, k)
}
return keys
}
84 changes: 84 additions & 0 deletions carrier/url_carrier_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package carrier_test

import (
"context"
"net/url"
"testing"

"github.com/aereal/otel-propagators/carrier"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
)

var (
traceID trace.TraceID
spanID trace.SpanID
)

func init() {
var err error
traceID, err = trace.TraceIDFromHex(traceIDStr)
if err != nil {
panic(err)
}
spanID, err = trace.SpanIDFromHex(spanIDStr)
if err != nil {
panic(err)
}
}

const (
traceIDStr = "4bf92f3577b34da6a3ce929d0e0e4736"
spanIDStr = "00f067aa0ba902b7"
)

func TestURLCarrier(t *testing.T) {
var prop propagation.TraceContext
t.Run("initial state", func(t *testing.T) {
testURL, err := url.Parse("http://test.example/")
if err != nil {
t.Fatal(err)
}
ctx := context.Background()
sc := trace.SpanContextFromContext(prop.Extract(ctx, carrier.NewURLCarrier(testURL)))
want := trace.NewSpanContext(trace.SpanContextConfig{})
if !sc.Equal(want) {
t.Errorf("extracted span context mismatch:\n\twant: %#v\n\tgot: %#v", want, sc)
}
})
t.Run("injected/not sampled", func(t *testing.T) {
testURL, err := url.Parse("http://test.example/?traceparent=00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00")
if err != nil {
t.Fatal(err)
}
ctx := context.Background()
prop.Inject(ctx, carrier.NewURLCarrier(testURL))
sc := trace.SpanContextFromContext(prop.Extract(ctx, carrier.NewURLCarrier(testURL)))
want := trace.NewSpanContext(trace.SpanContextConfig{
TraceID: traceID,
SpanID: spanID,
Remote: true,
})
if !sc.Equal(want) {
t.Errorf("extracted span context mismatch:\n\twant: %#v\n\tgot: %#v", want, sc)
}
})
t.Run("injected/sampled", func(t *testing.T) {
testURL, err := url.Parse("http://test.example/?traceparent=00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01")
if err != nil {
t.Fatal(err)
}
ctx := context.Background()
prop.Inject(ctx, carrier.NewURLCarrier(testURL))
sc := trace.SpanContextFromContext(prop.Extract(ctx, carrier.NewURLCarrier(testURL)))
want := trace.NewSpanContext(trace.SpanContextConfig{
TraceID: traceID,
SpanID: spanID,
Remote: true,
TraceFlags: trace.FlagsSampled,
})
if !sc.Equal(want) {
t.Errorf("extracted span context mismatch:\n\twant: %#v\n\tgot: %#v", want, sc)
}
})
}

0 comments on commit 7ef113d

Please sign in to comment.