@@ -149,7 +149,7 @@ private function convertSpan(SpanDataInterface $span): Span
149
149
$ pSpan = new Span ();
150
150
$ pSpan ->setTraceId ($ this ->serializer ->serializeTraceId ($ span ->getContext ()->getTraceIdBinary ()));
151
151
$ pSpan ->setSpanId ($ this ->serializer ->serializeSpanId ($ span ->getContext ()->getSpanIdBinary ()));
152
- $ pSpan ->setFlags (self ::traceFlags ($ span ->getContext ()));
152
+ $ pSpan ->setFlags (self ::buildFlagsForSpan ($ span ->getContext (), parentSpanContext: $ span -> getParentContext ()));
153
153
$ pSpan ->setTraceState ((string ) $ span ->getContext ()->getTraceState ());
154
154
if ($ span ->getParentContext ()->isValid ()) {
155
155
$ pSpan ->setParentSpanId ($ this ->serializer ->serializeSpanId ($ span ->getParentContext ()->getSpanIdBinary ()));
@@ -174,7 +174,7 @@ private function convertSpan(SpanDataInterface $span): Span
174
174
$ pSpan ->getLinks ()[] = $ pLink = new Link ();
175
175
$ pLink ->setTraceId ($ this ->serializer ->serializeTraceId ($ link ->getSpanContext ()->getTraceIdBinary ()));
176
176
$ pLink ->setSpanId ($ this ->serializer ->serializeSpanId ($ link ->getSpanContext ()->getSpanIdBinary ()));
177
- $ pLink ->setFlags (self ::traceFlags ($ link ->getSpanContext ()));
177
+ $ pLink ->setFlags (self ::buildFlagsForLink ($ link ->getSpanContext ()));
178
178
$ pLink ->setTraceState ((string ) $ link ->getSpanContext ()->getTraceState ());
179
179
$ this ->setAttributes ($ pLink , $ link ->getAttributes ());
180
180
}
@@ -188,14 +188,46 @@ private function convertSpan(SpanDataInterface $span): Span
188
188
return $ pSpan ;
189
189
}
190
190
191
- private static function traceFlags (SpanContextInterface $ spanContext ): int
191
+ private static function addRemoteFlags (SpanContextInterface $ spanContext, int $ baseFlags ): int
192
192
{
193
- $ flags = $ spanContext -> getTraceFlags () ;
193
+ $ flags = $ baseFlags ;
194
194
$ flags |= SpanFlags::SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK ;
195
195
if ($ spanContext ->isRemote ()) {
196
196
$ flags |= SpanFlags::SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK ;
197
197
}
198
198
199
199
return $ flags ;
200
200
}
201
+
202
+ private static function buildFlagsForSpan (SpanContextInterface $ spanContext , SpanContextInterface $ parentSpanContext ): int
203
+ {
204
+ $ flags = $ spanContext ->getTraceFlags ();
205
+
206
+ /**
207
+ * @see https://github.com/open-telemetry/opentelemetry-proto/blob/v1.5.0/opentelemetry/proto/trace/v1/trace.proto#L122
208
+ *
209
+ * Bits 8 and 9 represent the 3 states of whether a span's parent is remote.
210
+ * ^^^^^^
211
+ * That is why we pass parent span's context.
212
+ */
213
+ $ flags = self ::addRemoteFlags ($ parentSpanContext , $ flags );
214
+
215
+ return $ flags ;
216
+ }
217
+
218
+ private static function buildFlagsForLink (SpanContextInterface $ linkSpanContext ): int
219
+ {
220
+ $ flags = $ linkSpanContext ->getTraceFlags ();
221
+
222
+ /**
223
+ * @see https://github.com/open-telemetry/opentelemetry-proto/blob/v1.5.0/opentelemetry/proto/trace/v1/trace.proto#L279
224
+ *
225
+ * Bits 8 and 9 represent the 3 states of whether the link is remote.
226
+ * ^^^^
227
+ * That is why we pass link span's context.
228
+ */
229
+ $ flags = self ::addRemoteFlags ($ linkSpanContext , $ flags );
230
+
231
+ return $ flags ;
232
+ }
201
233
}
0 commit comments