@@ -975,4 +975,59 @@ public function testSpanLinksInteroperabilityFromOpenTelemetrySpan()
975
975
$ this ->assertCount (1 , $ traces [0 ]);
976
976
$ this ->assertSame ("[{ \"trace_id \": \"12345678876543211234567887654321 \", \"span_id \": \"8765432112345678 \", \"trace_state \": \"dd=t.dm:-0 \", \"attributes \":{ \"arg1 \": \"value1 \"}, \"dropped_attributes_count \":0}] " , $ traces [0 ][0 ]['meta ' ]['_dd.span_links ' ]);
977
977
}
978
+
979
+ public function testSpanLinksInteroperabilityBothTypes ()
980
+ {
981
+ $ sampledSpanContext = SpanContext::create (
982
+ '12345678876543211234567887654321 ' ,
983
+ '8765432112345678 ' ,
984
+ TraceFlags::SAMPLED ,
985
+ new TraceState ('dd=t.dm:-0 ' )
986
+ );
987
+
988
+ $ traces = $ this ->isolateTracer (function () use ($ sampledSpanContext ) {
989
+ // Add 1 span link using the OTel API
990
+ $ otelSpan = self ::getTracer ()->spanBuilder ("otel.span " )
991
+ ->addLink ($ sampledSpanContext , ['arg1 ' => 'value1 ' ])
992
+ ->startSpan ();
993
+
994
+ // Add 1 span link using the DD API
995
+ $ newSpanLink = new SpanLink ();
996
+ $ newSpanLink ->traceId = "ff0000000000051791e0000000000041 " ;
997
+ $ newSpanLink ->spanId = "ff00000000000517 " ;
998
+ active_span ()->links [] = $ newSpanLink ;
999
+
1000
+ // Verify the span links from DD's POV
1001
+ $ datadogSpanLinks = active_span ()->links ;
1002
+ $ this ->assertCount (2 , $ datadogSpanLinks );
1003
+
1004
+ $ this ->assertSame ('12345678876543211234567887654321 ' , $ datadogSpanLinks [0 ]->traceId );
1005
+ $ this ->assertSame ('8765432112345678 ' , $ datadogSpanLinks [0 ]->spanId );
1006
+ $ this ->assertSame ('dd=t.dm:-0 ' , $ datadogSpanLinks [0 ]->traceState );
1007
+ $ this ->assertSame (['arg1 ' => 'value1 ' ], $ datadogSpanLinks [0 ]->attributes );
1008
+ $ this ->assertEquals (0 , $ datadogSpanLinks [0 ]->droppedAttributesCount );
1009
+
1010
+ $ this ->assertSame ('ff0000000000051791e0000000000041 ' , $ datadogSpanLinks [1 ]->traceId );
1011
+ $ this ->assertSame ('ff00000000000517 ' , $ datadogSpanLinks [1 ]->spanId );
1012
+
1013
+ // Verify the span links from OTel's POV
1014
+ $ otelSpanLinks = $ otelSpan ->toSpanData ()->getLinks ();
1015
+
1016
+ $ firstSpanLinkContext = $ otelSpanLinks [0 ]->getSpanContext ();
1017
+ $ this ->assertSame ('12345678876543211234567887654321 ' , $ firstSpanLinkContext ->getTraceId ());
1018
+ $ this ->assertSame ('8765432112345678 ' , $ firstSpanLinkContext ->getSpanId ());
1019
+ $ this ->assertSame ('dd=t.dm:-0 ' , (string ) $ firstSpanLinkContext ->getTraceState ());
1020
+ $ this ->assertSame (['arg1 ' => 'value1 ' ], $ otelSpanLinks [0 ]->getAttributes ()->toArray ());
1021
+
1022
+ $ secondSpanLinkContext = $ otelSpanLinks [1 ]->getSpanContext ();
1023
+ $ this ->assertSame ('ff0000000000051791e0000000000041 ' , $ secondSpanLinkContext ->getTraceId ());
1024
+ $ this ->assertSame ('ff00000000000517 ' , $ secondSpanLinkContext ->getSpanId ());
1025
+
1026
+
1027
+ $ otelSpan ->end ();
1028
+ });
1029
+
1030
+ $ this ->assertCount (1 , $ traces [0 ]);
1031
+ $ this ->assertSame ("[{ \"trace_id \": \"12345678876543211234567887654321 \", \"span_id \": \"8765432112345678 \", \"trace_state \": \"dd=t.dm:-0 \", \"attributes \":{ \"arg1 \": \"value1 \"}, \"dropped_attributes_count \":0},{ \"trace_id \": \"ff0000000000051791e0000000000041 \", \"span_id \": \"ff00000000000517 \"}] " , $ traces [0 ][0 ]['meta ' ]['_dd.span_links ' ]);
1032
+ }
978
1033
}
0 commit comments