@@ -13,12 +13,16 @@ import (
1313 "net/http"
1414 "net/http/httptest"
1515 "net/url"
16+ "strings"
1617 "testing"
1718 "time"
1819
1920 "github.com/stretchr/testify/assert"
2021 "github.com/stretchr/testify/require"
22+ "go.opentelemetry.io/otel"
2123 "go.opentelemetry.io/otel/attribute"
24+ "go.opentelemetry.io/otel/propagation"
25+ "go.opentelemetry.io/otel/trace"
2226 "golang.org/x/sync/errgroup"
2327 "google.golang.org/protobuf/proto"
2428
@@ -65,8 +69,8 @@ type zipkinSpanRequest struct {
6569 Tags map [string ]string
6670}
6771
68- func TestJaegerTracer ( t * testing. T ) {
69- done := make ( chan struct {})
72+ // runTestJaegerAgent starts a mock server listening on a random port for Jaeger spans sent over UDP.
73+ func runTestJaegerAgent ( t * testing. T , errs * errgroup. Group , done chan <- struct {}) net. Conn {
7074 addr := "127.0.0.1:0"
7175
7276 udpAddr , err := net .ResolveUDPAddr ("udp" , addr )
@@ -75,8 +79,6 @@ func TestJaegerTracer(t *testing.T) {
7579 srv , err := net .ListenUDP ("udp" , udpAddr )
7680 require .NoError (t , err )
7781
78- errs := errgroup.Group {}
79-
8082 errs .Go (func () error {
8183 t .Logf ("Starting test UDP server for Jaeger spans on %s" , srv .LocalAddr ().String ())
8284
@@ -91,20 +93,32 @@ func TestJaegerTracer(t *testing.T) {
9193 continue
9294 }
9395 if len (buf ) != 0 {
94- t .Log ("recieved span!" )
96+ t .Log ("received span!" )
9597 done <- struct {}{}
9698 }
9799 break
98100 }
99101 return nil
100102 })
101103
104+ return srv
105+ }
106+
107+ func TestJaegerTracer (t * testing.T ) {
108+ done := make (chan struct {})
109+ errs := errgroup.Group {}
110+
111+ srv := runTestJaegerAgent (t , & errs , done )
112+
102113 jt , err := New (testTracingComponent , logrusx .New ("ory/x" , "1" ), & Config {
103114 ServiceName : "Ory X" ,
104115 Provider : "jaeger" ,
105116 Providers : ProvidersConfig {
106117 Jaeger : JaegerConfig {
107118 LocalAgentAddress : srv .LocalAddr ().String (),
119+ Sampling : JaegerSampling {
120+ TraceIdRatio : 1 ,
121+ },
108122 },
109123 },
110124 })
@@ -123,6 +137,52 @@ func TestJaegerTracer(t *testing.T) {
123137 require .NoError (t , errs .Wait ())
124138}
125139
140+ func TestJaegerTracerRespectsParentSamplingDecision (t * testing.T ) {
141+ done := make (chan struct {})
142+ errs := errgroup.Group {}
143+
144+ srv := runTestJaegerAgent (t , & errs , done )
145+
146+ jt , err := New (testTracingComponent , logrusx .New ("ory/x" , "1" ), & Config {
147+ ServiceName : "Ory X" ,
148+ Provider : "jaeger" ,
149+ Providers : ProvidersConfig {
150+ Jaeger : JaegerConfig {
151+ LocalAgentAddress : srv .LocalAddr ().String (),
152+ Sampling : JaegerSampling {
153+ // Effectively disable local sampling.
154+ TraceIdRatio : 0 ,
155+ },
156+ },
157+ },
158+ })
159+ require .NoError (t , err )
160+
161+ traceId := strings .Repeat ("a" , 32 )
162+ spanId := strings .Repeat ("b" , 16 )
163+ sampledFlag := "1"
164+ traceHeaders := map [string ]string {"uber-trace-id" : traceId + ":" + spanId + ":0:" + sampledFlag }
165+
166+ ctx := otel .GetTextMapPropagator ().Extract (context .Background (), propagation .MapCarrier (traceHeaders ))
167+ spanContext := trace .SpanContextFromContext (ctx )
168+
169+ assert .True (t , spanContext .IsValid ())
170+ assert .True (t , spanContext .IsSampled ())
171+ assert .True (t , spanContext .IsRemote ())
172+
173+ trc := jt .Tracer ()
174+ _ , span := trc .Start (ctx , "testSpan" , trace .WithLinks (trace.Link {SpanContext : spanContext }))
175+ span .SetAttributes (attribute .Bool ("testAttribute" , true ))
176+ span .End ()
177+
178+ select {
179+ case <- done :
180+ case <- time .After (15 * time .Second ):
181+ t .Fatalf ("Test server did not receive spans" )
182+ }
183+ require .NoError (t , errs .Wait ())
184+ }
185+
126186func TestZipkinTracer (t * testing.T ) {
127187 done := make (chan struct {})
128188 ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
0 commit comments