Skip to content

Commit c781a95

Browse files
Added missing baggage. Fixed smoke tests.
1 parent c320eee commit c781a95

8 files changed

Lines changed: 93 additions & 74 deletions

File tree

dd-smoke-tests/apm-tracing-disabled/src/test/groovy/datadog/smoketest/apmtracingdisabled/AbstractApmTracingDisabledSmokeTest.groovy

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import datadog.trace.test.agent.decoder.DecodedTrace
66

77
abstract class AbstractApmTracingDisabledSmokeTest extends AbstractServerSmokeTest {
88

9+
protected abstract String traceAgentProtocolVersion()
10+
911
@Override
1012
File createTemporaryFile(int processIndex) {
1113
return null
@@ -32,6 +34,7 @@ abstract class AbstractApmTracingDisabledSmokeTest extends AbstractServerSmokeTe
3234
List<String> command = []
3335
command.add(javaPath())
3436
command.addAll(defaultJavaProperties)
37+
command.add("-Ddd.trace.agent.protocol.version=${traceAgentProtocolVersion()}".toString())
3538
command.addAll(properties)
3639
command.addAll((String[]) ['-jar', springBootShadowJar, "--server.port=${port}"])
3740
ProcessBuilder processBuilder = new ProcessBuilder(command)
@@ -57,12 +60,16 @@ abstract class AbstractApmTracingDisabledSmokeTest extends AbstractServerSmokeTe
5760
}
5861
}
5962

63+
protected Object samplingPriority(DecodedTrace trace) {
64+
return trace.spans[0].metrics['_sampling_priority_v1']
65+
}
66+
6067
protected checkRootSpanPrioritySampling(DecodedTrace trace, byte priority) {
61-
return trace.spans[0].metrics['_sampling_priority_v1'] == priority
68+
return samplingPriority(trace) == priority
6269
}
6370

6471
protected isSampledBySampler(DecodedTrace trace) {
65-
def samplingPriority = trace.spans[0].metrics['_sampling_priority_v1']
72+
def samplingPriority = samplingPriority(trace)
6673
return samplingPriority == PrioritySampling.SAMPLER_KEEP || samplingPriority == PrioritySampling.SAMPLER_DROP
6774
}
6875

dd-smoke-tests/apm-tracing-disabled/src/test/groovy/datadog/smoketest/apmtracingdisabled/ApmTracingDisabledMatrixSmokeTest.groovy

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package datadog.smoketest.apmtracingdisabled
22

33
import datadog.trace.api.sampling.PrioritySampling
4+
import datadog.trace.test.agent.decoder.DecodedTrace
45
import okhttp3.Request
56

6-
class ApmTracingDisabledMatrixSmokeTest extends AbstractApmTracingDisabledSmokeTest {
7+
abstract class ApmTracingDisabledMatrixSmokeTest extends AbstractApmTracingDisabledSmokeTest {
78

89
static final String APM_TRACING_DISABLED_SERVICE_NAME = "apm-tracing-disabled-matrix-smoketest-app"
910
static final String APM_TRACING_DISABLED_SERVICE_NAME_2 = "apm-tracing-disabled-matrix-smoketest-app2"
@@ -316,3 +317,22 @@ class ApmTracingDisabledMatrixSmokeTest extends AbstractApmTracingDisabledSmokeT
316317
standAloneBillingTraceId == downstreamTraceId //There is propagation
317318
}
318319
}
320+
321+
class ApmTracingDisabledMatrixSmokeV04Test extends ApmTracingDisabledMatrixSmokeTest {
322+
@Override
323+
protected String traceAgentProtocolVersion() {
324+
return '0.4'
325+
}
326+
}
327+
328+
class ApmTracingDisabledMatrixSmokeV1Test extends ApmTracingDisabledMatrixSmokeTest {
329+
@Override
330+
protected String traceAgentProtocolVersion() {
331+
return '1.0'
332+
}
333+
334+
@Override
335+
protected Object samplingPriority(DecodedTrace trace) {
336+
return trace.samplingPriority
337+
}
338+
}

dd-smoke-tests/apm-tracing-disabled/src/test/groovy/datadog/smoketest/apmtracingdisabled/ApmTracingDisabledSamplingSmokeTest.groovy

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package datadog.smoketest.apmtracingdisabled
22

33
import datadog.trace.api.sampling.PrioritySampling
4+
import datadog.trace.test.agent.decoder.DecodedTrace
45
import datadog.trace.test.util.Flaky
56
import groovy.json.JsonSlurper
67
import okhttp3.Request
78

8-
@Flaky
9-
class ApmTracingDisabledSamplingSmokeTest extends AbstractApmTracingDisabledSmokeTest {
9+
abstract class ApmTracingDisabledSamplingSmokeTest extends AbstractApmTracingDisabledSmokeTest {
1010

1111
@Override
1212
ProcessBuilder createProcessBuilder(){
@@ -135,3 +135,24 @@ class ApmTracingDisabledSamplingSmokeTest extends AbstractApmTracingDisabledSmok
135135
downstreamHeaders["x-datadog-sampling-priority"] == "2"
136136
}
137137
}
138+
139+
@Flaky
140+
class ApmTracingDisabledSamplingSmokeV04Test extends ApmTracingDisabledSamplingSmokeTest {
141+
@Override
142+
protected String traceAgentProtocolVersion() {
143+
return '0.4'
144+
}
145+
}
146+
147+
@Flaky
148+
class ApmTracingDisabledSamplingSmokeV1Test extends ApmTracingDisabledSamplingSmokeTest {
149+
@Override
150+
protected String traceAgentProtocolVersion() {
151+
return '1.0'
152+
}
153+
154+
@Override
155+
protected Object samplingPriority(DecodedTrace trace) {
156+
return trace.samplingPriority
157+
}
158+
}

dd-smoke-tests/apm-tracing-disabled/src/test/groovy/datadog/smoketest/apmtracingdisabled/ApmTracingDisabledSmokeTest.groovy

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package datadog.smoketest.apmtracingdisabled
22

33
import okhttp3.Request
44

5-
class ApmTracingDisabledSmokeTest extends AbstractApmTracingDisabledSmokeTest {
5+
abstract class ApmTracingDisabledSmokeTest extends AbstractApmTracingDisabledSmokeTest {
66

77
private static final String APM_TRACING_DISABLED_SERVICE_NAME = "asm-standalone-billing-smoketest-app"
88
private static final String APM_ENABLED_SERVICE_NAME = "apm-enabled-smoketest-app"
@@ -91,3 +91,17 @@ class ApmTracingDisabledSmokeTest extends AbstractApmTracingDisabledSmokeTest {
9191
]
9292
}
9393
}
94+
95+
class ApmTracingDisabledSmokeV04Test extends ApmTracingDisabledSmokeTest {
96+
@Override
97+
protected String traceAgentProtocolVersion() {
98+
return '0.4'
99+
}
100+
}
101+
102+
class ApmTracingDisabledSmokeV1Test extends ApmTracingDisabledSmokeTest {
103+
@Override
104+
protected String traceAgentProtocolVersion() {
105+
return '1.0'
106+
}
107+
}

dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ private Long asLong(Object value) {
354354
private void encodeSpanAttributes(
355355
Writable writable, int fieldId, Metadata meta, Map<String, Object> metaStruct) {
356356
TagMap tags = meta.getTags();
357+
Map<String, String> baggage = meta.getBaggage();
357358
String httpStatusCode =
358359
meta.getHttpStatusCode() == null ? null : meta.getHttpStatusCode().toString();
359360
boolean writeHttpStatus = httpStatusCode != null && tags.getString(HTTP_STATUS) == null;
@@ -365,7 +366,12 @@ private void encodeSpanAttributes(
365366
}
366367

367368
writable.writeInt(fieldId);
368-
writable.startArray((tagCount + metaStruct.size() + (writeHttpStatus ? 1 : 0)) * 3);
369+
writable.startArray(
370+
(baggage.size() + tagCount + metaStruct.size() + (writeHttpStatus ? 1 : 0)) * 3);
371+
372+
for (Map.Entry<String, String> entry : baggage.entrySet()) {
373+
writeAttribute(writable, entry.getKey(), entry.getValue());
374+
}
369375

370376
for (TagMap.EntryReader entry : tags) {
371377
if (DDTags.SPAN_EVENTS.equals(entry.tag())) {

utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/DecodedTrace.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@
44

55
public interface DecodedTrace {
66
List<DecodedSpan> getSpans();
7+
8+
// Payload v1.0 has sampling priority on trace level.
9+
default Integer getSamplingPriority() {
10+
return null;
11+
}
712
}

utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/MessageV1.java

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,35 +8,11 @@
88
import java.util.Arrays;
99
import java.util.Collections;
1010
import java.util.List;
11-
import org.msgpack.core.MessageFormat;
1211
import org.msgpack.core.MessagePack;
1312
import org.msgpack.core.MessageUnpacker;
1413
import org.msgpack.value.ValueType;
1514

16-
/**
17-
* MessageV1 decodes V1.0 trace payload format.
18-
*
19-
* <p>The V1.0 raw buffer format (from FlushingBuffer.dump()) is a concatenation of traces, where
20-
* each trace is an array of spans:
21-
*
22-
* <pre>
23-
* [span1, span2, ...] // trace 1 (array of spans)
24-
* [span3, span4, ...] // trace 2 (array of spans)
25-
* ...
26-
* </pre>
27-
*
28-
* <p>Note: The dump() may include padding (zeros) after the actual data.
29-
*
30-
* <p>The full payload format wraps this in a map with field 11 (FIELD_CHUNKS).
31-
*
32-
* <p>Key features:
33-
*
34-
* <ul>
35-
* <li>Integer field IDs instead of string keys
36-
* <li>Streaming string encoding (string table)
37-
* <li>Attributes as flat array of triplets (key, type, value)
38-
* </ul>
39-
*/
15+
/** MessageV1 decodes V1.0 trace payload format. */
4016
public class MessageV1 implements DecodedMessage {
4117
// Tracer Payload field IDs
4218
static final int FIELD_CHUNKS = 11;
@@ -65,7 +41,7 @@ static MessageV1 unpack(MessageUnpacker unpacker) {
6541
List<DecodedTrace> traces = new ArrayList<>();
6642

6743
if (firstType == ValueType.MAP) {
68-
// Full payload format: map with FIELD_CHUNKS containing traces
44+
// Full payload format: map with FIELD_CHUNKS containing trace chunks.
6945
int mapSize = unpacker.unpackMapHeader();
7046

7147
for (int i = 0; i < mapSize; i++) {
@@ -79,24 +55,9 @@ static MessageV1 unpack(MessageUnpacker unpacker) {
7955
skipPayloadField(unpacker, fieldId, stringTable);
8056
}
8157
}
82-
} else if (firstType == ValueType.ARRAY) {
83-
// Raw buffer format: concatenated traces (each trace is an array of spans)
84-
// Read traces one by one until we exhaust the buffer or hit padding
85-
while (unpacker.hasNext()) {
86-
MessageFormat format = unpacker.getNextFormat();
87-
ValueType valueType = format.getValueType();
88-
89-
// Stop if we hit padding (zeros or other non-array values)
90-
if (valueType != ValueType.ARRAY) {
91-
break;
92-
}
93-
94-
DecodedTrace trace = TraceV1.unpack(unpacker, stringTable);
95-
traces.add(trace);
96-
}
9758
} else {
9859
throw new IllegalArgumentException(
99-
"Expected Map or Array at start of V1.0 payload, got: " + firstType);
60+
"Expected Map at start of V1.0 payload, got: " + firstType);
10061
}
10162

10263
return new MessageV1(traces.toArray(new DecodedTrace[0]));

utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/TraceV1.java

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.List;
1010
import java.util.Map;
1111
import org.msgpack.core.MessageUnpacker;
12-
import org.msgpack.value.ValueType;
1312

1413
/**
1514
* TraceV1 represents a decoded trace in V1.0 format.
@@ -34,17 +33,7 @@ public static DecodedTrace[] unpackTraces(MessageUnpacker unpacker, List<String>
3433
}
3534
DecodedTrace[] traces = new TraceV1[size];
3635
for (int i = 0; i < size; i++) {
37-
ValueType valueType = unpacker.getNextFormat().getValueType();
38-
if (valueType == ValueType.ARRAY) {
39-
// Legacy expectation: chunks field contains traces directly.
40-
traces[i] = unpack(unpacker, stringTable);
41-
} else if (valueType == ValueType.MAP) {
42-
// Current V1 payload: chunks field contains chunk maps, each with spans in field 4.
43-
traces[i] = unpackChunk(unpacker, stringTable);
44-
} else {
45-
throw new IllegalArgumentException(
46-
"Expected trace/chunk entry as ARRAY or MAP, got " + valueType);
47-
}
36+
traces[i] = unpackChunk(unpacker, stringTable);
4837
}
4938
return traces;
5039
} catch (Throwable t) {
@@ -56,17 +45,6 @@ public static DecodedTrace[] unpackTraces(MessageUnpacker unpacker, List<String>
5645
}
5746
}
5847

59-
/**
60-
* Unpacks a single trace (array of spans) from the unpacker.
61-
*
62-
* @param unpacker the message unpacker
63-
* @param stringTable the shared string table for streaming string decoding
64-
* @return the decoded trace
65-
*/
66-
public static TraceV1 unpack(MessageUnpacker unpacker, List<String> stringTable) {
67-
return new TraceV1(SpanV1.unpackSpans(unpacker, stringTable));
68-
}
69-
7048
private static TraceV1 unpackChunk(MessageUnpacker unpacker, List<String> stringTable)
7149
throws IOException {
7250
int fieldCount = unpacker.unpackMapHeader();
@@ -102,7 +80,7 @@ private static TraceV1 unpackChunk(MessageUnpacker unpacker, List<String> string
10280
}
10381
}
10482

105-
return new TraceV1(withChunkFields(spans, traceId, samplingPriority));
83+
return new TraceV1(withChunkFields(spans, traceId, samplingPriority), samplingPriority);
10684
}
10785

10886
private static long unpackTraceId(MessageUnpacker unpacker) throws IOException {
@@ -182,9 +160,11 @@ private static void skipAttributes(MessageUnpacker unpacker, List<String> string
182160
}
183161

184162
private final DecodedSpan[] spans;
163+
private final Integer chunkSamplingPriority;
185164

186-
private TraceV1(DecodedSpan[] spans) {
165+
private TraceV1(DecodedSpan[] spans, Integer chunkSamplingPriority) {
187166
this.spans = spans;
167+
this.chunkSamplingPriority = chunkSamplingPriority;
188168
}
189169

190170
@Override
@@ -194,4 +174,9 @@ public List<DecodedSpan> getSpans() {
194174
}
195175
return Collections.unmodifiableList(Arrays.asList(spans));
196176
}
177+
178+
@Override
179+
public Integer getSamplingPriority() {
180+
return chunkSamplingPriority;
181+
}
197182
}

0 commit comments

Comments
 (0)