Skip to content

Commit 46b28eb

Browse files
authored
Fix ottracepropagation for short span ids (#6734)
1 parent 2dbb8de commit 46b28eb

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/Common.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ final class Common {
2929
static final int MAX_TRACE_ID_LENGTH = TraceId.getLength();
3030
static final int MIN_TRACE_ID_LENGTH = MAX_TRACE_ID_LENGTH / 2;
3131

32+
static final int MAX_SPAN_ID_LENGTH = SpanId.getLength();
33+
3234
private Common() {}
3335

3436
static SpanContext buildSpanContext(
@@ -44,7 +46,7 @@ static SpanContext buildSpanContext(
4446

4547
return SpanContext.createFromRemoteParent(
4648
StringUtils.padLeft(traceId, MAX_TRACE_ID_LENGTH),
47-
spanId,
49+
StringUtils.padLeft(spanId, MAX_SPAN_ID_LENGTH),
4850
traceFlags,
4951
TraceState.getDefault());
5052
} catch (RuntimeException e) {

extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
package io.opentelemetry.extension.trace.propagation;
77

8+
import static io.opentelemetry.extension.trace.propagation.Common.MAX_SPAN_ID_LENGTH;
89
import static io.opentelemetry.extension.trace.propagation.Common.MAX_TRACE_ID_LENGTH;
910

1011
import io.opentelemetry.api.baggage.Baggage;
1112
import io.opentelemetry.api.baggage.BaggageBuilder;
1213
import io.opentelemetry.api.internal.StringUtils;
1314
import io.opentelemetry.api.trace.Span;
1415
import io.opentelemetry.api.trace.SpanContext;
16+
import io.opentelemetry.api.trace.SpanId;
1517
import io.opentelemetry.api.trace.TraceId;
1618
import io.opentelemetry.context.Context;
1719
import io.opentelemetry.context.propagation.TextMapGetter;
@@ -96,7 +98,13 @@ public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C
9698
incomingTraceId == null
9799
? TraceId.getInvalid()
98100
: StringUtils.padLeft(incomingTraceId, MAX_TRACE_ID_LENGTH);
99-
String spanId = getter.get(carrier, SPAN_ID_HEADER);
101+
102+
String incomingSpanId = getter.get(carrier, SPAN_ID_HEADER);
103+
String spanId =
104+
incomingSpanId == null
105+
? SpanId.getInvalid()
106+
: StringUtils.padLeft(incomingSpanId, MAX_SPAN_ID_LENGTH);
107+
100108
String sampled = getter.get(carrier, SAMPLED_HEADER);
101109
SpanContext spanContext = buildSpanContext(traceId, spanId, sampled);
102110
if (!spanContext.isValid()) {

extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/OtTracePropagatorTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class OtTracePropagatorTest {
3232
private static final String SHORT_TRACE_ID = "ff00000000000000";
3333
private static final String SHORT_TRACE_ID_FULL = "0000000000000000ff00000000000000";
3434
private static final String SPAN_ID = "ff00000000000041";
35+
private static final String SHORT_SPAN_ID = "f00000000000041";
36+
private static final String SHORT_SPAN_ID_FULL = "0f00000000000041";
3537
private static final TextMapSetter<Map<String, String>> setter = Map::put;
3638
private static final TextMapGetter<Map<String, String>> getter =
3739
new TextMapGetter<Map<String, String>>() {
@@ -261,6 +263,45 @@ void extract_NotSampledContext_Short_TraceId() {
261263
SHORT_TRACE_ID_FULL, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()));
262264
}
263265

266+
@Test
267+
void extract_SampledContext_Int_Short_SPanId() {
268+
Map<String, String> carrier = new LinkedHashMap<>();
269+
carrier.put(OtTracePropagator.TRACE_ID_HEADER, TRACE_ID);
270+
carrier.put(OtTracePropagator.SPAN_ID_HEADER, SHORT_SPAN_ID);
271+
carrier.put(OtTracePropagator.SAMPLED_HEADER, Common.TRUE_INT);
272+
273+
assertThat(getSpanContext(propagator.extract(Context.current(), carrier, getter)))
274+
.isEqualTo(
275+
SpanContext.createFromRemoteParent(
276+
TRACE_ID, SHORT_SPAN_ID_FULL, TraceFlags.getSampled(), TraceState.getDefault()));
277+
}
278+
279+
@Test
280+
void extract_SampledContext_Bool_Short_SpanId() {
281+
Map<String, String> carrier = new LinkedHashMap<>();
282+
carrier.put(OtTracePropagator.TRACE_ID_HEADER, TRACE_ID);
283+
carrier.put(OtTracePropagator.SPAN_ID_HEADER, SHORT_SPAN_ID);
284+
carrier.put(OtTracePropagator.SAMPLED_HEADER, "true");
285+
286+
assertThat(getSpanContext(propagator.extract(Context.current(), carrier, getter)))
287+
.isEqualTo(
288+
SpanContext.createFromRemoteParent(
289+
TRACE_ID, SHORT_SPAN_ID_FULL, TraceFlags.getSampled(), TraceState.getDefault()));
290+
}
291+
292+
@Test
293+
void extract_NotSampledContext_Short_SpanId() {
294+
Map<String, String> carrier = new LinkedHashMap<>();
295+
carrier.put(OtTracePropagator.TRACE_ID_HEADER, TRACE_ID);
296+
carrier.put(OtTracePropagator.SPAN_ID_HEADER, SHORT_SPAN_ID);
297+
carrier.put(OtTracePropagator.SAMPLED_HEADER, Common.FALSE_INT);
298+
299+
assertThat(getSpanContext(propagator.extract(Context.current(), carrier, getter)))
300+
.isEqualTo(
301+
SpanContext.createFromRemoteParent(
302+
TRACE_ID, SHORT_SPAN_ID_FULL, TraceFlags.getDefault(), TraceState.getDefault()));
303+
}
304+
264305
@Test
265306
void extract_InvalidTraceId() {
266307
Map<String, String> invalidHeaders = new LinkedHashMap<>();

0 commit comments

Comments
 (0)