@@ -32,6 +32,7 @@ import (
32
32
"go.opentelemetry.io/otel/propagation"
33
33
"go.opentelemetry.io/otel/trace"
34
34
oteltrace "go.opentelemetry.io/otel/trace"
35
+ otelbaggage "go.opentelemetry.io/otel/baggage"
35
36
36
37
"gopkg.in/DataDog/dd-trace-go.v1/appsec"
37
38
httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
@@ -537,6 +538,79 @@ func main() {
537
538
w .Write ([]byte ("ok" ))
538
539
})
539
540
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
+
540
614
mux .HandleFunc ("/session/new" , func (w http.ResponseWriter , r * http.Request ) {
541
615
sessionID := strconv .Itoa (rand .Int ())
542
616
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 {
598
672
return nil
599
673
}
600
674
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
+
601
713
func write (w http.ResponseWriter , r * http.Request , d []byte ) {
602
714
span , _ := ddtracer .StartSpanFromContext (r .Context (), "child.span" )
603
715
defer span .Finish ()
0 commit comments