Skip to content

Commit 247982b

Browse files
Run tests against Go. This one differs specifically because we don't run automatic instrumentation in the typical dd-trace-go setup, so the user is expected to set the default propagator. This test simply tests that using the API otel.GetTextMapPropagator() works as expected
1 parent 6ad0a30 commit 247982b

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

Diff for: manifests/golang.yml

+3
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,9 @@ tests/:
509509
Test_AWS_API_Gateway_Inferred_Span_Creation: missing_feature
510510
test_otel_drop_in.py:
511511
Test_Otel_Drop_In: missing_feature
512+
Test_Otel_Drop_In_Default_Propagator:
513+
'*': irrelevant
514+
net-http: v1.70.1
512515
parametric/:
513516
test_config_consistency.py:
514517
Test_Config_Dogstatsd: missing_feature

Diff for: utils/build/docker/golang/app/net-http/main.go

+112
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"go.opentelemetry.io/otel/propagation"
3333
"go.opentelemetry.io/otel/trace"
3434
oteltrace "go.opentelemetry.io/otel/trace"
35+
otelbaggage "go.opentelemetry.io/otel/baggage"
3536

3637
"gopkg.in/DataDog/dd-trace-go.v1/appsec"
3738
httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
@@ -537,6 +538,79 @@ func main() {
537538
w.Write([]byte("ok"))
538539
})
539540

541+
mux.HandleFunc("/otel_drop_in_default_propagator_extract", func(w http.ResponseWriter, r *http.Request) {
542+
// Differing from other languages, the user must set the text map propagator because dd-trace-go
543+
// doesn't automatically instrument at runtime (not including Orchestrion)
544+
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
545+
546+
httpCarrier := HttpCarrier{header: r.Header}
547+
548+
propagator := otel.GetTextMapPropagator()
549+
ctx := propagator.Extract(r.Context(), httpCarrier)
550+
551+
spanContext := oteltrace.SpanContextFromContext(ctx)
552+
baggage := otelbaggage.FromContext(ctx)
553+
554+
base := 16
555+
bitSize := 64
556+
result := make(map[string]any, 4)
557+
558+
num, err := strconv.ParseInt(spanContext.TraceID().String()[16:], base, bitSize)
559+
if err == nil {
560+
result["trace_id"] = num
561+
}
562+
563+
num, err = strconv.ParseInt(spanContext.SpanID().String(), base, bitSize)
564+
if err == nil {
565+
result["span_id"] = num
566+
}
567+
568+
result["tracestate"] = spanContext.TraceState().String()
569+
result["baggage"] = baggage.String()
570+
571+
jsonData, err := json.Marshal(result)
572+
if err != nil {
573+
w.WriteHeader(422)
574+
w.Write([]byte("failed to convert carrier to JSON"))
575+
return
576+
}
577+
578+
w.Header().Set("Content-Type", "application/json")
579+
w.WriteHeader(200)
580+
w.Write(jsonData)
581+
})
582+
583+
mux.HandleFunc("/otel_drop_in_default_propagator_inject", func(w http.ResponseWriter, r *http.Request) {
584+
// Differing from other languages, the user must set the text map propagator because dd-trace-go
585+
// doesn't automatically instrument at runtime (not including Orchestrion)
586+
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
587+
588+
ctx := context.Background()
589+
p := ddotel.NewTracerProvider()
590+
tracer := p.Tracer("")
591+
otel.SetTracerProvider(p)
592+
593+
_, span := tracer.Start(ddotel.ContextWithStartOptions(ctx), "main")
594+
newCtx := oteltrace.ContextWithSpan(ctx, span)
595+
596+
propagator := otel.GetTextMapPropagator()
597+
mapCarrier := make(MapCarrier)
598+
propagator.Inject(newCtx, mapCarrier)
599+
600+
jsonData, err := json.Marshal(mapCarrier)
601+
span.End()
602+
603+
if err != nil {
604+
w.WriteHeader(422)
605+
w.Write([]byte("failed to convert carrier to JSON"))
606+
return
607+
}
608+
609+
w.Header().Set("Content-Type", "application/json")
610+
w.WriteHeader(200)
611+
w.Write(jsonData)
612+
})
613+
540614
mux.HandleFunc("/session/new", func(w http.ResponseWriter, r *http.Request) {
541615
sessionID := strconv.Itoa(rand.Int())
542616
w.Header().Add("Set-Cookie", "session="+sessionID+"; Path=/; Max-Age=3600; Secure; HttpOnly")
@@ -598,6 +672,44 @@ func (c carrier) ForeachKey(handler func(key, val string) error) error {
598672
return nil
599673
}
600674

675+
type MapCarrier map[string]string
676+
677+
func (c MapCarrier) Get(key string) string {
678+
return c[key]
679+
}
680+
681+
func (c MapCarrier) Set(key, val string) {
682+
c[key] = val
683+
}
684+
685+
func (c MapCarrier) Keys() []string {
686+
keys := make([]string, 0, len(c))
687+
for k := range c {
688+
keys = append(keys, k)
689+
}
690+
return keys
691+
}
692+
693+
type HttpCarrier struct {
694+
header http.Header
695+
}
696+
697+
func (c HttpCarrier) Get(key string) string {
698+
return c.header.Get(key)
699+
}
700+
701+
func (c HttpCarrier) Set(key, val string) {
702+
c.header.Set(key, val)
703+
}
704+
705+
func (c HttpCarrier) Keys() []string {
706+
keys := make([]string, 0, len(c.header))
707+
for k := range c.header {
708+
keys = append(keys, k)
709+
}
710+
return keys
711+
}
712+
601713
func write(w http.ResponseWriter, r *http.Request, d []byte) {
602714
span, _ := ddtracer.StartSpanFromContext(r.Context(), "child.span")
603715
defer span.Finish()

0 commit comments

Comments
 (0)