|
2 | 2 |
|
3 | 3 | namespace DDTrace\Tests\OpenTelemetry\Integration;
|
4 | 4 |
|
| 5 | +use DDTrace\SpanLink; |
5 | 6 | use DDTrace\Tag;
|
6 | 7 | use DDTrace\Tests\Common\BaseTestCase;
|
7 | 8 | use DDTrace\Tests\Common\SpanAssertion;
|
|
14 | 15 | use OpenTelemetry\API\Trace\SpanContext;
|
15 | 16 | use OpenTelemetry\API\Trace\SpanContextValidator;
|
16 | 17 | use OpenTelemetry\API\Trace\SpanKind;
|
| 18 | +use OpenTelemetry\API\Trace\TraceFlags; |
| 19 | +use OpenTelemetry\API\Trace\TraceState; |
17 | 20 | use OpenTelemetry\Context\Context;
|
18 | 21 | use OpenTelemetry\Context\ContextStorage;
|
19 | 22 | use OpenTelemetry\Extension\Propagator\B3\B3Propagator;
|
@@ -907,5 +910,69 @@ public function testAttributesInteroperability()
|
907 | 910 | $this->assertEquals(2, $traces[0][0]['metrics']['m2']);
|
908 | 911 | }
|
909 | 912 |
|
| 913 | + public function testSpanLinksInteroperabilityFromDatadogSpan() |
| 914 | + { |
| 915 | + $traces = $this->isolateTracer(function () { |
| 916 | + $span = start_span(); |
| 917 | + $span->name = "dd.span"; |
| 918 | + |
| 919 | + $spanLink = new SpanLink(); |
| 920 | + $spanLink->traceId = "ff0000000000051791e0000000000041"; |
| 921 | + $spanLink->spanId = "ff00000000000517"; |
| 922 | + $spanLink->traceState = "dd=t.dm:-0"; |
| 923 | + $spanLink->attributes = [ |
| 924 | + 'arg1' => 'value1', |
| 925 | + 'arg2' => 'value2', |
| 926 | + ]; |
| 927 | + $span->links[] = $spanLink; |
| 928 | + |
| 929 | + /** @var \OpenTelemetry\SDK\Trace\Span $OTelSpan */ |
| 930 | + $OTelSpan = Span::getCurrent(); |
| 931 | + $OTelSpanLink = $OTelSpan->toSpanData()->getLinks()[0]; |
| 932 | + $OTelSpanLinkContext = $OTelSpanLink->getSpanContext(); |
| 933 | + |
| 934 | + $this->assertSame('ff0000000000051791e0000000000041', $OTelSpanLinkContext->getTraceId()); |
| 935 | + $this->assertSame('ff00000000000517', $OTelSpanLinkContext->getSpanId()); |
| 936 | + $this->assertSame('dd=t.dm:-0', (string) $OTelSpanLinkContext->getTraceState()); |
| 937 | + |
| 938 | + $this->assertSame([ |
| 939 | + 'arg1' => 'value1', |
| 940 | + 'arg2' => 'value2', |
| 941 | + ], $OTelSpanLink->getAttributes()->toArray()); |
| 942 | + |
| 943 | + close_span(); |
| 944 | + }); |
910 | 945 |
|
| 946 | + $this->assertCount(1, $traces[0]); |
| 947 | + $this->assertSame("[{\"trace_id\":\"ff0000000000051791e0000000000041\",\"span_id\":\"ff00000000000517\",\"trace_state\":\"dd=t.dm:-0\",\"attributes\":{\"arg1\":\"value1\",\"arg2\":\"value2\"}}]", $traces[0][0]['meta']['_dd.span_links']); |
| 948 | + } |
| 949 | + |
| 950 | + public function testSpanLinksInteroperabilityFromOpenTelemetrySpan() |
| 951 | + { |
| 952 | + $sampledSpanContext = SpanContext::create( |
| 953 | + '12345678876543211234567887654321', |
| 954 | + '8765432112345678', |
| 955 | + TraceFlags::SAMPLED, |
| 956 | + new TraceState('dd=t.dm:-0') |
| 957 | + ); |
| 958 | + |
| 959 | + $traces = $this->isolateTracer(function () use ($sampledSpanContext) { |
| 960 | + $otelSpan = self::getTracer()->spanBuilder("otel.span") |
| 961 | + ->addLink($sampledSpanContext, ['arg1' => 'value1']) |
| 962 | + ->startSpan(); |
| 963 | + |
| 964 | + $activeSpan = active_span(); |
| 965 | + $spanLink = $activeSpan->links[0]; |
| 966 | + $this->assertSame('12345678876543211234567887654321', $spanLink->traceId); |
| 967 | + $this->assertSame('8765432112345678', $spanLink->spanId); |
| 968 | + $this->assertSame('dd=t.dm:-0', $spanLink->traceState); |
| 969 | + $this->assertSame(['arg1' => 'value1'], $spanLink->attributes); |
| 970 | + $this->assertEquals(0, $spanLink->droppedAttributesCount); |
| 971 | + |
| 972 | + $otelSpan->end(); |
| 973 | + }); |
| 974 | + |
| 975 | + $this->assertCount(1, $traces[0]); |
| 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 | + } |
911 | 978 | }
|
0 commit comments