Skip to content

Commit 4eb1384

Browse files
committed
OTLP encodes trace/span ids as big-endian byte-arrays
1 parent abe7711 commit 4eb1384

2 files changed

Lines changed: 14 additions & 15 deletions

File tree

dd-trace-core/src/main/java/datadog/trace/core/otlp/trace/OtlpTraceProto.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ public static byte[] recordSpanLinkMessage(GrowableBuffer buf, AgentSpanLink spa
194194

195195
public static void writeTraceId(StreamingBuffer buf, DDTraceId traceId) {
196196
writeVarInt(buf, 16);
197-
writeI64(buf, traceId.toLong());
198-
writeI64(buf, traceId.toHighOrderLong());
197+
buf.putLong(traceId.toHighOrderLong());
198+
buf.putLong(traceId.toLong());
199199
}
200200

201201
public static void writeSpanId(StreamingBuffer buf, long spanId) {
202202
writeVarInt(buf, 8);
203-
writeI64(buf, spanId);
203+
buf.putLong(spanId);
204204
}
205205

206206
private static void writeSpanTag(StreamingBuffer buf, TagMap.EntryReader tagEntry) {

dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceProtoTest.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -723,8 +723,9 @@ void testCollectMultipleTraces() throws IOException {
723723
assertNotNull(parsedTraceId, "trace_id must be present in every span");
724724
assertEquals(16, parsedTraceId.length, "trace_id must be 16 bytes");
725725
assertEquals(8, parsedSpanId.length, "span_id must be 8 bytes");
726-
parsedSpanIds.add(readLittleEndianLong(parsedSpanId));
727-
parsedTraceIds.add(readLittleEndianLong(parsedTraceId));
726+
parsedSpanIds.add(readBigEndianLong(parsedSpanId));
727+
// low-order part of traceId occupies parsedTraceId[8..15] (big-endian)
728+
parsedTraceIds.add(readBigEndianLong(copyOfRange(parsedTraceId, 8, 16)));
728729
} else {
729730
ss.skipField(ssTag);
730731
}
@@ -964,8 +965,8 @@ private static void verifySpan(CodedInputStream sp, DDSpan span, SpanSpec spec,
964965
assertNotNull(parsedTraceId, "trace_id must be present [" + caseName + "]");
965966
assertEquals(16, parsedTraceId.length, "trace_id must be 16 bytes [" + caseName + "]");
966967
if (spec.use128BitTraceId) {
967-
// high-order bytes occupy parsedTraceId[8..15] (little-endian in the wire format)
968-
long highOrderBytes = readLittleEndianLong(copyOfRange(parsedTraceId, 8, 16));
968+
// high-order part of traceId occupies parsedTraceId[0..7] (big-endian)
969+
long highOrderBytes = readBigEndianLong(parsedTraceId);
969970
assertNotEquals(
970971
0L,
971972
highOrderBytes,
@@ -976,9 +977,7 @@ private static void verifySpan(CodedInputStream sp, DDSpan span, SpanSpec spec,
976977
assertNotNull(parsedSpanId, "span_id must be present [" + caseName + "]");
977978
assertEquals(8, parsedSpanId.length, "span_id must be 8 bytes [" + caseName + "]");
978979
assertEquals(
979-
span.getSpanId(),
980-
readLittleEndianLong(parsedSpanId),
981-
"span_id mismatch [" + caseName + "]");
980+
span.getSpanId(), readBigEndianLong(parsedSpanId), "span_id mismatch [" + caseName + "]");
982981

983982
// ── parent_span_id (field 4) ──────────────────────────────────────────────
984983
if (spec.parentIndex >= 0) {
@@ -988,14 +987,14 @@ private static void verifySpan(CodedInputStream sp, DDSpan span, SpanSpec spec,
988987
8, parsedParentSpanId.length, "parent_span_id must be 8 bytes [" + caseName + "]");
989988
assertEquals(
990989
span.getParentId(),
991-
readLittleEndianLong(parsedParentSpanId),
990+
readBigEndianLong(parsedParentSpanId),
992991
"parent_span_id mismatch [" + caseName + "]");
993992
} else {
994993
// root spans either omit the field or write zero bytes
995994
if (parsedParentSpanId != null) {
996995
assertEquals(
997996
0L,
998-
readLittleEndianLong(parsedParentSpanId),
997+
readBigEndianLong(parsedParentSpanId),
999998
"root span parent_span_id must be zero [" + caseName + "]");
1000999
}
10011000
}
@@ -1191,10 +1190,10 @@ private static String readKeyValueKey(CodedInputStream kv) throws IOException {
11911190
return key;
11921191
}
11931192

1194-
/** Reads a little-endian 64-bit integer from the first 8 bytes of the given array. */
1195-
private static long readLittleEndianLong(byte[] bytes) {
1193+
/** Reads a big-endian 64-bit value from the first 8 bytes of the given array. */
1194+
private static long readBigEndianLong(byte[] bytes) {
11961195
long value = 0;
1197-
for (int i = 7; i >= 0; i--) {
1196+
for (int i = 0; i < 8; i++) {
11981197
value = (value << 8) | (bytes[i] & 0xFF);
11991198
}
12001199
return value;

0 commit comments

Comments
 (0)