|
16 | 16 | use Opentelemetry\Proto\Trace\V1; |
17 | 17 | use Opentelemetry\Proto\Trace\V1\ResourceSpans; |
18 | 18 | use Opentelemetry\Proto\Trace\V1\ScopeSpans; |
| 19 | +use Opentelemetry\Proto\Trace\V1\Span as ProtoSpan; |
| 20 | +use Opentelemetry\Proto\Trace\V1\Span\Link as ProtoSpanLink; |
19 | 21 | use Opentelemetry\Proto\Trace\V1\Span\SpanKind as ProtoSpanKind; |
| 22 | +use Opentelemetry\Proto\Trace\V1\SpanFlags; |
20 | 23 | use OpenTelemetry\SDK\Common\Attribute\Attributes; |
21 | 24 | use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScope; |
22 | 25 | use OpenTelemetry\SDK\Resource\ResourceInfo; |
@@ -64,18 +67,54 @@ public function test_convert_span_to_payload(): void |
64 | 67 |
|
65 | 68 | public function test_span_context_is_remote_flags(): void |
66 | 69 | { |
67 | | - $span = (new SpanData()) |
68 | | - ->setContext(SpanContext::createFromRemoteParent('0000000000000001', '00000001')) |
69 | | - ->addLink(SpanContext::createFromRemoteParent('0000000000000001', '00000002'), Attributes::create([])) |
70 | | - ->addLink(SpanContext::createFromRemoteParent('0000000000000001', '00000003', TraceFlags::SAMPLED), Attributes::create([])); |
| 70 | + $isFlagSet = static function (int $flags, int $mask): bool { |
| 71 | + return ($flags & $mask) !== 0; |
| 72 | + }; |
71 | 73 |
|
72 | | - $converter = new SpanConverter(); |
73 | | - /** @psalm-suppress InvalidArgument */ |
74 | | - $row = $converter->convert([$span])->getResourceSpans()[0]->getScopeSpans()[0]->getSpans()[0]; |
| 74 | + $isRemote = static function (int $flags) use ($isFlagSet): ?bool { |
| 75 | + if (!$isFlagSet($flags, V1\SpanFlags::SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK)) { |
| 76 | + return null; |
| 77 | + } |
| 78 | + |
| 79 | + return $isFlagSet($flags, V1\SpanFlags::SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK); |
| 80 | + }; |
| 81 | + |
| 82 | + $convertSpanData = static function (SpanData $spanData): ProtoSpan { |
| 83 | + $converter = new SpanConverter(); |
| 84 | + |
| 85 | + /** @psalm-suppress InvalidArgument */ |
| 86 | + return $converter->convert([$spanData])->getResourceSpans()[0]->getScopeSpans()[0]->getSpans()[0]; |
| 87 | + }; |
| 88 | + |
| 89 | + $getLink = static function (ProtoSpan $protoSpan, int $linkIndex): ProtoSpanLink { |
| 90 | + /** @psalm-suppress InvalidArgument */ |
| 91 | + return $protoSpan->getLinks()[$linkIndex]; |
| 92 | + }; |
| 93 | + |
| 94 | + // Span with remote parent |
| 95 | + $convertedSpan = $convertSpanData( |
| 96 | + (new SpanData()) |
| 97 | + ->setParentContext(SpanContext::createFromRemoteParent('0000000000000001', '00000001')) |
| 98 | + ->setContext(SpanContext::create('0000000000000001', '00000002')) |
| 99 | + ->addLink(SpanContext::createFromRemoteParent('0000000000000001', '00000003'), Attributes::create([])) |
| 100 | + ->addLink(SpanContext::createFromRemoteParent('0000000000000001', '00000004', TraceFlags::SAMPLED), Attributes::create([])) |
| 101 | + ); |
| 102 | + $this->assertTrue($isRemote($convertedSpan->getFlags())); |
| 103 | + $this->assertTrue($isRemote($getLink($convertedSpan, 0)->getFlags())); |
| 104 | + $this->assertTrue($isRemote($getLink($convertedSpan, 1)->getFlags())); |
| 105 | + $this->assertTrue($isFlagSet($getLink($convertedSpan, 1)->getFlags(), TraceFlags::SAMPLED)); |
| 106 | + |
| 107 | + // Span without parent |
| 108 | + $convertedSpan = $convertSpanData((new SpanData())->setContext(SpanContext::create('0000000000000001', '00000001'))); |
| 109 | + $this->assertFalse($isRemote($convertedSpan->getFlags())); |
75 | 110 |
|
76 | | - $this->assertSame(V1\SpanFlags::SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK | V1\SpanFlags::SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK, $row->getFlags()); |
77 | | - $this->assertSame(V1\SpanFlags::SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK | V1\SpanFlags::SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK, $row->getLinks()[0]->getFlags()); |
78 | | - $this->assertSame(V1\SpanFlags::SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK | V1\SpanFlags::SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK | TraceFlags::SAMPLED, $row->getLinks()[1]->getFlags()); |
| 111 | + // Span with local parent |
| 112 | + $convertedSpan = $convertSpanData( |
| 113 | + (new SpanData()) |
| 114 | + ->setParentContext(SpanContext::create('0000000000000001', '00000001')) |
| 115 | + ->setContext(SpanContext::create('0000000000000001', '00000002')) |
| 116 | + ); |
| 117 | + $this->assertFalse($isRemote($convertedSpan->getFlags())); |
79 | 118 | } |
80 | 119 |
|
81 | 120 | #[DataProvider('attributeAreCoercedCorrectlyDataProvider')] |
@@ -217,6 +256,7 @@ public function test_otlp_happy_path_span(): void |
217 | 256 | 'start_time_unix_nano' => $start_time, |
218 | 257 | 'end_time_unix_nano' => $end_time, |
219 | 258 | 'kind' => V1\Span\SpanKind::SPAN_KIND_INTERNAL, |
| 259 | + 'flags' => SpanFlags::SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK, |
220 | 260 | 'status' => new V1\Status([ 'code' => V1\Status\StatusCode::STATUS_CODE_OK ]), |
221 | 261 | 'attributes' => [ |
222 | 262 | new KeyValue([ |
|
0 commit comments